初学aop接口
package com.ysy.aspect.xml;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ysy.cglib.UserDao;
public class TestXmlAspect {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String xmlpath="com/ysy/aspect/xml/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
//从spring容器中获得内容
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.adduser();
}
}
报错:
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to com.ysy.cglib.UserDao at com.ysy.aspect.xml.TestXmlAspect.main(TestXmlAspect.java:15)
Spring AOP实现方式有两种,一种使用JDK动态代理,另一种通过CGLIB来为目标对象创建代理。如果被代理的目标实现了至少一个接口,则会使用JDK动态代理,所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理,创建的代理类是目标类的子类。
我是通过 JDK动态代理来实现AOP的。但是我的CGLIB类的类名和JDK接口名相同,所以在引包的时候默认选择了cglib类导致出错。
改成
com.ysy.jdk.UserDao userDao=(com.ysy.jdk.UserDao)applicationContext.getBean("userDao");
就好了
一个不小心,查了好久的报错哈哈。记录一下自己犯傻~