Spring动态加载bean后调⽤实现⽅法解析
前⾔
在使⽤Spring的过程中,我们有时候并不想通过xml的⽅式进⾏bean的注⼊,希望在不改变原有的程序结构的基础上添加我们需要的bean,这个时候我们可以利⽤Spring的spring-beans的jar包⾥提供的BeanFactoryPostProcessor接⼝类,通过实现这个接⼝类,我们可以动态的加载所需要的bean,特别是在引⼊已经打包在jar⾥⾯的程序⽽没有办法做出修改的情况下,这个接⼝就为我们提供了及其⽅便的⼊⼝。
因为我是在其他项⽬的基础上测试的这个接⼝,所以引⼊的jar有其特殊性,所以需要参考的同学可以按照⾃⼰的需求来实现。spring怎么读取jar文件
1.通过l来引⼊springboot:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.thread</groupId>
<artifactId>test</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>f:/threadTest.jar</systemPath>
</dependency>
</dependencies>
2.创建App.java启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author liaoyubo
* @version 1.0 2017/7/31
* @description
*/
@SpringBootApplication
public class App {
public static void main(String [] args){
SpringApplication.run(App.class);
}
}
3.创建⼀个DynamicCreateBean.java来作为动态加载的对象:
public class DynamicCreateBean {
public void printMethod(){
System.out.println("DynamicCreateBean Success");
}
}
4.在本项⽬外另外新增⼀个项⽬打成jar的形式导⼊到该项⽬中⽤于测试动态加载,在我的项⽬中新增的是threadTest.jar,该包是⼀个⽤于多线程测试的类,需要的同学⾃⼰随便新建⼀个来打成jar包测试即可。
5.新增⼀个LoadBean.java类⽤于动态加载bean:
import org.springframework.beans.BeansException;
import org.springframework.fig.BeanFactoryPostProcessor;
import org.springframework.fig.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.stereotype.Component;
import com.thread.mulitSynThreadTest.Run;
/**
* @author liaoyubo
* @version 1.0 2017/8/11
* @description
*/
@Component
public class LoadBean implements BeanFactoryPostProcessor {
private DefaultListableBeanFactory defaultListableBeanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
this.defaultListableBeanFactory = (DefaultListableBeanFactory)configurableListableBeanFactory;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinition("com.springRedis.dynamic.DynamicCreateBean"); //⽤于设置指定的类中需要引⼊的其他bean
//beanDefinitionBuilder.addPropertyValue("otherBeanName","otherBeanName");
isterBeanDefinition("dynamicCreateBean",BeanDefinition());
beanDefinitionBuilder = BeanDefinition(Name());
//⽤于设置指定的类中需要引⼊的其他bean
/
/beanDefinitionBuilder.addPropertyValue("otherBeanName","otherBeanName");
isterBeanDefinition("mulitRun",BeanDefinition());
}
}
6.创建测试类:
import com.springRedis.App;
import com.springRedis.dynamic.DynamicCreateBean;
import com.thread.mulitSynThreadTest.Run;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import st.context.junit4.SpringRunner;
/**
* @author liaoyubo
* @version 1.0 2017/8/11
* @description
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class MultiTest {
@Autowired
private DynamicCreateBean dynamicCreateBean;
@Autowired
private Run run;
@Test
public void testDynamic(){
dynamicCreateBean.printMethod();
run.printRun();
}
}
以上就是整个的动态加载过程,如果需要了解更多,可以在⽹上继续查资料。
最近在看spring cloud Feign相关⽂章时发现了另外⼀种注⼊动态bean的⽅式,⾥⾯的代码提供是在FeignClientsRegistrar.java类中
具体代码为:
private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map<String, Object> attributes) { String className = ClassName();
BeanDefinitionBuilder definition = icBeanDefinition(FeignClientFactoryBean.class);
this.validate(attributes);
definition.addPropertyValue("url", Url(attributes));
definition.addPropertyValue("path", Path(attributes));
String name = Name(attributes);
definition.addPropertyValue("name", name);
definition.addPropertyValue("type", className);
definition.addPropertyValue("decode404", ("decode404"));
definition.addPropertyValue("fallback", ("fallback"));
definition.addPropertyValue("fallbackFactory", ("fallbackFactory"));
definition.setAutowireMode(2);
String alias = name + "FeignClient";
AbstractBeanDefinition beanDefinition = BeanDefinition();
boolean primary = ((("primary")).booleanValue();
beanDefinition.setPrimary(primary);
String qualifier = Qualifier(attributes);
if(StringUtils.hasText(qualifier)) {
alias = qualifier;
}
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[]{alias}); isterBeanDefinition(holder, registry);
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论