最近重温研究下spring,根据源码画成流程图作为总结。因spring源码中各种判断语句各种神操作,所以我主要按照主流程总结画 的图,细节大多省略,目的是能掌握理解springAOP代理类的创建过程(普通Bean创建也是按照这种方式大同小异),以及aop生成代理类执行目标方法时中间所需要的增强器调用过程。其实从图里也大致能明白bean创建的生命周期了。下面流程图针对的是单例的bean。
AOP代理类的创建:
目标方法执行切面过程:
贴出我在跟源码时的代码例子:
//业务bean:
@Component
public class MyAopBean {
public int demo(int x,int y){
return x/y;
}
}
//测试类
@Test
public void test() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AopBeanConfig.class);
MyAopBean myAopBean = (MyAopBean) ctx.getBean("myAopBean");
myAopBean.demo(4, 2);
ctx.close();
}
//AOP
@Aspect
public class LogAop {
@Pointcut("execution(public int com.spring.bean.MyAopBean.*(..))")
public void ponitCut(){}
@Before(value = "ponitCut()")
public void logBefore(JoinPoint joinPonit){
System.out.println("@Before..."+joinPonit.getSignature().getName()+"..."+joinPonit.getArgs());
}
@After(value = "ponitCut()")
public void logAfter(JoinPoint joinPonit){
System.out.println("@After..."+joinPonit.getSignature().getName()+"..."+joinPonit.getArgs());
}
@AfterReturning(value = "ponitCut()",returning="result")
public void logReturning(Object result){
System.out.println("@AfterReturning..."+result);
}
@AfterThrowing(value = "ponitCut()",throwing="exception")
public void logThrowing(Exception exception){
System.out.println("@AfterThrowing..."+exception);
}
}
//注解配置类
@Configuration
@EnableAspectJAutoProxy
public class AopBeanConfig {
@Bean
public MyAopBean myAopBean(){
return new MyAopBean();
}
@Bean
public LogAop logAop(){
return new LogAop();
}
}
spring的流程太多了,上面这2图只是一个简单主流程。个人觉得最好亲自去跟跟源码。边跟源码边画这2图真不容易。。。还好坚持画完了虽然有点难看,如有错误,恳请指点。