初学spring,对spring内部中类转换的疑惑。-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

初学spring,对spring内部中类转换的疑惑。

2016-03-13 13:44:50 2064 1

在学习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();
    }
 
}
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:02:29

    总结一下,是不是因为spring内部也是使用的jdk的动态代理,而其中proxy是使用的class.getInterfaces()方法获取的对象方法,所以在使用ApplicationContext.getBean(“bean”)方法时都是返回的对象的接口,然后再通过转型来获得bean所指定的对象实例。

    0 0
相关问答

1

回答

Spring Boot提供了更简单的注解对吗?

2021-11-18 22:09:26 157浏览量 回答数 1

1

回答

Spring Boot 可以兼容老 Spring 项目吗?

2021-11-03 00:09:39 331浏览量 回答数 1

1

回答

Spring Boot 的核心注解由哪几个注解组成的?

2021-10-24 16:26:22 281浏览量 回答数 1

1

回答

Spring Boot 默认配置文件是什么?

2021-10-21 22:12:27 245浏览量 回答数 1

1

回答

如何打包 Spring Boot 项目?

2021-10-21 21:50:02 174浏览量 回答数 1

1

回答

Spring Boot 的核心注解是哪个?

2021-10-21 22:19:31 112浏览量 回答数 1

1

回答

spring boot启动报错org.springframework.beans?400报错

2020-06-06 15:38:17 897浏览量 回答数 1

1

回答

关于Spring Boot的注解@Mapper和@MapperScan?报错

2020-06-05 14:59:29 1638浏览量 回答数 1

1

回答

Spring Boot 的配置文件有哪几种格式?它们有什么区别?

2019-11-18 15:02:40 1381浏览量 回答数 1

2

回答

Spring Boot 启动zuul的时候是不是必须要使用到eureka?

2019-06-24 13:11:50 4143浏览量 回答数 2
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载