在学习spring的AOP时,对一个问题没搞清楚。
UserImpl.java
public class UserDAOImpl implements UserDAO {
public void saveUser(){
System.out.println("user saved ...");
}
}
UserService.java
public class UserService {
private UserDAO userDAO ;
public void add(){
userDAO.saveUser();
}
public void setUserDAO(UserDAO userDAO){
this.userDAO = userDAO;
}
public UserDAO getUserDAO(){
return this.userDAO;
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="user" class="org.ben.dao.impl.UserDAOImpl">
</bean>
<bean id="userService" class="org.ben.service.UserService">
<property name="userDAO" ref="user"/>
</bean>
<bean id="log" class="org.ben.aop.LogInterceptor"></bean>
<aop:config>
<!-- <aop:pointcut expression="execution(public * org.ben..*.save*(..))" id="savePointcut"/> -->
<aop:pointcut expression="execution(public * org.ben.dao.impl.UserDAOImpl.saveUser())" id="savePointcut"/>
<aop:aspect id="logAspect" ref="log">
<aop:before method="before" pointcut-ref="savePointcut"/>
<aop:after method="after" pointcut-ref="savePointcut"/>
</aop:aspect>
</aop:config>
</beans>
UserServiceTest.java
public class UserServiceTest {
<a href="http://my.oschina.net/azibug" class="referer" target="_blank">@Test</a> public void testAdd() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService) ctx.getBean("userService");
service.add();
}
<a href="http://my.oschina.net/azibug" class="referer" target="_blank">@Test</a> public void testSave(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserDAOImpl userDAO = (UserDAOImpl)ctx.getBean("user");//为什么在这里使用UserDAOImpl来获取bean的时候,会报java.lang.ClassCastException: $Proxy4 cannot be cast to org.ben.dao.impl.UserDAOImpl这个异常?按我理解,既然spring内部采用的是动态代理,而且我这个bean也实现了接口,为什么还是无法转换类型呢?
//翻了一下书,在里面对spring的讲解时都没有提到对bean有什么特别的要求。
userDAO.saveUser();
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
总结一下,是不是因为spring内部也是使用的jdk的动态代理,而其中proxy是使用的class.getInterfaces()方法获取的对象方法,所以在使用ApplicationContext.getBean(“bean”)方法时都是返回的对象的接口,然后再通过转型来获得bean所指定的对象实例。