SomeBusiness.java
package com.springl.aop;
public class SomeBusiness {
public void dealSomeBusiness(Long userId){
System.out.println("userId"+userId+"--access------>SomeBusiness------>dealSomeBusiness");
}
}
LogAspect.java
package com.springl.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import java.util.Arrays;
@Aspect
public class LogAspect {
@Pointcut("execution(public void com.springl.aop.SomeBusiness.dealSomeBusiness(..))")
public void point(){};
@Before(value = "point()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println("@Before------>"+joinPoint.getSignature().getName()+"------>params:{"+ Arrays.asList(args)+"}");
}
@After(value = "point()")
public void logEnd(JoinPoint joinPoint){
System.out.println("@After------>"+joinPoint.getSignature().getName());
}
//JoinPoint一定要出现在参数表的第一位
@AfterReturning(value="point()",returning = "result")
public void logReturn(JoinPoint joinPoint,Object result){
System.out.println("@AfterReturning"+joinPoint.getSignature().getName()+"------>result:{"+result+"}");
}
}
AopTestConfig.java
package com.springl.aop;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@Configuration
public class AopTestConfig {
@Bean
public SomeBusiness someBusiness(){
return new SomeBusiness();
}
@Bean
LogAspect logAspect(){
return new LogAspect();
}
}
AopTest.java
package com.springl.test;
import com.springl.aop.AopTestConfig;
import com.springl.aop.SomeBusiness;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AopTest {
@Test
public void testBean(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopTestConfig.class);
SomeBusiness someBusiness = applicationContext.getBean(SomeBusiness.class);
someBusiness.dealSomeBusiness(10L);
applicationContext.close();
}
}
运行结果
@Before------>dealSomeBusiness------>params:{[10]}
userId10--access------>SomeBusiness------>dealSomeBusiness
@After------>dealSomeBusiness
@AfterReturningdealSomeBusiness------>result:{null}
直接看SomeBusiness对象的创建,在AbstractAutowireCapableBeanFactory.doCreateBean()方法打断点
上图中可以发现,此时的bean依旧是SomeBusiness类的对象。然后继续debug
直到执行过exposedObject = initializeBean(beanName, exposedObject, mbd);之后。exposedObject变成了一个代理类
这样的话就要看下initializeBean()了,之前讲过:initializeBean()执行BeanPostProcessor中的两个方法以及init方法。
通过debug发现是在执行BeanPostProcessor.postProcessAfterInitialization()之后变成代理类的对象。
在上图中,也可以看到是AnnotationAwareAspectJAutoProxyCreator来作代理对象创建工作的