Spring的装配方式有三种:
- 隐式的bean扫描发现机制和自动装配
- 在java中进行显示配置
- 在XML中进行显示配置
1 . 隐式的bean扫描发现机制和自动装配
我们经常使用的都是这种方式,当我们使用SSM框架或者Springboot项目时在三层架构里面都是使用这种方式:控制层调用服务层,服务层调用数据层,我们都是使用@Controller,@Service,@Repository,这各种注解来在Spring容器中创建Bean, 然后需要使用Bean的时候使用@Autowired的来注入使用。
但spring默认是不启用组件扫描的,可以在XML中配置加上<context:component-scan base-package="xx"/>
。还有一种方法:在新建一个配置类,类中可以什么不用写,在配置类上加上@ComponentScan注解,spring会自动扫描改配置类所在的包
问题: 为啥我们在使用Springboot项目时,好像没咋使用过@ComponentScan,这个注解?
因为Springboot已经封装好了ComponentScan,它的底层使用了ComponentScan这个注解,它回自动扫描一些包。
2. 在java中进行显示配置
一般通过组件扫描和自动装配方式就比较方便了,但如果由于需求我们要使用第三方的库的类,在这种情况没有办法到第三方库中去给类加注解,就不能使用第一种方法了。这时得采用Java的显示装配
使用场景:例如,我们需要使用到底层的类(比如说:我们需要使用Shiro的一些底层的类,将它注入到Spring容器中,因为我们后面会使用到这个Bean),显然,我们不能在Shiro这个类中添加@Component这样的注解,所以我们就会有第二中方法
代码样例:
package com.southwind.config;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.southwind.realm.AccoutRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Hashtable;
import java.util.Map;
//@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//权限设置
Map<String,String> map = new Hashtable<>();
map.put("/main","authc"); // 访问main的时候一定要是登录的一个状态
//下面两个是基于登录的,因为只有在登录之后才可能有权限和角色
map.put("/manage","perms[manage]");//访问manage的时候,一定要有一个manage权限才能去访问
map.put("/administrator","roles[administrator]");//。。。,一定要是administrator角色才可以访问。
factoryBean.setFilterChainDefinitionMap(map);
//设置登录页面
factoryBean.setLoginUrl("/login");
//设置未授权页面
factoryBean.setUnauthorizedUrl("/unauth");
return factoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(@Qualifier("accoutRealm") AccoutRealm accoutRealm){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(accoutRealm);
return manager;
}
@Bean
public AccoutRealm accoutRealm(){
return new AccoutRealm();
}
//这个是用来整合thymeleaf的
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}