【问题标题】:DefaultAdvisorAutoProxyCreator causing @Autowired dependencies to remain nullDefaultAdvisorAutoProxyCreator 导致 @Autowired 依赖项保持为空
【发布时间】:2014-07-26 23:52:56
【问题描述】:

我的项目目前使用 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 保持为空,并导致其所有依赖项都失败。如果我注释掉最后一个方法defaultAdvisorAutoProxyCreator(),shiroRealm 实例化就好了。

我忽略了什么??

谢谢大家。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨!感谢您的回答 - 很好的解释。这是一个设计问题,还是有某种解决方法?
    • 我必须在几个小时内回复您。
    • @MatthewCachia 我猜你可以说这是 Spring 的 Java 配置的限制。您可以使您的 securityManager 依赖于 shiroRealm bean。 (但它自己的注射可能会失败。)我必须审查 Shiro。
    猜你喜欢
    • 2014-10-21
    • 2016-10-04
    • 1970-01-01
    • 2021-08-11
    • 2012-08-07
    • 2015-03-07
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多