Spring之AOP注解方式

注解实现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配置中的
*方法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;
}*/

}

注:要实现排序,可以多写几个增强类,这里不再重复写增强类了

你可能感兴趣的:(Spring)