注意:使用AOP需要额外的导入3个包。
1.使用spring,需要设置schema--->需要有如下的schema
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemeLocation="http://www.springframework.org.schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
2.打开基于Annotation的AOP
<aop:aspectj-autoproxy/>
3.创建一个AOP的关注点(创建一个类,名为LogAspect),这就是我们的切面,切面是做什么的,就是把我们关注的问题拿出来,做一个模块
里面的方法logStart()、logEnd()、logAround()都是advice(或者叫通知)。通知有三种注解,@Before、@After、@Around
@Before:我们在下面示例中的logStart()方法前面加上了该注解,并用execution表达式在那些类的那些方法执行之前调用执行logStart()方法。
我们为logStart()方法加入了一个参数JoinPoint jp,该参数是被自动传入的。我们可以通过该参数获得,是哪个类在执行,哪个方法在执行。
@After:我们在下面示例中的logStart()方法前面加上了该注解,并用execution表达式在那些类的那些方法执行之后调用执行logEnd()方法。
@Around:我们在下面示例中的logStart()方法前面加上了该注解,并用execution表达式在那些类的那些方法执行过程中调用执行logAround()方法。
我们为logAround()方法传入了一个参数ProceedingJoinPoint pjp,该参数也是被自动传入的。我们可以通过这个参数,来控制实际方法的执行。
//LogAspect类叫做切面 @Component("logAspect")//让这个切面类被Spring所管理 @Aspect//声明这个类是一个切面类 public class LogAspect{ //logStart叫做通知 /** *第一个*表示任意返回值(后面有一个空格) *第二个*表示org.zttc.itat.spring.dao包中的所有类 *第三个*表示以add开头的所有方法 *(..)表示任意参数 @Before("execution(* org.zttc.itat.spring.dao.*.add*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.delete*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.update*(..))") public void logStart(JoinPoint jp){ //得到执行的对象 System.out.println(jp.getTarget()); //得到执行的对象 System.out.println(jp.getSignature().getName()); Logger.info("加入日志"); } @After("execution(* org.zttc.itat.spring.dao.*.add*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.delete*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.update*(..))") public void logEnd(JoinPoint jp){ Logger.info("方法调用结束加入日志"); } @Around("execution(* org.zttc.itat.spring.dao.*.add*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.delete*(..))||"+ "execution(* org.zttc.itat.spring.dao.*.update*(..))") public void logAround(ProceedingJoinPoint pjp){ Logger.info("开始在around中加入日志"); //让程序执行 pjp.proceed(); Logger.info("结束around"); } }