|
通过xml配置aop太过繁琐,如果有大量的目标对象都要生成代理对象,那么我们上面的配置要重复配置很多份,
于是aopalliance 中出现了-一种AspectJ技术,具有以下两个特点:
1)通过注解配置切点(哪个方法需要被入侵)和通知(黑客)
2)自动生产代理对象
AspectJ介绍
AspectJ是一个面向切面的框架, 它扩展了Java语言。AspectJ定 义了AOP语法所以它有一个
专门的编译器用来生成遵守Java字节编码规范的Class文件。
AspectJ是一个基 于Java语言的AOP框架
Spring2 0以后新增了对AspectJ切点表达式支持
@AspectJ是AspectJ1 5新增功能,通过JDK5注解技术, 允许直接在Bean类中定义切面
新版本Spring框架,建议使用AspectJ方式来开发AOP
@Component
@Aspect //通过注解定义切面 == 切点(目标方法) + 通知(黑客)
public class AppAspect {
//切点 * 任何访问修饰符 .. 任意参数
//对com.xmx.dao.impl.UserDaoImpl.add方法进行增强
@Pointcut("execution(* com.xmx.dao.impl.UserDaoImpl.add(..))")
public void pointCutAdd(){
}
@Pointcut("execution(* com.xmx.dao..*(..))")
public void pointPage(){
}
//通知
//前置通知/增强
@Before("pointCutAdd()")
public void before(JoinPoint joinPoint){
System.out.println("鉴权"+ Arrays.toString(joinPoint.getArgs()));
}
@Around("pointCutAdd()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
Object[] args=pjp.getArgs();
args[0]=100;
args[1]=2;
Object retVal=pjp.proceed(args);
System.out.println("方法的返回值为:"+retVal);
return retVal;
}
@After("pointCutAdd()")
public void after(JoinPoint joinPoint){
System.out.println("最终通知");
}
@AfterReturning(value = "pointCutAdd()",returning = "result")
public void afterreturning(JoinPoint joinPoint,Object result){
System.out.println("后置通知执行了...,方法的返回值为:"+result);
}
|
|