`
schy_hqh
  • 浏览: 543115 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

spring-获取工厂对象

 
阅读更多

获取Spring容器的工厂

 

方式一:

根据配置文件创建工厂并管理对象

这种方式与容器启动时创建的工厂是2个概念,在进行事务控制等方面会有问题!

仅测试用!

package com.hqh.student.ws;

import java.util.List;

import javax.jws.WebService;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hqh.student.model.Reward;
import com.hqh.student.model.Student;
import com.hqh.student.service.StudentService;


@WebService(endpointInterface="com.hqh.student.ws.IStudentWSService",
			serviceName="StudentWSService",
			portName="studentServicePort",
			targetNamespace="http://ws.student.hqh.com",
			wsdlLocation="META-INF/wsdl/student.wsdl")
public class StudentWSServiceImpl implements IStudentWSService{
	private static final BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
	public StudentWSServiceImpl() {
		if(studentService==null) {
			studentService = factory.getBean(StudentService.class);
		}
	}
	
	private StudentService studentService;
	
	@Override
	public Student getStudent(String number) {
		return studentService.getStudent(number);
	}

	@Override
	public List<Student> list() {
		return studentService.list();
	}

	@Override
	public List<Reward> listReward(String number, String year) {
		return studentService.listReward(number, year);
	}

}

 

 

 

方式二:

通过Servlet来获取

1、 创建一个Servlet用于在初始化servlet时,通过servlet的context获取到spring容器的工厂对象

package com.hqh.student.context;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * 根据Servlet的context对象获取spring工厂
 * 再将工厂设置到自己的工具类中
 * @author lenovo
 *
 */
public class InitContextServlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		WebApplicationContext ctx = 
				WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
		WebUtil.setWebAppContext(ctx);
		super.init();
	}

}

 

2、 获取到工厂对象后,将对象设置到自己的工具类中,以后直接从工具类中获取bean

package com.hqh.student.context;

import org.springframework.web.context.WebApplicationContext;

public class WebUtil {
	private static WebApplicationContext ctx;
	
	private WebUtil() {
		
	}
	
	public static void setWebAppContext(WebApplicationContext ctx) {
		System.out.println("------------------->>>>>>>>>>>WebUtil.setWebAppContext()");
		WebUtil.ctx = ctx;
	}
	
	public static WebApplicationContext getWebAppContext() {
		return ctx;
	}
	
	public static Object getBean(Class clazz) {
		return ctx.getBean(clazz);
	}
}

 

3、 web.xml配置servlet

<!-- 初始化Servlet,用于设置spring工厂 -->
<servlet>
	<servlet-name>InitContextServlet</servlet-name>
	<servlet-class>com.hqh.student.context.InitContextServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

 4、从工具类中获bean【定时任务,webservice等在没有通过注入方式初始化对象时,非常有用!】

private StudentService studentService;
	
	
@Override
public Student getStudent(String number) {
	studentService = (StudentService) WebUtil.getBean(StudentService.class);
	return studentService.getStudent(number);
}

 

 

方式三:

通过BeanFactoryAware接口来获取,该方式较第二种方式更简单些!

 

package com.hqh.student.context;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;

/**
 * 一定要加注解,声明该对象由spring管理
 * 否则,实现了BeanFactoryAware也不会将工厂注入
 * @author lenovo
 *
 */
@Component
public class BeanFactoryUtil implements BeanFactoryAware {

	private static BeanFactory factory;
	
	@Override
	public void setBeanFactory(BeanFactory factory) throws BeansException {
		System.out.println("------------------->>>>>>>>>>>BeanFactoryUtil.setBeanFactory()");
		this.factory = factory;
	}
	
	public static Object getBean(Class clazz) {
		return factory.getBean(clazz);
	}

}

 

 获取bean

private StudentService studentService;


@Override
public Student getStudent(String number) {
//	studentService = (StudentService) WebUtil.getBean(StudentService.class);
	studentService = (StudentService) BeanFactoryUtil.getBean(StudentService.class);
	return studentService.getStudent(number);
}

 

 

分享到:
评论

相关推荐

    Spring-IOC手动模拟实现-利用dom4解析xml文件

    /*模拟spring的实现 * 1.通过构造器获取配置文件 * 2.通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)...

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

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 ...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    一、Spring简介 1. 概述 ...工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --&gt; 面向切面编程

    Java基础 反射篇.md

    - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - 获取类的构造器(Constructor) - 获取注解 - 通过反射调用方法 - 反射的...

    Spring.html

    ClassPathXmlApplicationContext:使用这个工厂创建对象,他会根据scope智能判断是否懒加载,如果是单例则创建容器时就会创建里面bean的实例,如果是多例在获取使用时才会创建bean实例 ...

    Spring.NET 学习笔记—对象的创建

    的类型,但通过该对象定义的名称获取的则是由工厂方法所创建的对象)。工厂方法的产品对象可以是工 厂方法所在的类型,也可以是其它类型(按:很多情况下工厂方法位于单独的类型中) 通过实例都你从最基础的实例化...

    spring框架技术+第2天+xmind思维导图

    总结,我们会选择第一种方式,因为spring的存在就是要消除工厂模式,因为工厂本身就会在每次调用时new出对象,只是把new的工作换了个地方而已。bean作用域singleton prototype;bean作用域request session global...

    spring chm文档

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...

    Spring 2.0 开发参考手册

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...

    Spring攻略(第二版 中文高清版).part1

    3.12 将Spring Bean注入领域对象 147 3.12.1 问题 147 3.12.2 解决方案 147 3.12.3 工作原理 148 3.13 小结 151 第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决...

    Spring面试题

    Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。...

    Spring中文帮助文档

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    Spring in Action(第2版)中文版

    12.1.3在spring2中注入jndi对象 12.2发送电子邮件 12.2.1配置邮件发送器 12.2.2构建电子邮件 12.3调度任务 12.3.1使用javatimer调度任务 12.3.2使用quartz调度器 12.3.3按调度计划调用方法 12.4使用jmx管理...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    Spring in Action(第二版 中文高清版).part2

    12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 ...

    Spring in Action(第二版 中文高清版).part1

    12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 ...

    Struts2 + Spring2.5 + JFreeChart 实现的投票系统,2008年高考作文评价投票

    TouPiaoDatasets对象中的各个静态方法获取保存在application中的投票数据,并生成各个图表需要用到的数据集。 TouPiaoJFreeChartFactory对象使用 TouPiaoDatasets对象中的相应数据集生成各种图表对象。 ...

    Spring攻略(第二版 中文高清版).part2

    3.12 将Spring Bean注入领域对象 147 3.12.1 问题 147 3.12.2 解决方案 147 3.12.3 工作原理 148 3.13 小结 151 第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决...

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

    1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 ...

    java8源码-Spring5:Spring5新特性

    加载配置文件时候不会创建对象,获取对象时后才会创建。 ApplicationContext:BeanFactory的子接口,提供更多强大的功能,一般是开发人员使用 加载配置文件时候会创建对象。一般采用这种,将耗时放在启动时候 ...

Global site tag (gtag.js) - Google Analytics