当前位置: 首页 > 后端技术 > Java

SpringBoot中Bean自动组装原理

时间:2023-04-01 15:41:14 Java

原理:是通过Condition接口判断pom.xml是否导入了某个坐标或者根据某个坐标加载了某个bean。Condition是Spring4.0之后引入的条件配置接口。通过实现Condition接口,可以有条件的加载对应的Bean,然后通过@Conditional注解,需要匹配Condition的实现类(ClassCondition)才能使用要求在spring的ioc中有一个UserBean容器。如果pom.xml中引入了Jedis坐标,则加载Bean,否则不加载代码。实现:1.首先创建一个用户对象publicclassUser{}2.创建一个UserConfig.java配置Class,生成User对象的Beanimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassUserConfig{@BeanpublicUseruser(){returnnewUser();}}3、获取Springboot启动类中User对象的Beanpublicstaticvoidmain(String[]args){ConfigurableApplicationContextrun=SpringApplication.run(DemoApplication.class,args);//获取Springboot启动类中User对象的BeanObjectuser=run.getBean("user");System.out.println(user);//Input:com.example.demo.User@6724cdec}}上面是可以随时加载User对象的Bean,但是我们的需求是如果pom.xml导入Jedis坐标之后加载bean,否则不加载,所以下一步修改代码改造1.创建一个类实现Condition接口,重写matches方法,然后在方法中写条件返回true表示用户对象的bean,返回false表示不加载classClassConditionimplementsCondition{@Overridepublicbooleanmatches(ConditionContextconditionContext,AnnotatedTypeMetadataannotatedTypeMetadata){//要求:如果pom.xml导入Jedis坐标,则加载User对象的Bean,否则不加载booleanflag=true;try{//如果引入了Jedis坐标,可以通过辐射的形式获取到Jedis对象。Classclazz=Class.forName("redis.clients.jedis.Jedis");}catch(ClassNotFoundExceptione){//如果程序报错,证明没有导入Jedis坐标,所以得不到flag=false;}返回标志;}}2.在UserConfig.java类中创建User对象Bean的方法中添加@Conditional(ClassCondition.class)注解,在注解中传入要判断的条件实现类,根据返回值该类的matches方法进行操作,返回true表示可以加载User对象的bean,返回false表示不能加载importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Conditional;导入org.springframework.context.annotation。Configuration;@ConfigurationpublicclassUserConfig{@Bean@Conditional(ClassCondition.class)//添加条件判断的实现类,根据返回值判断是否加载beanpublicUseruser(){returnnewUser();}}4。测试redis.clientsjedis你已经在pom.xml中导入了上面的坐标,运行springboot的启动类,如果有,获取通常情况下,如果没有程序,会报错,提示找不到用户的bean。如果您在运行这段代码的过程中遇到问题,请添加编辑vi字母xxf960513!帮你赶快掌握这个功能代码吧!