<强> spring aop通知(建议)分成五类:,强>
前置通知[之前建议]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常只
正常返回通知[回国后建议]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行只
异常返回通知[投掷后建议]:在连接点抛出异常后执行只
返回通知[(最后)后建议]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容只
环绕通知[Around通知]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。
环绕通知还需要负责决定是继续处理连接点(调用ProceedingJoinPoint的处理方法)还是中断执行只
接下来通过编写示例程序来测试一下五种通知类型:
定义接口
包com.chenqa.springaop.example.service; 公共接口BankService {/* * *模拟的银行转账 从出* @param账人 * @param入账人 * @param帐户转账金额 * @return */公共布尔转移(字符串形式、字符串、双账户); }
编写实现类
包com.chenqa.springaop.example.service.impl; 进口com.chenqa.springaop.example.service.BankService; 公共类BCMBankServiceImpl实现BankService { 公共布尔转移(字符串形式、字符串、双账户){ 如果(account<100) { 把新IllegalArgumentException(“最低转账金额不能低于100元”); } System.out.println(形式+”向“+ +”交行账户转账”+账户+ "元"); 返回错误; } }
修改弹簧配置文件,添加以下内容:
& lt; !——bankService bean比; & lt; bean id=癰ankService”类=癱om.chenqa.springaop.example.service.impl.BCMBankServiceImpl”/比; & lt; !——切面——比; & lt; bean id=癿yAspect”类=癱om.chenqa.springaop.example.aspect.MyAspect”/比; & lt; !——aop配置——比; & lt; aop: config> ref=& lt; aop:方面“myAspect”比; & lt; aop:切入点表达式="执行(* com.chenqa.springaop.example.service.impl。* . * (. .)) " id=扒腥氲恪?比; & lt; aop:方法=爸啊敝皃ointcut-ref=扒腥氲恪?比; 方法后& lt; aop:="后" pointcut-ref=扒腥氲恪?比; & lt; aop:回国后方法=" afterReturning " pointcut-ref=扒腥氲恪?比; & lt; aop:投掷方法=" afterThrowing " pointcut-ref=扒腥氲恪?比; & lt; aop:在方法="在" pointcut-ref=扒腥氲恪?比; & lt;/aop: aspect> & lt;/aop: config>
编写测试程序
ApplicationContext上下文=new ClassPathXmlApplicationContext (“spring-aop.xml”); BankService BankService=上下文。getBean (“bankService BankService.class); bankService。转移(“张三”、“李四”,200年),>之前执行后输出:,
包装测试; 进口org.aspectj.lang.annotation.Pointcut; 公开课的切入点{ @Pointcut (value=" https://www.yisu.com/zixun/within(测试。*)”) 公共空间aopDemo () { } }
<强>添加方面类强>
该类中的建议将会用到上面的切入点,使用方法请看各个建议的价值属性。
包装测试; 进口org.aspectj.lang.JoinPoint; 进口org.aspectj.lang.ProceedingJoinPoint; 进口org.aspectj.lang.annotation。*; 进口org.springframework.stereotype.Component; @ component @Aspect 公开课Aspect1 { @Before(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”) 公共空间(连接点的连接点之前){ system . out。println (“[Aspect1]建议”); } @Around(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”) 周围的公共空间(ProceedingJoinPoint pjp)抛出Throwable { system . out。println (“[Aspect1]建议1 "); pjp.proceed (); system . out。println (“[Aspect1] advise2”); } @AfterReturning(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”) 公共空afterReturning(连接点的连接点){ system . out。println (“Aspect1 afterReturning建议”); } @AfterThrowing(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”) 公共空afterThrowing(连接点的连接点){ system . out。println (“Aspect1 afterThrowing建议”); } @After(值=" https://www.yisu.com/zixun/test.PointCuts.aopDemo ()”) 公共无效后(连接点的连接点){ system . out。println(“建议后[Aspect1]”); } }浅谈spring aop的五种通知类型