博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
7251
积分:0
P豆:617

SpringBoot中Bean自动装配原理

2021年10月17日 23:07:56阅读数:24博客 / Sky

###原理:

是通过Condition接口判断pom.xml有没有导入某个坐标或者依赖某个坐标而进行加载某个bean。

Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载相应的Bean,

然后通过@Conditional注解,要配和Condition的实现类(ClassCondition)进行使用

###需求

在spring的ioc容器中有一个User的Bean,如果pom.xml导入了Jedis坐标后,就加载该Bean,否则不加载

###代码实现:

1、先创建一个user对象

public class User {}

2、创建一个UserConfig.java的配置类,生成User对象的Bean

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class UserConfig {
   @Bean
   public User user(){
       return new User();
   }}

3、在Springboot的启动类中获取User对象的Bean

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublic class DemoApplication {
   public static void main(String[] args) {
       ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
      //在Springboot的启动类中获取User对象的Bean
       Object user = run.getBean("user");
       System.out.println(user);//输入:com.example.demo.User@6724cdec
   }}

以上是不管什么时候都能加载User对象的Bean,但是我们的需求是如果pom.xml导入了Jedis坐标后,就加载该Bean,否则不加载,所以接下来就行修改

###代码改造

1、创建一个类实现Condition接口,重写matches方法,然后在买手机游戏账号平台方法里面写条件。返回true代表加载user对象的bean,返回false表示不加载

import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class ClassCondition implements Condition {
   @Override
   public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
     //需求:如果pom.xml导入了Jedis坐标后,就加载该User对象的Bean,否则不加载
       boolean flag=true;
       try {
           //如果导入了Jedis坐标可以通过放射的形式获取到Jedis对象。
            Class<?> clazz = Class.forName("redis.clients.jedis.Jedis");

       } catch (ClassNotFoundException e) {
          //如果程序报错,证明没有导入Jedis坐标,所以获取不到
           flag=false;

       }
       return flag;
   }}

2、在UserConfig.java类中创建User对象Bean 的方法上加上@Conditional(ClassCondition.class)注解,注解里面传入要判断的条件实现类,根据该类的matches方法的返回值进行操作,返回true代表可以加载User对象的bean,返回false表示不可以加载

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Conditional;import org.springframework.context.annotation.Configuration;@Configurationpublic class UserConfig {
   @Bean
   @Conditional(ClassCondition.class) //加入条件判断的实现类,根据返回值判断是否要加载该bean
   public User user(){
       return new User();
   }}

4、测试

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId></dependency>

你在pom.xml导入了上面的坐标,运行springboot的启动类,如果有就正常获取,如果没有程序就会报错,提示找不到user的bean

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 电脑不断循环启因和解决方法:1、病毒和木马导致的,需要清除病毒和木马;2、系统文件损坏系统文件被破坏,需要重系统;3、硬件方面因,有能力的情况下行修,不会不懂的可以送维修心进行修
    因:和后台运行的程序太多,干扰到系统正常运行。
    键盘上的上下左右键不能用的解决办法:1、将键盘拿到另一台电脑做测试,若有问题则修或是更换;2、用系统带的系统还;3、使用系统盘修复;4、在BIOS设置光驱为第一启设备插入系统安盘,按R键选择