springBoot深入学习一

目录

@Configuration和@Bean

@value

@Conditional 注解实现条件注入

@Import实现将组件快速导入容器


@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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值