@Scope
@Scope:作用域
其中scopeName的值可设置为如下:
- singleton 单例 每次都是取得同一个实例 默认情况属于饿汉式 容器初始化时创建实例
- prototype 每次创建都是一个新的实例
- request 一次Http请求会创建一个实例且只在当前请求内有效
- session 一次会话创建一个实例,且只在一次会话中有效
默认情况下是singleton
@Lazy
使用@Lazy注解可以使singleton改为懒汉式,在使用Bean时才创建,否则不创建实例。
@Conditional
@Conditional按照一定的条件进行创建Bean。
使用该注解需要实现Condition接口
public class MyCondition implements Condition {
/*
ConditionContext: 可以获得环境变量、类加载器、BeanDefinitionRegistry...
AnnotatedTypeMetadata:获得注解相关信息
return :true表示 注册Bean 否则反之
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//获取系统信息
String property = context.getEnvironment().getProperty("os.name");
if (property.contains("Mac")) {
return true;
}
return false;
}
}
这里我们获取系统如果是Mac就注册Bean否则不注册。
在Bean上加上注解
public class ApplicationConfig {
/*
默认name是获取Bean的方法名 person
@Bean("person001") 这样使用注解 name则为person001
*/
@Conditional(MyCondition.class)
@Bean
public Person person(){
System.out.println("person被创建了");
return new Person("小符",18);
}
}
输出当前注册的Bean
可以看到person注册了。
那我们修改为Win则不能注册了。
public class MyCondition implements Condition {
/*
ConditionContext: 可以获得环境变量、类加载器、BeanDefinitionRegistry...
AnnotatedTypeMetadata:获得注解相关信息
return :true表示 注册Bean 否则反之
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//获取系统信息
String property = context.getEnvironment().getProperty("os.name");
if (property.contains("Win")) {
return true;
}
return false;
}
}
输出当前注册的Bean
很明显没有注册。
这里我们可以自己给虚拟机传递参数
-Dos.name=Windows
再次运行输出
person就注册了。