`
hpgary
  • 浏览: 78755 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring Boot 动态创建Bean

    博客分类:
  • Java
阅读更多

1、通过注解@Import导入方式创建

a、新建MyImportBeanDefinitionRegistrar注册中心

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

import web0.services.Myservice;


public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	protected String BEAN_NAME = "myservice";

	public void dynamicConfiguration() throws Exception {
	}
	
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		if (!registry.containsBeanDefinition(BEAN_NAME)) {
			GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
			beanDefinition.setBeanClass(Myservice.class);
			beanDefinition.setSynthetic(true); 
			registry.registerBeanDefinition(BEAN_NAME, beanDefinition);
		}
	}
}

 b、在配置类上加@Import引入上面的类

@Import(MyImportBeanDefinitionRegistrar.class)
public class TestConfig{
}

 c、这样操作后就可以使用spring的方式获取该bean了

 

 

d、使用自定义工厂创建bean

 

public class JdbcPlusBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

		AnnotationAttributes annoAttrs = AnnotationAttributes
				.fromMap(importingClassMetadata.getAnnotationAttributes(JdbcMapperScan.class.getName()));

		FastClasspathScanner scanner = new FastClasspathScanner(annoAttrs.getStringArray("value"));
		List<String> classes = scanner.scan().getNamesOfAllClasses();
		for (String className : classes) {
			Class<?> clazz = MethodHandler.initClass(className);
			if (null != clazz) {
				String simpleName = clazz.getSimpleName();
				String beanName = StringUtils.substring(simpleName, 0, 1).toLowerCase()
						+ StringUtils.substring(simpleName, 1);

				if (!registry.containsBeanDefinition(beanName)) {
					
					RootBeanDefinition definition = new RootBeanDefinition(  );
					/*JdbcPlusFactoryBean是spring工厂*/
					definition.setBeanClass( JdbcPlusFactoryBean.class );
					
					ConstructorArgumentValues argumentValues = new ConstructorArgumentValues();
					/*clazz 是要实例化的类*/
					argumentValues.addGenericArgumentValue( clazz );
					
					definition.setConstructorArgumentValues(argumentValues); 
					
					definition.setRole( BeanDefinition.ROLE_INFRASTRUCTURE );
					
					registry.registerBeanDefinition(beanName, definition);  
				}
			}
		}
	}

}

 jdbcplus工厂:

public class JdbcPlusFactoryBean<T> implements FactoryBean<T> {

	protected Class<T> mapperInterface;

	public JdbcPlusFactoryBean() {
	}

	public JdbcPlusFactoryBean(Class<T> mapperInterface) {
		this.mapperInterface = mapperInterface;
	}

	@Override
	public T getObject() throws Exception {
		return MethodProxy.newInstance(mapperInterface) ;
	}

	@Override
	public Class<?> getObjectType() {
		return mapperInterface;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

}

 

分享到:
评论

相关推荐

    JSP 开发之Spring Boot 动态创建Bean

    主要介绍了JSP 开发之Spring Boot 动态创建Bean的相关资料,需要的朋友可以参考下

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。

    Spring Boot如何动态创建Bean示例代码

    主要给大家介绍了关于Spring Boot如何动态创建Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    Spring boot 示例 官方 Demo

    spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...

    spring创建bean简单示例

    spring创建bean简单示例

    Spring Boot 2 Recipes

    获取Spring Boot 2微框架的可重用代码配方和代码段 了解Spring Boot 2如何与其他Spring API,工具和框架集成 ...使用Spring Boot集成企业服务以创建更复杂的Java应用程序 本书适用于经验丰富的Java和Spring程序员。

    spring运行过程中动态注册bean

    spring运行过程中动态注册bean,代码实例

    Beginning Spring Boot 2

    Beginning Spring Boot 2 Beginning Spring Boot 2 Beginning Spring Boot 2

    spring boot 42讲配套源码.zip

    第 2-10 课: 使用 Spring Boot WebSocket 创建聊天室/spring-boot-websocket 第 2-2 课 Spring Boot 项目中使用 JSP/spring-boot-jsp 第 2-3 课 模板引擎 Thymeleaf 基础使用/spring-boot-thymeleaf 第 2-4 课 ...

    基于 Spring Boot + MySQL 开发的博客系统源码.zip

    基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring ...

    基于spring boot餐厅管理系统源码.zip

    基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 ...

    Spring cloud和Spring boot介绍

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...

    spring动态向容器中添加bean和删除指定bean.md

    spring动态向容器中添加bean和删除指定bean,不需要重启应用

    spring boot 高清带目录手册

    Spring Boot 使创建独立的、产品级的、基于Spring的应用变得更容易,你只需要运行run即可...你可以使用Spring Boot创建Java应用,用java-jar或更传统的war包来部署应用。我们也提供了运行”Spring脚本”的命令行工具。

    Spring Boot视频教程大合集,完美帮助你学习Spring Boot,百度网盘

    Spring Boot视频教程大合集,完美帮助你学习Spring Boot,内部有3套Spring Boot学习视频教程,另附一篇Security Oauth2.0认证授权视频教程

    关于spring boot中几种注入方法的一些个人看法

    主要给大家介绍了关于spring boot中几种注入方法的一些个人看法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Spring Boot 2.X 实战教程.pdf

    本课程内容包括Spring简介、Spring Boot简介、安装JDK、安装Maven、第一个Spring Boot程序(使用Spring Initializr构建、Spring Boot代码讲解、安装Notepad++)、构建系统、代码、配置、三种方式运行程序、安装...

    Pro Spring Boot(Apress,2016)

    Pro Spring Boot is your authoritative hands-on practical guide for increasing your Spring Framework-based enterprise Java and cloud application productivity while decreasing development time using the...

Global site tag (gtag.js) - Google Analytics