`
raymond.chen
  • 浏览: 1436876 次
  • 性别: 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();

 

分享到:
评论

相关推荐

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...

    JSP 开发之Spring Boot 动态创建Bean

    在Spring Boot中,可以通过@Import注解来导入实现ImportBeanDefinitionRegistrar接口的类,从而实现动态创建Bean的目的。 首先,创建一个实现ImportBeanDefinitionRegistrar接口的类,它允许在运行时注册Bean定义。...

    详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    在Spring Boot应用中,我们可以使用Java代码来创建和注册Bean,这种方式相较于XML和注解配置提供了更高的灵活性。从Spring 3.0开始,引入了Java配置,使得开发人员可以直接通过编程的方式来定义Bean Definition,而...

    Spring框架JavaConfig注解配置方式实例

    这样,我们可以通过Java代码来创建bean实例,而不是XML配置文件。 4. `@Autowired`:自动装配bean,Spring会自动寻找合适的依赖注入。可以用于字段、方法或方法参数级别,以实现依赖注入。 5. `@Qualifier`:当有多...

    利用jaxb实现xml和bean互转

    4. **Marshalling**: 使用`Marshaller`对象将Java Bean实例转换为XML字符串或写入文件。 5. **Unmarshalling**: 使用`Unmarshaller`对象将XML字符串或文件解析回Java Bean实例。 6. **绑定文件(bindings file)**...

    Java ejbCreate函数初始化EJB的一个代码实例

    ejbCreate是早期版本EJB(如EJB 2.x)中的一个生命周期回调方法,用于在bean实例创建时执行特定的初始化逻辑。在本文中,我们将深入探讨ejbCreate函数及其在EJB初始化过程中的作用,并通过一个具体的代码实例来理解...

    Spring Bean管理注解方式代码实例

    Spring Bean 管理注解方式代码实例 Spring Bean 管理注解方式代码实例是 Spring 框架中的一种常见的 Bean 管理方式。通过使用注解的方式,可以简化 Bean 的配置和管理过程。这篇文章将详细介绍 Spring Bean 管理...

    Spring 源码分析(Bean的初始化)

    在Spring框架中,Bean的初始化是一个至关重要的过程,它涉及到从XML配置文件或者注解中读取Bean的定义,解析并构建Bean实例。本篇文章主要分析了Spring如何通过`ClassPathXmlApplicationContext`来启动和初始化Bean...

    EJB3 示例有状态和无状态会话bean

    在EJB3中,我们通过在接口上添加`@Stateless`注解来定义一个无状态会话Bean。 ### 4. 测试EJB3会话Bean 在给定的描述中提到的`Test.jsp`是一个用于测试远程无状态会话bean的页面。这个页面通常会被包含在Web应用...

    EJB3.0开发Session Bean.rar

    EJB 3.0引入了多种注解,如`@Stateless`, `@Stateful`, `@Singleton`, `@LocalBean`, `@Remote`等,使得开发者可以通过在类和方法上添加注解来声明Bean的行为和接口。 **5. 依赖注入** 依赖注入允许Bean自动获取所...

    Spring 应用上下文获取 Bean 的常用姿势实例总结

    Spring 应用上下文获取 Bean 的常用姿势实例总结 Spring 应用上下文获取 Bean 是一个常见的操作,在 Spring 框架中获取 Bean 对象是非常重要的。本文将总结 Spring 应用上下文获取 Bean 的常用姿势实例,并对其...

    丛林探险之Spring自定义注解加载Bean

    5. Spring根据生成的Bean定义创建和初始化Bean实例。 这个机制在实际开发中有着广泛的应用,比如在微服务框架如Dubbo中,通过自定义注解可以方便地将服务提供者和服务消费者自动注册到Spring容器,简化配置,提高...

    SPring注解及页面跳转实例

    ### Spring MVC 注解及页面跳转实例解析 #### 一、Spring MVC 页面跳转实例概述 在本实例中,我们将构建一个简单的Spring MVC应用程序,演示如何处理HTTP请求并实现页面跳转。通过这个实例,我们可以了解Spring ...

    java源码:Message-Driven Bean EJB实例源代码.zip

    Message-Driven Bean是一种无状态的会话Bean,它通过接收和处理JMS消息来响应业务事件。MDB是异步的,这意味着它们在接收到消息时不会阻塞调用线程,而是由JMS提供程序在后台处理。这种设计使得应用程序能够处理大量...

    简单手写springIOC注解模式

    例如,`@Scope("prototype")`表示每次请求都会创建一个新的Bean实例。 3. **@Autowired**: Spring通过此注解实现依赖注入。Spring会根据类型或名称自动匹配并注入依赖。如果需要基于名称注入,可以添加`@Qualifier...

    Message-Driven Bean EJB实例源代码.rar

    **消息驱动Bean(Message-Driven Bean,MDB)是Java企业版(Enterprise JavaBeans,EJB)规范中的一个重要组件,主要用于处理消息队列中的消息。在Java应用中,MDB扮演着异步服务的角色,它可以接收并处理JMS(Java ...

    JavaXml及Bean互转

    - 创建`JAXBContext`实例,它负责解析注解并生成必要的转换元数据。 - 使用`Marshaller`和`Unmarshaller`进行XML与Bean的转换。 3. **示例**: ```java import javax.xml.bind.JAXBContext; import javax.xml....

    基于Java的实例源码-ejbCreate函数用于初始化一个EJB实例.zip

    由于无状态会话bean不维护任何客户端状态,所以每个客户端请求都会创建一个新的bean实例,`ejbCreate`在此时发挥作用。例如,你可以使用`ejbCreate`来加载初始数据、设置默认值或者订阅事件。 对于有状态会话bean,...

    orika Java实例Demo

    Orika是一个自动Java Bean映射器,它可以将一个Java Bean实例的属性值自动复制到另一个具有相似结构的Bean实例中。Orika的核心功能是基于源对象创建目标对象,同时保持数据的一致性。它支持基本类型、复杂类型、集合...

    消息驱动bean EJB 3.0

    - **创建**: 应用服务器根据部署信息创建MDB 实例。 - **激活**: 当消息到达时,应用服务器会将实例放入可用状态并调用`onMessage()` 方法。 - **钝化/销毁**: 当消息处理完毕或达到预设限制后,实例可能被钝化,以...

Global site tag (gtag.js) - Google Analytics