Spring面向切面编程AOP
程序员文章站
2022-07-12 14:10:53
...
感谢zejian_大佬的分享:
关于 Spring AOP (AspectJ) 你该知晓的一切
大佬的分享让我受益匪浅!
首先学习AOP前,弄清楚为什么要使用AOP?
AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。——
取自百度百科
举个栗子有助于理解(一个支付转账的小栗子):
我们每次使用手机支付时,不管转账还是支付都需要验证支付信息密码。
这时AOP的好处就体现出来了,我们可以将验证支付这部分内容分离出来,然后告诉Spring,你计划将它放在何处,什么时候使用它。
下面Spring总结知识
spring切面可以应用的五种通知:
前置通知(Before):在目标方法被调用之前调用通知功能;
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
返回通知(After-returning):在目标方法成功执行之后调用通知 ,可以获取方法返回值;
异常通知(After-throwing):在目标方法抛出异常后调用通知;
环绕通知(Around):通知报过了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
- 写一个类,我想在调用test方法前,做一点其它事情:
`public class AopBean {
public int i;
public int test() {
System.out.println("AopBean-->test");
return 0;
}
public int test1() {
System.out.println("AopBean-->test");
return i;
}
}
xml文件:
<bean id="aopAspect" class="aop.AopAspect"></bean>
<bean id="aopBean" class="aop.AopBean"></bean>
<aop:config>
<aop:aspect ref="aopAspect">
<!--<aop:pointcut id="aop" expression="execution(* aop.AopBean.*(..))"></aop:pointcut>-->
<aop:pointcut id="aop" expression="execution(* aop.AopBean.*(..))"></aop:pointcut>//设置一个切入点
<aop:before method="before" pointcut-ref="aop"></aop:before>
<aop:after method="doAfter" pointcut-ref="aop"></aop:after>
<aop:after-returning method="doAfterReturning" pointcut-ref="aop" returning="returnVal"></aop:after-returning>
<aop:after-throwing method="doAfterThrowing" pointcut-ref="aop"></aop:after-throwing>
</aop:aspect>
</aop:config>
切面类及切面方法:
public class AopAspect {
public void before() {
System.out.println("AopAspect--->before");
}
public void doAfter(){
System.out.println("执行了after");
}
public void doAfterReturning(Object returnVal){
System.out.println("方法结束调用可以获取返回值"+returnVal);
}
public void doAfterThrowing(){
System.out.println("抛出异常时调用");
}
}
测试代码:
@Test
public void test1() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("Spring-aop.xml");
AopBean bean=(AopBean) ctx.getBean("aopBean");
bean.test();
System.out.println("-----------------------------------");
bean.test1()
}
}
下一篇: Spring AOP面向切面编程