通过 @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();
相关推荐
要指定容器在某个方法完成后删除有状态的会话bean实例,只要为该方法添加注释@Remove。 会话 bean示例如下: import javax.ejb.Stateless.*; /*A simple stateless session bean implementing the increment...
ClassPathXmlApplicationContext:使用这个工厂创建对象,他会根据scope智能判断是否懒加载,如果是单例则创建容器时就会创建里面bean的实例,如果是多例在获取使用时才会创建bean实例 ...
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的属性编辑器主要有两种方式,一种是使用@InitBinder标签在运行期注册一个属性编辑器,这种编辑器只在当前Controller里面有效;还有一种是实现自己的 ...
我们首先把TBean的一个实例放入缓存中,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生...
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 ...
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 ...
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 ...
@ComponentScan @Configuration @Conditional @Retention @Documented @Target @Inherited @Bean @Import等注解含义的总结和个人理解: 包扫描@ComponentScan+组件标注注解(@Controller/@Service/@Repository/@...
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、...
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、设置...
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、...
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、...
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、设置...
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、...
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
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、设置...
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 其他内置对象 ...
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、设置...