我的项目目前使用 Apache Shiro 进行保护,并且希望添加 Shiro 注释以获得更清晰的源代码。
Apache Shiro 要求您包含 DefaultAdvisorAutoProxyCreator
以便 Spring AOP 检测到它。
我的配置如下:
@Configuration
@ComponentScan("com.mcac0006.flip")
@EnableWebMvc
public class AppContextConfiguration {
@Autowired
private JdbcRealm shiroRealm;
@Bean(name="shiroFilter")
public ShiroFilterFactoryBean getShiroFilter() {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(getSecurityManager());
return bean;
}
@Bean(name="securityManager")
public DefaultSecurityManager getSecurityManager() {
return new DefaultWebSecurityManager(shiroRealm);
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor a = new AuthorizationAttributeSourceAdvisor();
a.setSecurityManager(getSecurityManager());
return a;
}
@Bean
@DependsOn("authorizationAttributeSourceAdvisor")
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
final DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
return defaultAdvisorAutoProxyCreator;
}
}
在此示例中,shiroRealm
保持为 null,并导致其所有依赖项失败。如果我注释掉最后一个方法 defaultAdvisorAutoProxyCreator()
,shiroRealm 就可以很好地实例化。
我忽略了什么?
谢谢大家。
最佳答案
DefaultAdvisorAutoProxyCreator
是一个 BeanPostProcessor
。该类型的 Bean 在其他 Bean 之前实例化和初始化。但是,在这种情况下,您的 @Bean
方法也使用 @DependsOn
进行注释,在这种情况下,该 Bean 依赖于另一个要在其自身初始化之前进行初始化的 Bean。
因此,在运行 defaultAdvisorAutoProxyCreator
之前,必须运行 authorizationAttributeSourceAdvisor
。该方法现在依赖于 getSecurityManager(),因此也必须首先运行。当它运行时,您的 @Autowired
字段尚未处理,因为 BeanPostProcessor
beans 尚未全部初始化。 (BeanPostProcessor
处理 @Autowired
的注入(inject)。)
如果您有一个完全独立的 bean 并检查了 shiroRealm
的状态,那么此时您会看到它为非空。
关于java - DefaultAdvisorAutoProxyCreator 导致 @Autowired 依赖项保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24069484/