`

编程式配置Spring bean

    博客分类:
  • java
阅读更多
今晚翻看了以前写的RPC框架。发现这个框架中编程式配置Spring bean的技巧还是比较通用的,其他的一些框架或基础服务可能也会用到。记得当时也是从Struts2的代码里找到的,在此先做下记录,以供以后参考。
public class RpcMethodHelper implements ApplicationContextAware {
	protected static final Logger logger = LoggerFactory.getLogger(RpcMethodHelper.class);

	protected ApplicationContext appContext;
	protected AutowireCapableBeanFactory autoWiringFactory;
	protected int autowireStrategy = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;

	/**
	 * 初始化Action如果已经在spring中注册过则从spring容器中得到Action实例, 如果spring容器中没有注册则先注册并返回实例
	 * 返回的Action实例已经注入了依赖的其他对象及请求参数
	 * 
	 * @param <T>
	 * @param clazz
	 * @return
	 */
	protected <T> T createAction(Class<T> clazz) {
		T action = null;
		String beanName = clazz.getName();
		try {
			logger.debug("Trying the application context... appContext = {},\n bean name = {}" ,appContext,beanName);
			action = clazz.cast(appContext.getBean(beanName));//先从spring容器中得到bean
		} catch (NoSuchBeanDefinitionException e) {
			//如果spring容器中没有注册则先注册并返回实例
			logger.debug("Did not find bean definition for bean named {}, creating a new one...",beanName);

			if (autoWiringFactory instanceof BeanDefinitionRegistry) {
				BeanDefinitionRegistry registry = (BeanDefinitionRegistry) autoWiringFactory;
				RootBeanDefinition def = new RootBeanDefinition(clazz,
						autowireStrategy);//设置autowire策略,根据具体应用来决定
				// def.setSingleton(false);
				def.setScope("prototype");//这里的scope类型可以根据需要设置
				logger.debug("Registering a new bean definition for class "
						+ beanName);

				registry.registerBeanDefinition(beanName, def);
				try {
					
					action = clazz.cast(appContext.getBean(beanName));
				} catch (NoSuchBeanDefinitionException e2) {
					logger.warn("Could not register new bean definition for bean {}"
									,beanName);
				}

			}
		}
		return action;
	}

	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		appContext = context;
		autoWiringFactory = findAutoWiringBeanFactory(this.appContext);
	}

	/**
	 * 
	 * @see com.opensymphony.xwork2.spring.SpringObjectFactory#findAutoWiringBeanFactory
	 * @param context
	 */
	protected AutowireCapableBeanFactory findAutoWiringBeanFactory(
			ApplicationContext context) {
		if (context instanceof AutowireCapableBeanFactory) {
			// Check the context
			return (AutowireCapableBeanFactory) context;
		} else if (context instanceof ConfigurableApplicationContext) {
			// Try and grab the beanFactory
			return ((ConfigurableApplicationContext) context).getBeanFactory();
		} else if (context.getParent() != null) {
			// And if all else fails, try again with the parent context
			return findAutoWiringBeanFactory(context.getParent());
		}
		return null;
	}

	/**
	 * Sets the autowiring strategy
	 * 
	 * @see com.opensymphony.xwork2.spring.SpringObjectFactory#setAutowireStrategy
	 * @param autowireStrategy
	 */
	public void setAutowireStrategy(int autowireStrategy) {
		switch (autowireStrategy) {
		case AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT:
			logger.info("Setting autowire strategy to autodetect");
			this.autowireStrategy = autowireStrategy;
			break;
		case AutowireCapableBeanFactory.AUTOWIRE_BY_NAME:
			logger.info("Setting autowire strategy to name");
			this.autowireStrategy = autowireStrategy;
			break;
		case AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE:
			logger.info("Setting autowire strategy to type");
			this.autowireStrategy = autowireStrategy;
			break;
		case AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR:
			logger.info("Setting autowire strategy to constructor");
			this.autowireStrategy = autowireStrategy;
			break;
		default:
			throw new IllegalStateException("Invalid autowire type set");
		}
	}
}

使用方式:
1.上面的RpcMethodHelper本身也应该配置到spring容器中
<bean id="rpcMethodHelper" class="com.niagara.rpc.RpcMethodHelper"></bean>

2.如果不想将上面的类配置为Spring bean,那只要在工具类中得到ApplicationContext的引用即可。
分享到:
评论

相关推荐

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    但如果这些定义分布在不同的配置文件中,或者通过编程方式动态添加,就可能导致容器内出现两个相同的Bean实例。 2. **@Autowired注解的误用**:Spring的自动装配机制可能导致Bean的多次实例化。如果一个BeanA依赖于...

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring框架提供了多种方式来实现Bean,例如使用XML配置文件、使用Annotation配置等。 1. 使用XML配置文件:可以在XML配置文件中配置Bean的生命周期和作用域。 2. 使用Annotation配置:可以使用Annotation来配置Bean...

    Spring Bean简单应用实例

    在提供的“BeanTest”文件中,我们可以预期看到一个简单的Spring Bean配置和测试示例。通常,这将包括以下部分: 1. **Bean定义**:Bean定义是Spring容器如何创建和管理Bean的描述。它可以是一个XML配置文件中的...

    Spring bean 管理

    在Spring中,Bean的管理包含多个方面:创建Bean实例、配置Bean属性、控制Bean的生命周期以及Bean作用域的定义。接下来将详细解释这些知识点。 1. Spring的工厂类: Spring通过工厂模式设计了一系列工厂类来创建对象...

    Spring Bean 的生命周期

    4. **AOP代理**:如果Bean配置了AOP相关的注解或切面,Spring会创建对应的代理对象,使得在调用Bean方法时能进行拦截处理。 在容器销毁阶段,Spring Bean会经历: 1. **清理回调**:当容器关闭时,如果Bean实现了`...

    spring中的bean

    在本篇中,我们将深入探讨"Spring中的Bean"这一主题,包括Bean的定义、配置以及如何在实际应用中使用。 首先,我们需要理解什么是Spring中的Bean。在Spring中,Bean通常代表应用程序中的一个对象,这些对象由Spring...

    Java中Spring获取bean方法小结

    这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...

    粗略实现spring创建bean

    "粗略实现spring创建bean"这个主题主要涉及到Spring如何初始化、配置以及管理Java对象,也就是我们所说的Bean。下面我们将深入探讨Spring Bean的生命周期、配置方式以及相关API。 1. Spring Bean 的生命周期 - ...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    在IT领域,尤其是在Java开发中,Spring框架和...通过合理地配置Spring的AOP和事务管理,我们可以更专注于业务逻辑,而无需关心底层的事务控制细节。这使得Spring和Hibernate成为Java企业级应用开发中的首选工具。

    线程中获取spring 注解bean

    2. **AOP(面向切面编程)**:通过Spring AOP,可以在特定的切点(如方法调用)执行拦截器逻辑,此时可以使用`@Autowired`获取所需的bean。创建一个切面,定义切点并实现所需逻辑,确保在多线程环境中正确处理bean。...

    Spring中关于Bean的管理的课件

    14. **非XML定义文件的配置方式**:除了传统的XML配置,Spring还支持.properties文件和Java配置类来定义Bean,使得配置更加灵活且类型安全。 通过学习和实践这些内容,开发者可以更好地理解和掌握Spring如何管理...

    Spring5高级编程第五版 英文版

    2. **Spring容器**:详细解析了Spring的Bean工厂和ApplicationContext容器,如何管理Bean的生命周期和装配,以及如何使用XML和Java配置方式定义Bean。 3. **AOP(面向切面编程)**:阐述了Spring的AOP模块,讲解...

    Spring 最全约束配置文件

    - **事务管理**:Spring支持多种事务管理策略,如编程式事务管理和声明式事务管理。其中,声明式事务管理通过配置XML或注解实现,可以在不修改业务逻辑代码的情况下轻松地添加事务管理功能。 #### 五、实例应用场景...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    Java获取Spring中配置的Bean的三种方式

    在Java编程中,Spring框架是应用广泛的企业级开发工具,它提供了一种强大的依赖注入机制,使得开发者可以方便地管理并获取容器中的Bean。本文将详细介绍在Spring框架中获取配置Bean的三种主要方法。 1. **通过...

    41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    这是Spring Boot的核心特性之一,它使得我们能够以编程方式管理对象,而无需XML配置。让我们逐步解析这个过程。 首先,了解Spring Boot的基础。Spring Boot旨在简化Spring应用程序的初始设置和配置,通过“约定优于...

    Spring的基本配置

    Spring框架是Java开发中广泛应用的轻量级...总结,Spring的基本配置涉及XML和Java配置方式,依赖注入,面向切面编程,以及Bean的生命周期管理等多个方面。理解并熟练运用这些概念,能够有效地构建和维护Spring应用。

    spring管理bean应用实例代码

    在Spring框架中,Bean管理是核心功能之一,它允许开发者通过声明式的方式配置和管理对象。这个压缩包文件“spring管理bean应用实例代码”显然包含了关于如何在Spring中配置和使用Bean的示例代码。接下来,我们将深入...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式配置每个Bean,而是通过指定包路径来让Spring自动发现和管理Bean。本文将深入探讨这个主题,帮助你更好地理解和应用这一功能。 首先,让...

Global site tag (gtag.js) - Google Analytics