一、@Scope
默认单例 1. singleton 单实例(默认值),IOC容器启动会调用方法创建对象放在容器中,以后每次获取直接从容器中拿 2. prototype 多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取时才会调用方法创建对象--懒加载 3. request 同一个请求创建一个实例 4. session 同一个session创建一个实例
二、@Lazy
懒加载,默认是true
三、@Conditional
@Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册bean
@Configuration public class MainConfig2 { /** * @Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册bean * 如果系统是windows,给容器注册bill * 如果系统是linux,给容器注册linus * @return */ @Conditional({WinCondition.class})//该注解也可以配置在类上 @Bean("bill") public Person person01(){ return new Person("Bill Gates",62); } @Conditional({LinuxCondition.class}) @Bean("linux") public Person person02(){ return new Person("linus",48); } }
/** * @author Millet * @date 2020/6/8 23:28 */ public class LinuxCondition implements Condition { /** * * @param conditionContext 判断条件能使用的上下文(环境) * @param annotatedTypeMetadata 注释信息 * @return */ @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //判断是否是Linux系统 //1.获取到IOC使用的beanFactory ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory(); //2. 获取到类加载器 ClassLoader classLoader = conditionContext.getClassLoader(); //3. 获取到当前环境信息 Environment environment = conditionContext.getEnvironment(); //4. 获取到bean定义的注册类 BeanDefinitionRegistry registry = conditionContext.getRegistry(); String property = environment.getProperty("os.name"); if(property.contains("Linux")){ return true; } return false; } }
/** * @author Millet * @date 2020/6/8 23:28 */ public class WinCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { Environment environment = conditionContext.getEnvironment(); String property = environment.getProperty("os.name"); if(property.contains("Windows")){ return true; } return false; } }