标题ProxyFactoryBean
获取的ProxyFactoryBean不是那个ProxyFactoryBean而是它所代理的内容。
AspectJ
确保AspectJ的aspectJweaver.jar库包含在应用程序的classpath中
对AspectJ的支持有两种方式,xml和Java注解
@Configuration
@EnableAspectJAutoProxy
public class AppConfig{
}
@AspectJ切面使用@Aspect注解配置
用@Aspect注解的类可以有方法和字段,他们也可能包括切入点(pointcut),通知(advice)和引入(introduction)声明
@Aspect注解是不能够通过类路径自动检测发现的,所以需要配合使用@Component注释或者在xml配置bean
一个雷的@Aspect会使它成为一个切面,并且将自己从自动代理中排除。
<context:component-scan base-package="com.imoocaop.aspectj"/>
pointcut
一个切入点通过一个普通的方法来提供,并且使用@pointcut注解,方法返回类型必须为void。before Advice
@Component//这个类能够被Bean识别
@Aspect
public class MoocAspect{
@Before("execution(*com.imooc.aop.aspectj.biz.*Biz.*(..))")
public void before(){
}
}
- after returning advice
@AfterReturning(pointcut="execution(*com.imooc.aop.aspectj.biz.*Biz.*(..))",returning="returnValue")
public void afterReturning(Object returnValue){
System.out.println("afterReturning:"+returnValue);
}
- after Throwing advice,可以在@AfterThrowing()括号内部添加Throwing属性,把错误捕获进来,方便进一步的处理。
- after(finally)advice常用来释放资源,无论发生异常与否都将执行。
- 环绕通知,用@Around进行注解,通知内部的第一个参数必须是ProceedingJoinPoint类型,在通知内部调用ProceedingJoinPoint的proceed()方法会执行真正的方法。
给Advice传入参数
@Before("pointcut()&&args(arg)")
public void beforeWithParam(String arg){
System.out.println("before");
}