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容器里有了SecurityManager,ShiroFilterFactoryBean ,LifecycleBeanPostProcessor ,AuthorizationAttributeSourceAdvisor 这四个bean的实例。
既然bean的name可以任意指定或者不指定,那spring怎么为shiro提供比如SecurityManager呢?只能通过bean的类型去容器里找吗?或者如果在这个配置类添加多个bean 类型都是SecurityManager,这时候spring如何处理?我试了添加多个SecurityManager类型的bean,运行没什么问题,但是原理没搞懂。
写回答
2回答
-
tgywatalive
2023-01-11
老师说那个类型注入是对的,一旦加上@Component和@Bean标签后就默认注入在容器中了,给Bean加名字是防止万一多个Bean又默认类型注入的话是会报错的,非要指定Bean名称注入的话可以使用@Qualifier注解到形参上来解决,idea对于注入也有提示来着,可以看从哪里注入又注入到哪里就懂了
00 -
神思者
2021-01-20
默认就是通过类型注入关系的,你定义了多个类型的Bean,不去给Bean声明ID,Spring项目启动就会有问题
00
相似问题