1 条件化bean
- @Conditional注解后面的类会实现Condition接口,当@Conditional注解中指定的类为真时,spring容器才会创建MagicConfig的bean,才能够将MagicConfig类注入到其他的类中,当@Conditional注解指定类为false时,如果注入这个类就会报错。
@Configuration
public class MagicExists {
@Bean()
@Conditional(MagicCondition.class)
public MagicConfig magicBean() {
return new MagicConfig();
}
}
2处理自动装配的歧义
- 一个接口和四个接口的实现类和一个测试类,当运行测试方法时,会报错,因为存在3个满足条件的bean,spring容器也不知道去创建那个对象的bean,所以需要通过注解指定。
public interface Dessert {
void sys();
}
public class Cake implements Dessert {
public void sys() {
System.out.println("Cake.......");
}
}
@Component
public class Cookies implements Dessert{
public void sys() {
System.out.println("Cookies.......");
}
}
@Component
public class IceCream implements Dessert {
public void sys() {
System.out.println("ice.......");
}
}
public class Test extends BaseTestCase{
private Dessert dessert;
public Dessert getDessert() {
return dessert;
}
@Autowired
public void setDessert(Dessert dessert) {
this.dessert = dessert;
}
@org.junit.Test
public void test(){
dessert.sys();
}
}
- 然后我在Cookies 类上面加了一个@Primary标签,发现不出现错误了,通过输出知道容器创建了Cookies 的bean。
- 当存在两个@Primary标签时,仍然会报错,因为容器发现了两个@Primary注解指定的类,
- 当用注解@Qualifier(“iceCream”)指定创建的bean时,出现多个@Primary会创建beanId为iceCream的bean,容器创建每个bean时都会创建一个beanId用于唯一指定一个bean,默认情况下为首字符小写的类名。
3 bean的作用域
- 默认的情况下spring创建的bean都是单例的,不管这个bean被注入过多少次,注入的都是这个bean。通过@Scope(“prototype”)注解指定bean的作用域。
- 单例(Singleton):在整个应用中之创建一个实例。
- 原型(ProtoType):每次注入或者通过Spring上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在WEB应用中,为每个会话创建bean的一个实例。
- 请求(Request):在WEB应用中,为每个请求创建一个bean实例。
- 扩展:请求和会话的区别:请求指从客户端发送请求到服务器处理请求结束,会话是用户的全局变量,只要页面不关闭一直有效,会话的过期时间是30min。
4 运行注入
- 通过Spring默认的Environment类,默认去读取去读取application.properties文件的配置,当通过@PropertySource指定了读取的配置类,当前类中的Environment类,读取的就是@PropertySource指定的类。
- @Value默认读取application.properties文件中的属性值,在一个@PropertySource(app.properties)指定读取的路径下的一个类,@Value读取的属性值如果在application.properties和app.properties同时存在与两个配置文件中,会优先读取application.properties配置中的属性值,如果application.properties没有@Value注解想读取的属性值,会去@PropertySource指定配置文件中读取这个属性,如果还没有,会报错,找不到到这个属性值。
@Configuration
@PropertySource("classpath:/config/app.properties")
public class ReadPropertiesConfig {
@Autowired
Environment evn;
@Value("${magic}")
private String str;
public User getUserInfo() {
System.out.println("@Value$取值+" + str);
return new User("通过Environment获取配置值:" + evn.getProperty("name"), evn.getProperty("pwd"));
}
public void getActiveProfiles() {
String str[] = evn.getActiveProfiles();
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
public void getDefaultProfiles() {
String name = evn.getProperty("name");
System.out.println("evn get name" + name);
String str[] = evn.getDefaultProfiles();
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
}