1. @Value赋值和@PropertySource加载配置文件
@Value赋值
public class Person {
//使用@Value赋值;
//1、基本数值
//2、可以写SpEL; #{}
//3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
@Value("张三")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("${person.nickName}")
private String nickName;
.....
}
@PropertySource加载配置文件
@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
@Bean
public Person person(){
return new Person();
}
}
2. @Autowired和@Qualifier和@Primary
@Autowired:自动注入:
默认优先按照类型去容器中找对应的组件
自动装配默认一定要注册了这个类型的Bean,没有就会报错;
可以使用@Autowired(required=false);
如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
@Autowired可以标注在构造器,参数,方法,属性上
它们都是从容器中获取参数组件的值
- 放在成员变量
@Controller
public class BookController {
@Autowired
private BookService bookService;
}
自动注入时不要求一定要有这个组件,没有的情况下注入不成功,bookDao为null
@Service
public class BookService {
@Autowired(required=false)
private BookDao bookDao;
}
- 标注在方法位置:
- @Bean方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
- set方法
//@Bean方法
@Bean
public Color color(Car car){
Color color = new Color();
color.setCar(car);
return color;
}
//set方法
@Autowired
public void setCar(Car car) {
this.car = car;
}
- 标在构造器上:
如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
@Autowired
public Boss(Car car){
this.car = car;
System.out.println("Boss...有参构造器");
}
- 标志在参数上
//case1
public Boss(@Autowired Car car){
this.car = car;
System.out.println("Boss...有参构造器");
}
//case2
public void setCar(@Autowired Car car) {
this.car = car;
}
@Primary:
对组件进行注册的时候,设定其优先级,再其他类中对该类型主键进行自动注入的时候优先选择带有@Primary的组件
其@Qualifier冲突,即先判断@Qualifier("bookDao"),再判断@Primary
@Configuration
@ComponentScan({"com.atguigu.service","com.atguigu.dao",
"com.atguigu.controller"})
public class MainConifgOfAutowired {
@Primary//优先级
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
@Qualifier("bookDao"):
使用@Qualifier指定需要装配的组件的id
要求使用bookDao
@Service
public class BookService {
@Qualifier("bookDao")
@Autowired(required=false)
private BookDao bookDao;
}
3. @Resource和@Inject
@Resource和@Inject是java自带的注解,非spring独有,其他ioc工具也能使用
@Resource:
- 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
- 不支持@Primary功能且不能实现类似@Autowired(reqiured=false)的效果
@Service
public class BookService {
@Resource(name="bookDao2")
private BookDao bookDao;
}
@Inject:
需要导入javax.inject的包
Autowired的功能一样,支持@Primary,但不支持required=false的功能;
4. @Profile根据环境注册Bean
@Profile:
指定组件在哪个环境(生产环境、开发环境等)才能被注册到容器中,不指定的情况下,任何环境下都能注册这个组件
- 注册在配置类上,则这个配置类只在指定环境下生效,也就是这个配置类所扫描到的和配置的Bean也只会在指定环境下被注册
- 注册在@Bean所标注的方法上,该方法注册的Bean将在指定环境下才会被注册
@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile{
@Value("${db.user}")
private String user;
private StringValueResolver valueResolver;
private String driverClass;
@Profile("test")
@Bean("testDataSource")
public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("dev")
@Bean("devDataSource")
public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("prod")
@Bean("prodDataSource")
public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515");
dataSource.setDriverClass(driverClass);
return dataSource;
}
}
配置环境的方法
方法1. 使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
![](https://img.haomeiwen.com/i6608036/aa7e294553b5558b.png)
![](https://img.haomeiwen.com/i6608036/d65add7f4d8b6b7d.png)
方法2. 代码的方式激活某种环境
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext();//此处使用无参构造器
//1、创建一个applicationContext
//2、设置需要激活的环境
applicationContext.getEnvironment().setActiveProfiles("dev");
//3、注册主配置类
applicationContext.register(MainConfigOfProfile.class);
//4、启动刷新容器
applicationContext.refresh();
String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
for (String string : namesForType) {
System.out.println(string);
}
applicationContext.close();
}
网友评论