弹簧动态加载bean后调用实现方法解析

  

<强>前言

  

在使用春天的过程中,我们有时候并不想通过xml的方式进行bean的注入,希望在不改变原有的程序结构的基础上添加我们需要的bean,这个时候我们可以利用春天的Spring bean的jar包里提供的BeanFactoryPostProcessor接口类,通过实现这个接口类,我们可以动态的加载所需要的bean,特别是在引入已经打包在罐子里面的程序而没有办法做出修改的情况下,这个接口就为我们提供了及其方便的入口。

  

因为我是在其他项目的基础上测试的这个接口,所以引入的罐子有其特殊性,所以需要参考的同学可以按照自己的需求来实现。

  

<强> 1。通过pom.xml来引入springboot:

        & lt; parent>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-parent   & lt; version> 1.5.6.RELEASE   & lt;/parent>   & lt; dependencies>   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-test   & lt;/dependency>   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-web   & lt;/dependency>   & lt; dependency>   & lt; groupId> com.thread   & lt; artifactId> test   & lt; version> 1.0 & lt;/version>   & lt; scope> system   & lt; systemPath> f:/threadTest.jar   & lt;/dependency>   & lt;/dependencies>之前      

<强> 2。创建App.java启动类:

        进口org.springframework.boot.SpringApplication;   进口org.springframework.boot.autoconfigure.SpringBootApplication;/* *   * @author liaoyubo   * @version 1.0 2017/7/31   * @description   */@SpringBootApplication   公共类应用{      公共静态void main (String [] args) {   SpringApplication.run (App.class);   }   }      

<强> 3。创建一个DynamicCreateBean.java来作为动态加载的对象:

        公开课DynamicCreateBean {   公共空间printMethod () {   system . out。println (“DynamicCreateBean成功”);   }   }      

<>强4。在本项目外另外新增一个项目打成jar的形式导入到该项目中用于测试动态加载,在我的项目中新增的是threadTest.jar,该包是一个用于多线程测试的类,需要的同学自己随便新建一个来打成jar包测试即可。

  

<强> 5。新增一个LoadBean.java类用于动态加载bean:

        进口org.springframework.beans.BeansException;   进口org.springframework.beans.factory.config.BeanFactoryPostProcessor;   进口org.springframework.beans.factory.config.ConfigurableListableBeanFactory;   进口org.springframework.beans.factory.support.BeanDefinitionBuilder;   进口org.springframework.beans.factory.support.DefaultListableBeanFactory;   进口org.springframework.stereotype.Component;   进口com.thread.mulitSynThreadTest.Run;/* *   * @author liaoyubo   * @version 1.0 2017/8/11   * @description   */@ component   公共类LoadBean实现BeanFactoryPostProcessor {   私人DefaultListableBeanFactory DefaultListableBeanFactory;   @Override   公共空间postProcessBeanFactory (ConfigurableListableBeanFactory ConfigurableListableBeanFactory)抛出BeansException {   this.defaultListableBeanFactory=(DefaultListableBeanFactory) configurableListableBeanFactory;   BeanDefinitionBuilder BeanDefinitionBuilder=BeanDefinitionBuilder.rootBeanDefinition (“com.springRedis.dynamic.DynamicCreateBean”);//用于设置指定的类中需要引入的其他bean//beanDefinitionBuilder.addPropertyValue (“otherBeanName”、“otherBeanName”);   this.defaultListableBeanFactory.registerBeanDefinition (“dynamicCreateBean beanDefinitionBuilder.getBeanDefinition ());   beanDefinitionBuilder=BeanDefinitionBuilder.rootBeanDefinition (Run.class.getName ());//用于设置指定的类中需要引入的其他bean//beanDefinitionBuilder.addPropertyValue (“otherBeanName”、“otherBeanName”);   this.defaultListableBeanFactory.registerBeanDefinition (“mulitRun beanDefinitionBuilder.getBeanDefinition ());   }   }      

<强> 6。创建测试类:

        进口com.springRedis.App;   进口com.springRedis.dynamic.DynamicCreateBean;   进口com.thread.mulitSynThreadTest.Run;   进口org.junit.Test;   进口org.junit.runner.RunWith;   进口org.springframework.beans.factory.annotation.Autowired;   进口org.springframework.boot.test.context.SpringBootTest;   进口org.springframework.test.context.junit4.SpringRunner;/* *   * @author liaoyubo   * @version 1.0 2017/8/11   * @description   */@RunWith (SpringRunner.class)   @SpringBootTest(类=App.class)   公开课MultiTest {   @ autowired   私人DynamicCreateBean DynamicCreateBean;   @ autowired   私人管理运行;   @Test   公共空间testDynamic () {   dynamicCreateBean.printMethod ();   run.printRun ();   }   }

弹簧动态加载bean后调用实现方法解析