今晚翻看了以前写的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的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
但如果这些定义分布在不同的配置文件中,或者通过编程方式动态添加,就可能导致容器内出现两个相同的Bean实例。 2. **@Autowired注解的误用**:Spring的自动装配机制可能导致Bean的多次实例化。如果一个BeanA依赖于...
Spring框架提供了多种方式来实现Bean,例如使用XML配置文件、使用Annotation配置等。 1. 使用XML配置文件:可以在XML配置文件中配置Bean的生命周期和作用域。 2. 使用Annotation配置:可以使用Annotation来配置Bean...
在提供的“BeanTest”文件中,我们可以预期看到一个简单的Spring Bean配置和测试示例。通常,这将包括以下部分: 1. **Bean定义**:Bean定义是Spring容器如何创建和管理Bean的描述。它可以是一个XML配置文件中的...
在Spring中,Bean的管理包含多个方面:创建Bean实例、配置Bean属性、控制Bean的生命周期以及Bean作用域的定义。接下来将详细解释这些知识点。 1. Spring的工厂类: Spring通过工厂模式设计了一系列工厂类来创建对象...
4. **AOP代理**:如果Bean配置了AOP相关的注解或切面,Spring会创建对应的代理对象,使得在调用Bean方法时能进行拦截处理。 在容器销毁阶段,Spring Bean会经历: 1. **清理回调**:当容器关闭时,如果Bean实现了`...
在本篇中,我们将深入探讨"Spring中的Bean"这一主题,包括Bean的定义、配置以及如何在实际应用中使用。 首先,我们需要理解什么是Spring中的Bean。在Spring中,Bean通常代表应用程序中的一个对象,这些对象由Spring...
这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...
"粗略实现spring创建bean"这个主题主要涉及到Spring如何初始化、配置以及管理Java对象,也就是我们所说的Bean。下面我们将深入探讨Spring Bean的生命周期、配置方式以及相关API。 1. Spring Bean 的生命周期 - ...
在IT领域,尤其是在Java开发中,Spring框架和...通过合理地配置Spring的AOP和事务管理,我们可以更专注于业务逻辑,而无需关心底层的事务控制细节。这使得Spring和Hibernate成为Java企业级应用开发中的首选工具。
2. **AOP(面向切面编程)**:通过Spring AOP,可以在特定的切点(如方法调用)执行拦截器逻辑,此时可以使用`@Autowired`获取所需的bean。创建一个切面,定义切点并实现所需逻辑,确保在多线程环境中正确处理bean。...
14. **非XML定义文件的配置方式**:除了传统的XML配置,Spring还支持.properties文件和Java配置类来定义Bean,使得配置更加灵活且类型安全。 通过学习和实践这些内容,开发者可以更好地理解和掌握Spring如何管理...
2. **Spring容器**:详细解析了Spring的Bean工厂和ApplicationContext容器,如何管理Bean的生命周期和装配,以及如何使用XML和Java配置方式定义Bean。 3. **AOP(面向切面编程)**:阐述了Spring的AOP模块,讲解...
- **事务管理**:Spring支持多种事务管理策略,如编程式事务管理和声明式事务管理。其中,声明式事务管理通过配置XML或注解实现,可以在不修改业务逻辑代码的情况下轻松地添加事务管理功能。 #### 五、实例应用场景...
根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...
在Java编程中,Spring框架是应用广泛的企业级开发工具,它提供了一种强大的依赖注入机制,使得开发者可以方便地管理并获取容器中的Bean。本文将详细介绍在Spring框架中获取配置Bean的三种主要方法。 1. **通过...
这是Spring Boot的核心特性之一,它使得我们能够以编程方式管理对象,而无需XML配置。让我们逐步解析这个过程。 首先,了解Spring Boot的基础。Spring Boot旨在简化Spring应用程序的初始设置和配置,通过“约定优于...
Spring框架是Java开发中广泛应用的轻量级...总结,Spring的基本配置涉及XML和Java配置方式,依赖注入,面向切面编程,以及Bean的生命周期管理等多个方面。理解并熟练运用这些概念,能够有效地构建和维护Spring应用。
在Spring框架中,Bean管理是核心功能之一,它允许开发者通过声明式的方式配置和管理对象。这个压缩包文件“spring管理bean应用实例代码”显然包含了关于如何在Spring中配置和使用Bean的示例代码。接下来,我们将深入...
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式配置每个Bean,而是通过指定包路径来让Spring自动发现和管理Bean。本文将深入探讨这个主题,帮助你更好地理解和应用这一功能。 首先,让...