结论:不要在@Configuration类中的@Bean中直接注入需要成为代理对象的对象
问题分析
我们都知道Spring的事务控制是使用AOP实现的,所以@Autowired注入的对象必须是一个代理对象(类似:$Proxy89@10644)。
但是我们在使用@Bean进行配置的时候,很可能写出如下代码:
@Bean(name = "myShiroRealm")
public SysUserRealm myShiroRealm() {
SysUserRealm realm = new SysUserRealm();
realm.setCacheManager(getEhCacheManager());
return realm;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(SysUserRealm sysUserRealm) {
EhCacheManager ehCacheManager = getEhCacheManager();
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setRealm(sysUserRealm);
dwsm.setCacheManager(ehCacheManager);
return dwsm;
}
这是一段配置Shiro的代码,简单点说就是,我们定义了2个Bean,下面的Be