当前位置:  开发笔记 > 编程语言 > 正文

没有的Spring AOP代理

如何解决《没有的SpringAOP代理》经验,为你挑选了1个好方法。

我有两个Spring代理设置:

  
    
        
    
    
        
            cacheInterceptor
        
    
   



 
        
        
            
                daoInterceptor
            
        

    

simpleBean工作正常 - springDao没有.

SpringDao类看起来像:

public class SpringDao extends JdbcDaoSupport {

private SimpleJdbcTemplate simpleJdbcTemplate;

public SimpleJdbcTemplate getSimpleJdbcTemplate() {

    if (simpleJdbcTemplate==null) {
        simpleJdbcTemplate= new SimpleJdbcTemplate(getDataSource());
    }
    return simpleJdbcTemplate;
}
    ...

我的单元测试自动装配如下:

@Autowired
@Qualifier("springDao")
protected SpringDao springDao;

并且第一个指示错误的是我收到此错误:

无法自动装配领域:...嵌套异常是java.lang.IllegalArgumentException

如果我注释掉@Qualifier注释并再次运行我的单元测试,我会得到:

没有类型的唯一bean ...期望的单个匹配bean但找到2:[springDaoTarget,springDao]

这就是我的预期.

所以我改变了我的自动装配

@Autowired
@Qualifier("springDaoTarget")
protected SpringCustomerCapacityDao springDao;

并在我的单元测试中添加了以下内容:

        Object proxy = applicationContext.getBean("springDao");

    Assert.assertNotNull(proxy);
    Assert.assertTrue(proxy instanceof SpringDao);

而且testof的测试失败了,对我而言,这意味着我的代理并不是我的代理.

所以我很困惑.这是怎么回事?我怎样才能解决这个问题?

编辑 这里是请求的springDaoTarget定义,它将令许多人失望:




1> cliff.meyers..:

如果代理的目标实现至少一个接口,那么Spring的默认行为是创建一个实现目标所有接口的JDK代理.这意味着它不会是目标类的子类.您可以通过强制创建CGLIB代理来覆盖它,而CGLIB代理是目标的动态子类.

作为一般规则,如果您打算使用AOP但仅以有限的方式使用接口,则需要强制使用CGLIB.否则,您的容器中将有许多JDK代理,这些代理的类型与您加载的bean实现的类型不同.

请参阅Cliff Meyers博客:Spring AOP:CGLIB或JDK Dynamic Proxies?

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有