SpringAOP指向プログラミング(アスペクト指向プログラミング)
AOP効果:
プロジェクトのデモ:
コード:
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AppConfig {
@Pointcut("execution(* com.spring.demo.service.*.*(..))")
public void businessService() {}
@Before(value = "businessService()")
public void doBefore() {
System.out.println("----------------- doBefore -----------------");
}
@AfterReturning(value = "businessService()")
public void doAfterReturning() {
System.out.println("----------------- doAfterReturning -----------------");
}
@After(value = "businessService()")
public void doAfter() {
System.out.println("----------------- doAfter -----------------");
}
}
import com.spring.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description:
* @author: yz
* @create: 2019/5/27 15:33
*/
@RestController
public class TestController {
@Autowired
UserService userService;
@RequestMapping("/test")
public String test(){
return userService.query();
}
}
public interface UserService {
String query();
}
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public String query() {
System.out.println("------------ yz ------------");
return "------------ yz ------------";
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
要求URL:HTTP:// localhostを:8080 /テスト
ソースコードのデバッグ、注釈モードを使用して、mainメソッドを記述します。
import com.spring.demo.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* @description:
* @author: yz
* @create: 2019/5/27 15:23
*/
@ComponentScan("com.spring.demo")
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Main.class);
UserService userService = applicationContext.getBean(UserService.class);
// UserService userService = (UserService) applicationContext.getBean("userService");
userService.query();
}
}
ブレークポイントは、サービスオブジェクトは、プロキシ量Aop CGLIBオブジェクト、AOPプロキシサービス後の情報を印刷するための主な方法を完了している取得することが見つかりました:
また、第二工程で発生する可能性があり、第一段階で発生する可能性が高い時間である作用、すなわち、第2の工程で発生したと仮定すると、この時間は、ブレークポイントは、getBeanトラックを打ちます。
SingletonObjectsは、マップを見つけました
そこsingletonObjectsは、その後、そこに置かれますので、この時間は、エントリポイントを見つけるためにthis.singletonObjects.put
UserServiceのAOP剤である特定のA方式で、トラブルシューティングJVM実行時スタックを使用して2検索方法。
注:この時点で、UserServiceのUserServiceの= applicationContext.getBean(UserService.class)に行われていません。
最初のステップで作成したスプリングAOPプロキシプロキシオブジェクトが実行されます。
ApplicationContextのApplicationContextの=新しいAnnotationConfigApplicationContext(Main.class)。
これはラムダ式で、ブレークポイントgetSingleton方法のdoGetBean、プラス条件付きブレークポイントにヒットします
再実行は、getSingleton方法を入力します。
したがって春AOPのソースコードデバッグ。
春量Aop公式サイト情報:
https://docs.spring.io/spring/docs/5.2.0.BUILD-SNAPSHOT/spring-framework-reference/core.html#aop
其他资料:https://blog.csdn.net/u010890358/article/details/80640433