springBoot深入学习一
目录
@Configuration和@Bean
https://blog.csdn.net/reed1991/article/details/69802879
@value
用xml配置文件方式时,给bean的属性赋值的方式
也可以用@value注解进行赋值,而且还支持
1.直接赋值
2.spring的EL表达式
3.从配置文件获取
person.properties的配置信息如下
person.favorite=basketball
Person类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@Value("reed") //直接赋值
private String name;
@Value("#{20+7}") //EL表达式
private Integer age;
@Value("${person.favorite}") //配置赋值
private String favorite;
}
配置类:用@PropertySource著名配置文件全路径
@PropertySource(value = {"classpath:/person.properties"})
@Configuration
public class MainConfig {
@Bean("person")
public Person person(){
return new Person();
}
运行结果如下
@Conditional 注解实现条件注入
@Conditional 注解可实现选择性注入。比如可以根据prod、dev、test等不同的环境选择性注入不同的配置。
如下的例子根据是mac还是win注入不同的bean。
1.申明WindowsCondition和MacCondition两个Condition
public class MacCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String property = environment.getProperty("os.name");
//可以判断容器中的bean注册情况,也可以给容器中注册bean
if(property.contains("Mac OS X")){
return true;
}
return false;
}
}
=================================================
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if(property.contains("Windows")){
return true;
}
return false;
}
}
2.申明两个bean bill和jobs,并用@Conditional 注解分别进行了条件判断
@Configuration
public class MainConfig {
@Conditional(WindowsCondition.class)
@Bean("bill")
public Person person01(){
return new Person("bill",11);
}
@Conditional(MacCondition.class)
@Bean("mac")
public Person person02(){
return new Person("jobs", 48);
}
}
根据下图可以看出,本次操作用的是mac系统
通过如下代码可打印出所有的bean
@Test
public void test03(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String name:beanDefinitionNames){
System.out.println(name);
}
}
打印结果如下
从结果可看出只有mac注解可注入
@Import实现将组件快速导入容器
比如在第三方jar包中的一些组件,我们希望能够快速导入spring容器,就可以使用@Import将组件快速导入容器。
申明两个类Student和StudentDao
在启动类(如上文中的MainConfig)上添加注解
@Import({Student.class, StudentDao.class})
可快速将Student和StudentDao两个组件导入容器。
打印出容器中所有的bean如下,
从结果可看出id默认为组件的全名
还可以通过实现ImportSelector实现自定义导入组件
如下,新建Yellow和blue两个类,新建MyImportSelector实现ImportSelector接口,并将新建的两个类加入。
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
//返回值,就是到导入到容器中的组件全类名
//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//importingClassMetadata
//方法不要返回null值
return new String[]{"com.cisco.reed.spring.bean.Blue","com.cisco.reed.spring.bean.Yellow"};
}
}
并将此类加入@import中
@Import({Student.class, StudentDao.class, MyImportSelector.class})
运行结果如下
从结果可看出Blue和Yellow两个组件被加入到容器中。
此外,还可通过实现ImportBeanDefinitionRegistrar:手动注册bean到容器中。此方法可指定组件id。
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
boolean def = beanDefinitionRegistry.containsBeanDefinition("com.cisco.reed.spring.bean.Blue");
if(def){
RootBeanDefinition beanDefinition = new RootBeanDefinition(Cat.class);
beanDefinitionRegistry.registerBeanDefinition("blue cat",beanDefinition);
}
}
}
并将MyImportBeanDefinitionRegistrar加入@Import,运行结果如下
由结果可知,Cat组件被注入容易,组件id为blue cat