我的项目目前使用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就会被实例化。
我在俯视什么?
谢谢你们。
答案 0 :(得分:2)
DefaultAdvisorAutoProxyCreator
是BeanPostProcessor
。在其他bean之前实例化并初始化该类型的Bean。但是,在这种情况下,您的@Bean
方法也使用@DependsOn
注释,在这种情况下,bean依赖于另一个要在其自己的初始化之前进行初始化的bean。
因此,在defaultAdvisorAutoProxyCreator
可以运行之前,必须运行authorizationAttributeSourceAdvisor
。该方法现在取决于getSecurityManager()
,因此必须先运行。运行时,您的@Autowired
字段尚未处理,因为BeanPostProcessor
bean尚未全部初始化。 (BeanPostProcessor
进行@Autowired
个进程注入。)
如果你有一个完全独立的bean并检查了shiroRealm
的状态,那么你会在那时看到它是非空的。