一、注解解释
- @Profile(""):通过profile注解来指定环境,只有与运行环境相同的bean才会被注册到spring上下文中
- @Primary:spring上下文中有多个相同BeanID的时候,使用自动装配注入方式会引起程序异常,使用primary类指定spring在注入多bean的时候优先注入哪个
- @Qualifier:自定义BeanId可以与@Component和@Bean一起使用,同时可以和@Autowired一起使用,指定注入Bean的名称
- @Scope:spring容器中的一个作用域,在 Spring容器中具有以下几种作用域:常用作用域singleton(单例)、prototype(多例)
二、装配Bean
继续上一个测试demo,创建test2
- 创建接口
package com.test.spring.test2;
public interface Dog {
String wangWangWang();
}
- 创建两个实现类,并注册到spring容器中
package com.test.spring.test2;
import org.apache.catalina.core.ApplicationContext;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Primary
@Component
public class DaLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是大狼狗";
System.out.println(str);
return str;
}
}
package com.test.spring.test2;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
public class XiaoLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是小狼狗~";
System.out.println(str);
return str;
}
}
- 创建javaConfig
package com.test.spring.test2;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class JavaConfig {
}
- 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class Test2 {
@Autowired
private Dog dog;
@Test
public void contextLoads() {
dog.wangWangWang();
}
}
由于DaLangGou类使用了@Primary所以会优先装配
三、使用自定义BeanID方式
- 修改实现类
//@Primary
@Component
@Qualifier("daGou")
public class DaLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是大狼狗";
System.out.println(str);
return str;
}
}
@Component
@Qualifier("xiaoGou")
public class XiaoLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是小狼狗~";
System.out.println(str);
return str;
}
}
- 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class Test2 {
@Autowired
@Qualifier("xiaoGou")
private Dog dog;
@Test
public void contextLoads() {
dog.wangWangWang();
}
}
由于使用自定义beanID方式,在装配时需要指定BeanID的名称
四、设置运行环境
- 修改实现类,设置运行环境
//@Primary
@Component
@Profile("pro")
//@Qualifier("daGou")
public class DaLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是大狼狗";
System.out.println(str);
return str;
}
}
@Component
@Profile("dev")
//@Qualifier("xiaoGou")
public class XiaoLangGou implements Dog {
@Override
public String wangWangWang() {
String str = "我是小狼狗~";
System.out.println(str);
return str;
}
}
- 测试
/**
* @ActiveProfiles
* 指定使用的那个环境来创建,只有pro或没有指定环境的bean会被创建
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
@ActiveProfiles("pro")
public class Test2 {
@Autowired
//@Qualifier("daGou")
private Dog dog;
@Test
public void contextLoads() {
dog.wangWangWang();
}
}
五、读取配置文件
- application.yml
- 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
@PropertySource("classpath:application.yml")
public class Test2 {
/**
* 读取配置文件注解方式和使用Environment方式
*/
@Autowired
private Environment env;
@Value("${kkkk}")
private String str;
@Test
public void testEnv(){
System.out.println(env.getProperty("kkkk"));
System.out.println(str);
}
}