注解实现AOP:
1.启用aspectj支持
2.在切面类加入@Component 、@Aspect
3.配置切入点表达式
4.加入增强的方法,注意:环绕增强的方法中一定要加入ProceedingJoinPoint参数
5.切面优先级用切面类实现接口 implements Ordered{} 或 @Ordered注解
代码实现:
dao层 ,注解用 @Repository
@Repository // dao层
public class UserDaoImpl implements UserDao {
public void add(String name) {
System.out.println(name + “添加成功…”);
}
public int update() {
System.out.println(“用户更新成功…”);
return 1;
}
}
service层 ,注解用 @Service
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void add(String name) {
userDao.add(name);
}
public int update() {
//int i = 10/0;
return userDao.update();
}
}
增强类
@Component
@Aspect
@Order(6)
public class AdviceClass /implements Ordered/{
/*
*配置切入点
相当于xml配置中的<aop:pointcut expression="execution(public * com.gk.service.UserServiceImpl.(…))" id=“point”/>
*方法p()相当于xml配置中的 id
/
@Pointcut("execution(public * com.gk.service.UserServiceImpl.(…))")
public void p(){
}
@Before("p()")
public void before(JoinPoint jp) { // 参数即连接点
System.out.println("前置增强...0");
// 获取目标方法名称
System.out.println("目标方法名称" + jp.getSignature().getName());
// 获取目标方法的参数列表
Object[] args = jp.getArgs();
if (args != null) {
for (Object object : args) {
System.out.println("目标方法参数:" + object);
}
}
// 获取目标方法对象
UserService target = (UserService) jp.getTarget();
}
/**
* 后置增强,可以拿目标方法返回值,如果目标方法报异常,后置增强不会执行
*/
@AfterReturning(value="p()", returning="result")
public void afterReturning(JoinPoint jp,Object result) {
System.out.println("后置增强... 目标方法的返回值:" + result);
}
/**
* 最终增强,如果目标方法报异常,最终增强会执行
*/
@After("p()")
public void after(JoinPoint jp) {
System.out.println("最终增强...");
}
/**
* 环绕增强 : 相当于,前置和后置增强的综合体,同时它还可以截取目标方法的返回值,对目标方法返回值进行修改
* @return
* @throws Throwable
*/
@Around("p()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前置...");
Object proceed = pjp.proceed(); // 调用目标方法
System.out.println("环绕后置...");
return proceed;
}
/**
* 异常增强 : 目标方法报异常时才会执行
* @param jp
* @param e
*/
@AfterThrowing(value="p()", throwing="e")
public void exception(JoinPoint jp, Exception e) {
System.out.println("异常信息" + jp.getTarget().getClass() + "类的" + jp.getSignature().getName() +"方法报了一个" + e.getMessage() + "异常");
}
/*public int getOrder() { // 实现了Ordered接口,这是优先级的方法
return 2;
}*/
}
注:要实现排序,可以多写几个增强类,这里不再重复写增强类了