`

编程式配置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的引用即可。
分享到:
评论

相关推荐

    spring4示例代码

    spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式进行AOP编程 spring-4 演示了spring与JDBCTemplate配合使用 spring-5 演示了声明式事务及使用xml配置文件处理事务

    Web框架编程-Spring框架编程

    请编程实现相关的接口和类,要求采用Spring框架技术中提供的控制反转和依赖注入的松耦合编程方法,使用基于Xml和Annotation的Bean装配方法来实现相关组件的生成,写出测试程序,运行查看其结果。 (2)使用Spring框架...

    Spring Security、Spring Social 、Spring Security OAuth

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    SpringSecurity.zip

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    Spring攻略PDF版

     3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   3.2.3 实现方法   3.3...

    Spring攻略中文版PDF

     3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   3.2.3 实现方法   3.3...

    Spring攻略英文版(附带源码)

     3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   3.2.3 实现方法   3.3 解决...

    史上最全 69 道 Spring 面试题和答案

    一张图搞懂Spring bean的完整生命周期。 9 Spring注解 13 Spring数据访问 14 Spring面向切面编程(AOP) 16 Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,...

    跟我学spring3(8-13)

    【第九章】 Spring的事务 之 9.3 编程式事务 ——跟我学spring3 【第九章】 Spring的事务 之 9.4 声明式事务 ——跟我学spring3 【第十章】集成其它Web框架 之 10.1 概述 ——跟我学spring3 【第十章】集成其它Web...

    SpringSecutiry实现认证授权功能,整合SpringBoot

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的...

    spring.doc

    2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认...

    Spring的学习笔记

    一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope...

    学习spring ioc和aop

    spring 核心功能演示项目 1. applicationContext xml方式和注解方式配置 2. pring bean循环依赖。 3. spring bean 启动顺序。...4. BeanDefinition编程式注入到容器。 5. spring aop 打印 6. spring 事务

    Spring 2.0 开发参考手册

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...

    跟我学spring3(8-13).pdf

    11.2 实现通用层 11.3 实现积分商城层 12.1 概述 12.2 注解实现Bean依赖注入 12.3 注解实现Bean定义 12.4 基于Java类定义Bean配置元数据 12.5 综合示例-积分商城 13.1 概述 13.2 单元测试 集成测试 ——跟我学spring3

    从零开始学Spring Boot

    1.19 Spring Boot使用Druid(编程注入) 1.20 Spring Boot普通类调用bean 1.21 使用模板(thymeleaf-freemarker) 1.22 Spring Boot 添加JSP支持 1.23 Spring Boot Servlet 1.24 Spring Boot过滤器、监听器 1.25 ...

    Spring学习总结(不含整合其他框架)

    文档对Spring的知识做了一个全面的总结,具体讲解Spring的控制反转、依赖注入、面向切面编程、Spring中的Bean配置、Spring对JDBC的支持以及Spring的声明式事务

    Spring+3.x企业应用开发实战光盘源码(全)

     第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。  第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们...

    Spring.3.x企业应用开发实战(完整版).part2

    2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖...

Global site tag (gtag.js) - Google Analytics