DefaultAdvisorAutoProxyCreator导致@Autowired依赖项保持为null

时间:2014-06-05 20:17:00

标签: java spring spring-mvc spring-aop shiro

我的项目目前使用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就会被实例化。

我在俯视什么?

谢谢你们。

1 个答案:

答案 0 :(得分:2)

DefaultAdvisorAutoProxyCreatorBeanPostProcessor。在其他bean之前实例化并初始化该类型的Bean。但是,在这种情况下,您的@Bean方法也使用@DependsOn注释,在这种情况下,bean依赖于另一个要在其自己的初始化之前进行初始化的bean。

因此,在defaultAdvisorAutoProxyCreator可以运行之前,必须运行authorizationAttributeSourceAdvisor。该方法现在取决于getSecurityManager(),因此必须先运行。运行时,您的@Autowired字段尚未处理,因为BeanPostProcessor bean尚未全部初始化。 (BeanPostProcessor进行@Autowired个进程注入。)

如果你有一个完全独立的bean并检查了shiroRealm的状态,那么你会在那时看到它是非空的。