java - DefaultAdvisorAutoProxyCreator 导致 @Autowired 依赖项保持为空

标签 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 就可以很好地实例化。

我忽略了什么?

谢谢大家。

最佳答案

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/

相关文章:

javascript - 正确配置 vert.x 服务器以允许跨域资源共享 (CORS)

java - 解析 JSON 响应?

java - LWJGL:打开窗口导致程序崩溃

java - 请求中带有 jaxb null 对象的 Spring WS

java - 在运行时创建 Spring Bean

java - spring security 匿名用户和带有 spring security 的经过身份验证的用户

java - 在没有 <mvc :annotation-driven/> in Spring MVC 3. 1 的情况下使用 Flash 范围(和 RedirectAttributes)

java - 使用opencv对网球场进行3D估算

java - Spring REST 实现错误 404

java - spring mvc模块不更新记录