1、bean作用域
scope: singleton(单例)| prototype(原型)
- 执行时机(bean的产生时机):
- singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean。singleton也支持延迟加载(懒加载):在第一次使用时产生。-> 添加注解 @Lazy
- prototype:容器在初始化时,不创建对象;只是在每次使用时再创建对象; 每次getBean()都会创建一个新的对象。
@Bean
@Scope("singleton")
@Lazy//只有单例时 在第一次使用时产生对象
public Student myStudent() {
Student ls = new Student("ls", 23);
return ls;
}
//xml形式
<bean id="student" class="org.entity.Student" scope="singleton" lazy-init="true">
2、条件注解(spring boot大量使用)
可以让某一个Bean 在某些条件下 加入Ioc容器,其他情况下不加IoC容器。
- 增加条件Bean:给每个Bean设置条件 ,必须实现Condition接口
例:
1、准备bean
//使用条件注解
public interface Car {
}
//实现类1
public class OilCar implements Car {
}
//实现类2
public class EnergyCar implements Car {
}
2、编写环境配置类 实现Condition 接口
public class OilCarConding implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 如果当前环境是oil,则加入oilCar
Environment environment = context.getEnvironment(); // 获取环境
String property = environment.getProperty("car.type");
if(property.contains("oil")){
return true;
}
return false;
}
}
public class EnergyCarConding implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 如果当前环境是oil,则加入oilCar
Environment environment = context.getEnvironment();
String property = environment.getProperty("car.type");
if(property.contains("energy")){
return true;
}
return false;
}
}
3、在配置类中进行配置
@Bean
@Conditional(OilCarConding.class)
public Car oilCar(){
return new OilCar();
}
@Bean
@Conditional(EnergyCarConding.class)
public Car energyCar(){
return new EnergyCar();
}
4、指定当前 条件
- 通过虚拟机参数 -Dcar.type=energy
//查看IOC容器的类容
String[] beanDefinitionNames = context.getBeanDefinitionNames();//获取容器中所有的bean 的id