首页 > 其他 > 详细

AOP

时间:2019-07-13 00:16:04      阅读:93      评论:0      收藏:0      [点我收藏+]
1、spring aop有两种配置方式:基于xml配置、基于注解配置,下面是基于xml的配置用法。
applicationContext.xml中:
<bean id="helloWorldServiceImpl" class="com.service.helloWorldServiceImpl" />
<bean id="transactionDemo" class="com.dao.transactionDemo" />
<aop:config>
<aop:aspect ref = "transactionDemo">
<aop:pointcut expression="execution(* com.service.*.*(..))" id="p1" />
<aop:before method="beforeAdvice" pointcut-ref="p1" />
<aop:around method="aroundAdvice" pointcut-ref="p1"/>
<aop:after-returning method="returnAdvice" pointcut-ref="p1"/>
<aop:after method="afterAdvice" pointcut-ref="helloWorldServicePointcut" />
</aop:aspect>
</aop:config>
 
 
com.dao.transactionDemo类中:
package com.dao;
import org.aspectj.lang.ProceedingJoinPoint;
public class HelloWorldServiceImpl {
//执行顺序1:前置通知
public void beforeAdvice(){
System.out.println("前置通知");
}
//执行顺序2:环绕通知
public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("开始环绕通知");
joinPoint.proceed();//被执行的方法s()会在此处运行
System.out.println("结束环绕通知");
}
//执行顺序3:返回通知
public void returnAdvice(String result) {
//被执行方法sayHelloWorld()若有String返回值,则在此处可以得到并输出,故此处
//将输出"Hello World";若无返回值,则什么也不输出
System.out.println("返回通知的结果为:" + result);
}
//执行顺序4:后置通知
public void afterAdvice(){
System.out.println("后置通知");
}
}
 
com.service.helloWorldServiceImpl类中:
public class HelloWorldServiceImpl{ public String sayHelloWorld() { System.out.println("sayHelloWorld的方法主体");
String s="Hello World"; return s; } }
 
main函数执行主体:
ApplicationContext applicationContext
= new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorldServiceImpl helloWorldServiceImpl= applicationContext.getBean("helloWorldServiceImpl");
helloWorldServiceImpl.sayHelloWorld();
 
main函数执行后输出结果:(正常)
开始环绕通知
前置通知
sayHelloWorld的方法主体
结束环绕通知
后置通知
返回通知的结果为:Hello World
(如果main中sayHelloWorld的方法主体抛出异常,则执行顺序:
开始环绕通知
前置通知
sayHelloWorld的方法主体
后置通知
返回通知的结果为:Hello World
 
上面的第二、三行均在环绕通知aroundAdvice()中输出
2、基于注解的配置用法
切面类:
@Component
@Aspect
public class TransactionDemo {
/*表达式execution(* com.hand.core.service.*.*.*(..)),第一个*表示任何返回值,com.hand.core.service.*.*.*代表com.hand.core.service包下的任何子包下的任何类的任何方法,(..)代表方法中的任何参数
*/
@Pointcut(value="execution(* com.hand.core.service.*.*.*(..))")
public void point(){
}
@Before(value="point()")
public void before(){
System.out.println("transaction before");
}
@After(value="point()")
public void after(){
System.out.println("transaction After");
}
@AfterReturning(value = "point()") //返回通知
public void afterReturning(){
System.out.println("transaction AfterReturning");
}
@Around("point()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("transaction begin");
joinPoint.proceed();
System.out.println("transaction commit");
}
}
 
被切面类:
package com.hand.core.service.impl;、
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void addUser(User user) {
System.out.println("添加成功");
}
}
配置bean:
<bean id = "transactionDemo" class = "com.hand.core.transaction.TransactionDemo" />
<aop:aspectj-autoproxy />
测试代码:(main函数执行主体
User user = new User();
userService.addUser(user);
main函数执行后输出结果:
transaction begin
transaction before
添加成功
transaction commit
transaction After
transaction AfterReturning
 
 
3、执行顺序图解
技术分享图片
技术分享图片

AOP

原文:https://www.cnblogs.com/afei1759/p/11178835.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!