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

通过Import 注解动态创建bean实例

 
阅读更多

通过 @Import 注解动态创建bean实例主要有四种方式:

        导入普通java类,将其作为Spring bean注入到Spring容器中。

        导入 @Configuration 注解标注的配置类。

        导入实现ImportBeanDefinitionRegistrar接口的实现类。

        导入实现ImportSelector接口的实现类。

 

1、导入普通Java类

    配置类:

@Configuration
@Import({Role.class}) //导入普通Java类
class ImportAnnotationConfig {
	
}

    测试代码:

//AnnotationConfigApplicationContext默认会扫描以下注解类:Component、Configuration等
AnnotationConfigApplicationContext applicationContext 
	= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);
		
Role role3 = applicationContext.getBean(Role.class);
System.out.println(role3.getName());

 

2、导入配置类

public interface CountryMapper {
	void show();
}

class CountryMapperImpl2 implements CountryMapper {
	@Override
	public void show(){
		System.out.println("CountryMapperImpl2.show()");
	}
}

@Configuration
class ImportAnnotationConfig2 {
	@Bean
	public CountryMapper getCountryMapper(){
		CountryMapper countryMapper = new CountryMapperImpl2();
		return countryMapper;
	}
}


@Configuration
@Import({ImportAnnotationConfig2.class}) //导入配置类
class ImportAnnotationConfig {
	@Bean
	public User getUser(){
		User user = new User();
		user.setUsername("uid");
		user.setPassword("pwd");
		return user;
	}
}


//测试代码
AnnotationConfigApplicationContext applicationContext 
	= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);

User user = applicationContext.getBean(User.class);
System.out.println(user.getUsername());
System.out.println(user.getPassword());

CountryMapper countryMapper = applicationContext.getBean(CountryMapper.class);
countryMapper.show();
System.out.println(countryMapper.getUser());

 

3、导入ImportBeanDefinitionRegistrar的实现类

class ImportAnnotationRegistrar implements ImportBeanDefinitionRegistrar{
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		String beanName = "testRole";
		if(!registry.containsBeanDefinition(beanName)){
	    	BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Role.class);
	    	
	    	GenericBeanDefinition beanDefinition = (GenericBeanDefinition)builder.getRawBeanDefinition();
	    	beanDefinition.setBeanClass(Role.class);
	    	beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
	    	
	    	//设置bean对象的属性值
	    	beanDefinition.getPropertyValues().add("name", "Test");
	    	
	    	registry.registerBeanDefinition(beanName, beanDefinition);
    	}
	}
}

@Configuration
@Import({ImportAnnotationRegistrar.class}) //导入ImportBeanDefinitionRegistrar实现类
class ImportAnnotationConfig {
 
}

//测试代码
AnnotationConfigApplicationContext applicationContext 
	= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);

Role role = applicationContext.getBean("testRole", Role.class);
System.out.println(role.getName());

 

4、导入ImportSelector的实现类

class ImportAnnotationSelector implements ImportSelector{
	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//可以是Register实现类、配置类、普通Java类
		String[] array = {
			ImportAnnotationRegistrar.class.getName(),
			ImportAnnotationConfig2.class.getName(),
			Role.class.getName()
		};
		return array;
	}
}

@Configuration
@Import({ImportAnnotationSelector.class})
class ImportAnnotationConfig {

}

//测试代码
AnnotationConfigApplicationContext applicationContext 
	= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);

Role role = applicationContext.getBean("testRole", Role.class);
System.out.println(role.getName());

Role role2 = applicationContext.getBean(Role.class.getName(), Role.class);
System.out.println(role2.getName());

CountryMapper countryMapper = applicationContext.getBean(CountryMapper.class);
countryMapper.show();

 

分享到:
评论

相关推荐

    Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 组件。EJB 由封装业务逻辑的方法组成。譬如说,EJB 可能有这样的业务逻辑:

    要指定容器在某个方法完成后删除有状态的会话bean实例,只要为该方法添加注释@Remove。 会话 bean示例如下: import javax.ejb.Stateless.*; /*A simple stateless session bean implementing the increment...

    Spring.html

    ClassPathXmlApplicationContext:使用这个工厂创建对象,他会根据scope智能判断是否懒加载,如果是单例则创建容器时就会创建里面bean的实例,如果是多例在获取使用时才会创建bean实例 ...

    Spring MVC 入门实例

    6 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 7 8 9 <value>/WEB-INF/jdbc.properties 10 11 12 </bean> 13 14 它配置了以下功能:...

    SpringMVC自定义属性编辑器详解及实例

    SpringMVC自定义属性编辑器详解及实例 自定义springMVC的属性编辑器主要有两种方式,一种是使用@InitBinder标签在运行期注册一个属性编辑器,这种编辑器只在当前Controller里面有效;还有一种是实现自己的 ...

    memcached1

    我们首先把TBean的一个实例放入缓存中,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生...

    jsp servlet 入门学习资料-新手一看就懂

    6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 6.6 使用JavaBean 6.7 内置对象 6.7.1 用request对象获取客户端的数据 6.7.2 用response对象向客户端发送信息 6.7.3 其他内置对象 6.8 ...

    JSP高级教程

    6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 6.6 使用JavaBean 6.7 内置对象 6.7.1 用request对象获取客户端的数据 6.7.2 用response对象向客户端发送信息 6.7.3 其他内置对象 6.8 ...

    jsp从入门到高级编程

    6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 6.6 使用JavaBean 6.7 内置对象 6.7.1 用request对象获取客户端的数据 6.7.2 用response对象向客户端发送信息 6.7.3 其他内置对象 6.8 ...

    总结Spring注解第一篇

    @ComponentScan @Configuration @Conditional @Retention @Documented @Target @Inherited @Bean @Import等注解含义的总结和个人理解: 包扫描@ComponentScan+组件标注注解(@Controller/@Service/@Repository/@...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet:!%> 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    13.3.9、<c:import>标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet:!%> 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet:!%> 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    13.3.9、<c:import>标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet:!%> 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    李兴华Java Web开发实战经典(高清版) Part2

    13.3.9、<c:import>标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置...

    JSP高级编程

    6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 6.6 使用JavaBean 6.7 内置对象 6.7.1 用request对象获取客户端的数据 6.7.2 用response对象向客户端发送信息 6.7.3 其他内置对象 ...

    java web 视频、电子书、源码(李兴华老师出版)

    13.3.9、<c:import>标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置...

Global site tag (gtag.js) - Google Analytics