AOP面向切面编程,相比于面向对象,可以进一步消除公共的代码逻辑,向原有的各业务中加入公共切面的逻辑功能称之为增强.
通过面向切面模式,将公共逻辑增强给各个业务模块,可以不改变原有业务模块的代码,只通过外部配置来实现
增强可以分为前置增强,后置增强,环绕增强,异常抛出增强等
- 首先要在beans中加入AOP命名空间,并导入相关jar包
- 编写增强类
//@Aspect
public class Log4j {
//@Before(value="execution(* entity.*.*(..))")
public void before(JoinPoint jp){
System.out.println("经过前置方法!!!");
System.out.println("类名:"+jp.getThis()+"方法:"+jp.getSignature().getName()+"参数:"+Arrays.toString(jp.getArgs()));
System.out.println("================================================");
}
//@AfterReturning(pointcut="execution(* entity.*.*(..))",returning="obj")
public void after(JoinPoint jp,Object obj){
System.out.println("经过后置方法");
System.out.println("类名:"+jp.getThis()+"方法:"+jp.getSignature().getName()+"参数:"+Arrays.toString(jp.getArgs())+"返回值:"+obj);
System.out.println("================================================");
}
//@AfterThrowing(pointcut="execution(* entity.*.*(..))",throwing="ex")
public void thro (Exception ex){
System.out.println("经过异常处理方法");
try {
} catch (Exception e) {
ex.initCause(e);
}
System.out.println("异常:"+ex);
System.out.println("================================================");
}
//@Around(value="execution(* entity.*.*(..))")
public Object around(ProceedingJoinPoint jp){
System.out.println("经过环绕前置方法!!!");
// System.out.println("类名:"+jp.getThis()+"方法:"+jp.getSignature().getName()+"参数:"+Arrays.toString(jp.getArgs()));
System.out.println("================================================");
try {
Object obj=jp.proceed();
System.out.println("经过环绕后置方法");
// System.out.println("类名:"+jp.getThis()+"方法:"+jp.getSignature().getName()+"参数:"+Arrays.toString(jp.getArgs())+"返回值:"+obj);
System.out.println("================================================");
return obj;
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
- 配置xml文件,如果只用注解则在Spring配置的xml中添加
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
将增强类配置到Spring容器中
<bean name="Log4j" class="aop.Log4j" ></bean>
<aop:config>
<aop:aspect ref="Log4j">
<!--编写切入点,*为通配符,第一个*为返回值类型,第二个*为包下的某个类,第三个*表示类中的某个方法 (..)中..表示参数任意-->
<aop:pointcut expression="execution(* entity.*.*(..))" id="pt"></aop:pointcut>
<!--前置增强-->
<aop:before method="before" pointcut-ref="pt"></aop:before>
<!--后置增强-->
<aop:after-returning method="after" pointcut-ref="pt" returning="obj"></aop:after-returning>
<!--异常抛出增强,此增强只能记录出现的异常不能处理异常-->
<aop:after-throwing method="thro" pointcut-ref="pt" throwing="ex"/>
<!--环绕增强-->
<aop:around method="around" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>