Spring如何识别ShiroConfig类里注册的一些bean呢?

来源:3-10 创建ShiroConfig类

流叠

2021-01-20

老师你好,我想问一下关于spring整合shiro配置的相关问题。

@Configuration
public class ShiroConfig {

    @Bean("securityManager")
    public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(oAuth2Realm);
        securityManager.setRememberMeManager(null);
        return securityManager;
    }

    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, OAuth2Filter oAuth2Filter) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);

        Map<String, Filter> filters = new HashMap<>();
        filters.put("oauth2", oAuth2Filter);
        shiroFilter.setFilters(filters);

        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/webjars/**", "anon");
        filterMap.put("/druid/**", "anon");
        filterMap.put("/app/**", "anon");
        filterMap.put("/sys/login", "anon");
        filterMap.put("/swagger/**", "anon");
        filterMap.put("/v2/api-docs", "anon");
        filterMap.put("/swagger-ui.html", "anon");
        filterMap.put("/swagger-resources/**", "anon");
        filterMap.put("/captcha.jpg", "anon");
        filterMap.put("/user/register", "anon");
        filterMap.put("/user/login", "anon");
        filterMap.put("/test/**", "anon");
        filterMap.put("/**", "oauth2");

        shiroFilter.setFilterChainDefinitionMap(filterMap);

        return shiroFilter;
    }

    @Bean("lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }

}

比如这里添加好之后,spring容器里有了SecurityManagerShiroFilterFactoryBeanLifecycleBeanPostProcessorAuthorizationAttributeSourceAdvisor 这四个bean的实例。
既然bean的name可以任意指定或者不指定,那spring怎么为shiro提供比如SecurityManager呢?只能通过bean的类型去容器里找吗?或者如果在这个配置类添加多个bean 类型都是SecurityManager,这时候spring如何处理?我试了添加多个SecurityManager类型的bean,运行没什么问题,但是原理没搞懂。

写回答

2回答

tgywatalive

2023-01-11

老师说那个类型注入是对的,一旦加上@Component和@Bean标签后就默认注入在容器中了,给Bean加名字是防止万一多个Bean又默认类型注入的话是会报错的,非要指定Bean名称注入的话可以使用@Qualifier注解到形参上来解决,idea对于注入也有提示来着,可以看从哪里注入又注入到哪里就懂了

0
0

神思者

2021-01-20

默认就是通过类型注入关系的,你定义了多个类型的Bean,不去给Bean声明ID,Spring项目启动就会有问题

0
0

SpringBoot 在线协同办公小程序开发 全栈式项目实战

未来趋势型业务 + 前后端综合技术栈 + 惊艳的细节打磨

1812 学习 · 1924 问题

查看课程