AOP编程的流程和错误

spring 切面织入报错:java.lang.ClassCastException: com.sun.proxy.$Proxy7 cannot be cast to...

AOP编程主要思想是结合了动态代理的思想,现在的java社区中最主流最完整的AOP框架是AspectJ
基于注解的方式主要流程:
1、添加jar包
2、把一个类申明为切面:需要把该类方法哦IOC容器中,再声明成一个切面。
即在类前面加入@Componet @Aspect
3、声明切面中的各种通知(方法)为前置(以前置为例),在方法前面加@Before(“execution(aspectJ切入表达式)”)
4、在xml文件中加入<aop:aspcej-autoproxy></aop:aspcej-autoproxy>
5、可以在通知方法中的参数中如(public void beforeMethod(JoinPoint joinpoint))申明一个类型为JoinPoint的参数,就可以访问链接细节,如方法的名称和参数值

@Aspect
@Component
public class Logging {
@Before("execution(* pro6asp.Arithmetic.*(int, int))")
public void beforeMethod(JoinPoint joinpoint){
String methodName=joinpoint.getSignature().getName();
List<Object> args= Arrays.asList(joinpoint.getArgs());
System.out.println("hello world!"+methodName+"  "+args);
}
}
6、前置通知、异常通知、返回通知、后置通知的顺序和下面的一个aop动态代理的核心比较相似
//调用目标方法
Object result = null;
try {
//前置通知
result = method.invoke(target, args);
//返回通知, 可以访问到方法的返回值
} catch (NullPointerException e) {
e.printStackTrace();
//异常通知, 可以访问到方法出现的异常
}
//后置通知. 因为方法可以能会出异常, 所以访问不到方法的返回值
7、多个横切关注点时可以指定切面的优先级@Order(1),值越小,优先级越高
8、可以定义一个方法,用于申明切入点表达式,一般的,改方法不需要加入其它代码。
@Pointcut("execution(public int pro6asp1.Arithmetic.*(..))")
public void PointCut(){
}
@Before("PointCut()")
public void BeforeMethod(JoinPoint joinPoint){
String methodName=joinPoint.getSignature().getName();
System.out.println("before"+methodName+" "+Arrays.asList(joinPoint.getArgs()));
}

注意点:
1、@Before("execution(* pro6asp.Arithmetic.*(int, int))"),AspectJ表达式要写对,指向的是接口的方法.Arithmetic
2、main方法中,也要用父类接口来定义
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicatinContext.xml");
Arithmetic at=(Arithmetic) ac.getBean("arithmethicImpl");
int result=at.add(1, 7);
System.out.println(result);

}

转载:http://blog.163.com/mr_wang_xin/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值