`
littie1987
  • 浏览: 133442 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Spring在web应用中获得Bean的方法

阅读更多

一:使用ApplicationContext获得Bean

首先新建一个类,该类必须实现ApplicationContextAware接口,改接口有一个方法,public void setApplicationContext(ApplicationContext applicationContext)throws BeansException ,

也就是说框架会自动调用这个方法返回一个ApplicationContext对象。具体类如下:

 

public class SpringContextUtils implements ApplicationContextAware{//Spring的工具类,用来获得配置文件中的bean
	
	private static ApplicationContext applicationContext = null;

	/***
	 * 当继承了ApplicationContextAware类之后,那么程序在调用
	 * getBean(String)的时候会自动调用该方法,不用自己操作
	 */
	public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
		SpringContextUtils.applicationContext = applicationContext;
	}
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	/***
	 * 根据一个bean的id获取配置文件中相应的bean
	 * @param name
	 * @return
	 * @throws BeansException
	 */
	public static Object getBean(String name) throws BeansException {
		return applicationContext.getBean(name);
	}
	/***
	 * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。
	 * @param name
	 * @param requiredType
	 * @return
	 * @throws BeansException
	 */
	public static Object getBean(String name, Class requiredType) throws BeansException {
		return applicationContext.getBean(name, requiredType);
	}
		 
		  /**
		  * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true 
		  * @param name
		  * @return boolean
		  */
	public static boolean containsBean(String name) {
		 return applicationContext.containsBean(name);
	}
		 
		  /**
		  * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
		  * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)   
		  * @param name
		  * @return boolean
		  * @throws NoSuchBeanDefinitionException
		  */
	public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
		  return applicationContext.isSingleton(name);
	}
		 
		  /**
		  * @param name
		  * @return Class 注册对象的类型
		  * @throws NoSuchBeanDefinitionException
		  */
	public static Class getType(String name) throws NoSuchBeanDefinitionException {
		 return applicationContext.getType(name);
	}
		 
		  /**
		  * 如果给定的bean名字在bean定义中有别名,则返回这些别名   
		  * @param name
		  * @return
		  * @throws NoSuchBeanDefinitionException
		  */
	public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
		 return applicationContext.getAliases(name);
	}
}

 

该类中有一个getBean(String name)方法,该方法用applicationContext去获得Bean实例,而applicationContext

是由系统启动时自动设置的。注意,在applicationContext.xml配置文件中需要把该类加上。<bean id="springUtils" class="en.estar.utils.SpringContextUtils"/>

 

二:通过BeanFactory接口获得Bean

      也是新建一个类,不过该类需要实现BeanFactoryAware接口,该接口有一个方法public void setBeanFactory(BeanFactory beanFactory) throws BeansException;该方法是为了设置BeanFactory对象,系统会在启动的时候自动设置BeanFactory。具体代码如下:

 

public class SpringBeanFactoryUtils implements BeanFactoryAware {

	private static BeanFactory beanFactory = null;
	private static SpringBeanFactoryUtils factoryUtils = null;
	
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		SpringBeanFactoryUtils.beanFactory = beanFactory;
	}
	public static BeanFactory getBeanFactory() {
		return beanFactory;
	}
	public static SpringBeanFactoryUtils getInstance(){
		if(factoryUtils==null){
			//factoryUtils = (SpringBeanFactoryUtils)beanFactory.getBean("springBeanFactoryUtils");
			factoryUtils = new SpringBeanFactoryUtils();
		}
		return factoryUtils;
	}
	public static Object getBean(String name){
		return beanFactory.getBean(name);
	}
}

 

 

 

 

 

不过应该注意的是,改类中有一个getInstance方法,由于该代码是网上摘抄的,他提供了这么一个方法,目的是利用单例模式获得该类的一个实例,但由于getBean(String name)方法是静态的,所以用不用单例都无关紧要,经过测试,两种方法都行的通。另外一点就是必须把该类添加到applicationContext.xml的配置文件中<bean id="springBeanFactoryUtils" class="en.estar.utils.SpringBeanFactoryUtils"/>

 

三:在servlet中可以用WebApplicationContext类去获取Bean,具体做法是:

WebApplicationContext webcontext = (WebApplicationContext)context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

 

 其中context是servlet的上下文,在servlet中可以通过this.getServletContext()或者request.getSession().getServletContext();获得servletContext。但是一点,spring的配置文件必须在WEB-INF下。WebApplicationContext 有一个方法getBean(String name);其实WebApplicationContext 就是ApplicationContext的另一种形式而已。

       另外,在普通的java类中,即不是在servlet中可以用ContextLoader获得。ContextLoader是org.springframework.web.context包当中的一个类。

private static WebApplicationContext webApplication = ContextLoader.getCurrentWebApplicationContext();

 

 用这种方法就能获取一个WebApplicationContext 的对象。

 

最后经过测试,在重复100000次的基础上,第一二中方法只用了16毫秒,而第三种方法消耗了62毫秒,所以推荐使用第一二种方法。

分享到:
评论
1 楼 lydawen 2014-07-30  
个人感觉这个性能没什么意义吧,一次启动只获取一次,为什么每次拿bean都要重新拿容器?

相关推荐

    Java中Spring获取bean方法小结

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

    spring bean的生命周期

    - **销毁回调**:当Spring容器关闭时,或者单例Bean不再需要时,会调用`@PreDestroy`注解的方法或者在XML中指定的`destroy-method`属性的方法。 - ** Prototype Beans不保证销毁**:由于Prototype Bean可能有多个...

    线程中获取spring 注解bean

    当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...

    在Servlet直接获取Spring框架中的Bean.docx

    以下是如何在Servlet中直接获取Spring框架中的Bean的方法。 首先,我们理解Spring容器,即ApplicationContext,它是管理Bean的核心组件。它负责读取配置文件(如XML或Java配置),创建并初始化Bean,以及维护它们...

    基于OSGi和Spring开发Web应用.doc

    "基于OSGi和Spring开发Web应用" OSGi(Open Service Gateway Initiative)是一种面向服务的框架,能够提供动态模块部署和管理的能力。Spring 是一个轻量级的J2EE开发框架,特点是面向接口编程和非侵入式的依赖注入...

    第一章 Spring4 简介及获取Bean

    4. **setter方法注入**:使用`@Autowired`注解在setter方法上,Spring会在运行时调用setter方法注入Bean。 **Spring框架的组件** Spring框架由多个模块组成,包括: 1. **Core Container**:包括Core和Beans模块...

    Spring如何获取Bean

    在 Spring 框架中,获取 Bean 是一个非常重要的步骤,因为它是使用 Spring 框架的基础。Spring 提供了多种方式来获取 Bean,这些方式可以根据不同的应用场景选择使用。 通过 XML 配置文件获取 Bean 在 Spring 框架...

    几种spring获取bean的方法.txt

    通过以上两种方法,我们可以在Spring应用中灵活地获取所需的Bean实例。第一种方法适用于Web应用环境,而第二种方法则更加通用,可以在任何环境中使用。这两种方式都避免了硬编码Bean的获取逻辑,使得代码更加灵活和...

    groovy+spring在web中的应用

    在描述中提到的博客链接(由于实际无法访问,这里仅做理论分析),可能会详细探讨如何在实际项目中结合Groovy和Spring进行Web开发,包括Groovy的脚本配置、Bean定义、以及可能的Grails框架应用实例。 标签"源码"和...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...

    Spring在代码中获取bean的方法小结

    本文将总结几种在代码中获取Spring Bean的方法,以供学习和工作中参考。 **1. 通过`ContextLoader.getCurrentWebApplicationContext()`获取** 这种方式适用于Web应用程序,不依赖于Servlet。在服务器启动后,...

    Spring bean 管理

    - session:在一个HTTP Session中只会创建一个Bean实例,同样只适用于Web应用。 4. Spring容器中Bean的生命周期: Spring通过一系列的回调方法来管理Bean的生命周期,包括初始化和销毁时的操作。 - 通过&lt;bean&gt;...

    在Web项目中集成Spring

    在Web项目中集成Spring是一个常见的开发实践,Spring框架以其强大的依赖注入、面向切面编程以及丰富的功能模块,极大地简化了Java Web应用的开发。本文将深入探讨如何在Web项目中集成Spring,包括Spring MVC的使用、...

    Spring整合Jetty开发web应用的例程

    在Web应用中,Spring MVC作为其Web层的一部分,用于处理HTTP请求和响应。 2. **Jetty服务器**:Jetty是一款开源的、轻量级的HTTP服务器和Servlet容器,它快速、小巧且易于集成。Jetty不依赖于特定的Java EE容器,这...

    Spring 框架 web 5.0.4.RELEASE jar

    在提供的压缩包文件"Spring-demo"中,可能包含了Spring Web应用的示例代码,包括配置文件、Controller类、视图文件等,可以帮助开发者了解如何实际操作Spring框架进行Web开发。学习和理解这些组件及其工作原理,对于...

    spring管理bean应用实例代码

    - `request`、`session`、`globalSession`:这些是在Web应用中使用的,分别对应HTTP请求、会话和全局会话的范围。 7. **AOP(面向切面编程)** Spring提供了一种基于代理的AOP实现,可以在不修改源代码的情况下,...

    spring依赖注入bean

    在 Java 应用中,我们可以创建一个主类来启动应用程序,并从 Spring 容器中获取 Bean 实例。例如: ```java public class MainApp { public static void main(String[] args) { ApplicationContext context = new...

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

    在`@Bean`方法中,Spring会调用这个方法来创建Bean实例,并自动处理依赖注入。如果你的类有依赖,可以在`@Bean`方法内部创建并注入。 在`spring-boot-hello3`这个项目中,很可能是演示了如何通过Java配置创建和注册...

    spring-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...

    spring-web.jar spring-webmvc.jar

    Spring框架是Java开发中不可或缺的一部分,它为构建高效、可重用的Web应用程序提供了强大的支持。在本讨论中,我们将深入探讨两个核心组件——`spring-web.jar`和`spring-webmvc.jar`,它们在Spring MVC框架中扮演着...

Global site tag (gtag.js) - Google Analytics