`

Spring在应用中获得Bean的方法

阅读更多

一.使用ApplicationContext获得Bean

        首先新建一个类,该类必须实现ApplicationContextAware接口,改接口有一个方法,public void setApplicationContext(ApplicationContext applicationContext)throws BeansException,也就是说框架会自动调用这个方法返回一个ApplicationContext对象。具体类如下:

package com.bijian.study.test;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContextUtils implements ApplicationContextAware {// Spring的工具类,用来获得配置文件中的bean

	private static ApplicationContext applicationContext = null;

	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextUtils.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	public static Object getBean(String name) throws BeansException {
		return applicationContext.getBean(name);
	}

	public static Object getBean(String name, Class requiredType)
			throws BeansException {
		return applicationContext.getBean(name, requiredType);
	}

	public static boolean containsBean(String name) {
		return applicationContext.containsBean(name);
	}

	public static boolean isSingleton(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.isSingleton(name);
	}

	public static Class getType(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.getType(name);
	}

	public static String[] getAliases(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.getAliases(name);
	}
}

        该类中有一个getBean(String name)方法,该方法用applicationContext去获得Bean实例,而applicationContext是由系统启动时自动设置的。

        注意,需要把该类在applicationContext.xml配置文件中进行注册。<bean id="springUtil" class="com.bijian.study.test.SpringContextUtils "/>

 

二.通过BeanFactory接口获得Bean

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

package com.bijian.study.test;

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

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="com.bijian.study.test.SpringBeanFactoryUtils"/>

 

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

ServletContext context = request.getServletContext();
//ServletContext context = request.getSession().getServletContext();
WebApplicationContext webcontext = (WebApplicationContext)context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
helloService =  (HelloService) webcontext.getBean("helloService");
logger.info(helloService.processService("WebApplicationContext test"));

        其中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包当中的一个类。

WebApplicationContext webApplication = ContextLoader.getCurrentWebApplicationContext(); 
helloService = (HelloService) webApplication.getBean("helloService");
logger.info(helloService.processService("ContextLoader.getCurrentWebApplicationContext() test"));

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

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

 

四.非WEB项目

        即在java main函数中执行spring的代码,如下有四种方式。

package com.bijian.study.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.bijian.study.service.HelloService;
  
public class Main {  
  
    public static void main(String[] args) throws Exception {
    	
    	String[] path1 = {"WebContent/WEB-INF/springMVC-servlet.xml"};  
        ApplicationContext context1 = new FileSystemXmlApplicationContext(path1);  
        HelloService helloService1 = context1.getBean(HelloService.class);  
        System.out.println(helloService1.processService("bijian"));  
          
        String path2="WebContent/WEB-INF/springMVC-servlet.xml";  
        ApplicationContext context2 = new FileSystemXmlApplicationContext(path2);  
        HelloService helloService2 = context2.getBean(HelloService.class);  
        System.out.println(helloService2.processService("bijian"));  
          
        ApplicationContext context = new FileSystemXmlApplicationContext("/WebContent/WEB-INF/springMVC-servlet.xml");  
        //HelloService helloService = context.getBean(HelloService.class);  
        HelloService helloService = (HelloService) context.getBean("helloService");  
        System.out.println(helloService.processService("bijian"));  
        
        GenericXmlApplicationContext context4 = new GenericXmlApplicationContext();  
        context4.setValidating(false);  
        context4.load("classpath:springMVC-servlet.xml");  
        context4.refresh();  
        HelloService helloService4 = context4.getBean(HelloService.class);
        System.out.println(helloService4.processService("bijian"));
    }  
}

        特别说明:context4.load("classpath:springMVC-servlet.xml");方式,需将springMVC-servlet.xml拷贝一份到src目录下,否则执行会报“class path resource [springMVC-servlet.xml] cannot be opened because it does not exist”,如下所示。


 

附:Web工程中验证的代码

@RequestMapping("/greeting")
public ModelAndView greeting(@RequestParam(value = "name", defaultValue = "World") String name, HttpServletRequest request) {

        Map<String, Object> map = new HashMap<String, Object>();
        try {
            //由于浏览器会把中文直接换成ISO-8859-1编码格式,如果用户在地址打入中文,需要进行如下转换处理
            String tempName = new String(name.getBytes("ISO-8859-1"), "utf-8");

            logger.trace("tempName:" + tempName);
            logger.info(tempName);

            String userName = helloService.processService(tempName);

            map.put("userName", userName);
            
            logger.trace("运行结果:" + map);
            
            helloService = (HelloService) SpringContextUtils.getBean("helloService");
            logger.info(helloService.processService("SpringContextUtils test"));
            
            helloService = (HelloService) SpringBeanFactoryUtils.getBean("helloService");
            logger.info(helloService.processService("SpringBeanFactoryUtils test"));
            
            ServletContext context = request.getServletContext();
            //ServletContext context = request.getSession().getServletContext();
            WebApplicationContext webcontext = (WebApplicationContext)context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
            helloService =  (HelloService) webcontext.getBean("helloService");
            logger.info(helloService.processService("WebApplicationContext test"));
            
            WebApplicationContext webApplication = ContextLoader.getCurrentWebApplicationContext(); 
            helloService = (HelloService) webApplication.getBean("helloService");
            logger.info(helloService.processService("ContextLoader.getCurrentWebApplicationContext() test"));
        } catch (UnsupportedEncodingException e) {
            logger.error("HelloController greeting方法发生UnsupportedEncodingException异常:" + e);
        } catch (Exception e) {
            logger.error("HelloController greeting方法发生Exception异常:" + e);
        }
        return new ModelAndView("/hello", map);
}

        工程完整代码见附件《SpringMVC.zip》。

  • 大小: 19.1 KB
分享到:
评论

相关推荐

    Java中Spring获取bean方法小结

    - **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...

    spring运行过程中动态注册bean

    在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的...通过上述机制,我们可以在Spring应用运行时灵活地增加或修改Bean的定义,极大地增强了Spring框架的灵活性和扩展性。

    第一章 Spring4 简介及获取Bean

    **Spring框架简介** Spring是一个开源的Java平台,它主要为构建企业级应用提供...- 开源项目:参与开源项目,了解Spring在实际项目中的应用。 通过学习和实践,你可以掌握Spring框架,并在实际项目中发挥其强大功能。

    线程中获取spring 注解bean

    在提交任务时,可以将bean作为参数传递,或者在任务内部使用`ApplicationContextAware`接口获取应用上下文,从而获取bean。 4. **ApplicationContextAware**:让线程处理类实现`ApplicationContextAware`接口,...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    要从一个非Spring管理的类中获取Bean,我们需要先创建或获取`ApplicationContext`实例。有多种方式可以做到这一点,例如: 1. 通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`加载XML...

    spring中的bean

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

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

    Spring Boot是一种简化Spring应用程序开发的框架,它通过提供预配置的依赖和自动配置功能,使得创建独立运行的、生产级别的Java应用变得简单。在Spring Boot应用中,所有bean都由Spring IoC(Inversion of Control)...

    Spring在代码中获取bean的几种方式.rar

    以下将详细介绍Spring在代码中获取bean的几种主要方法: 1. **`ApplicationContext` 接口** `ApplicationContext` 是Spring中最常用的接口之一,它提供了获取Bean的多种方法。例如,`getBean(String beanName)` ...

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

    在Spring框架中,有时我们需要在非Spring管理的类或者不适用自动装配的场景下获取到Service、DAO等Bean对象。...但在某些特殊情况下,如需在非Spring管理的类中获取Bean,上述其他方法则会派上用场。

    Spring如何获取Bean

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

    Spring Bean创建初始化流程.docx

    在`doCreateBean()`方法中,Spring会创建Bean的实例,`createBeanInstance(beanName, mbd, args)`执行Bean实例的创建,而`populateBean(beanName, mbd, instanceWrapper)`则负责填充Bean的属性,将依赖注入到Bean中...

    几种spring获取bean的方法.txt

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

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

    如果在Spring初始化之前尝试获取Bean,可能会抛出异常。 总之,在Servlet中直接获取Spring的Bean可以帮助简化代码,减少重复的工作,并利用Spring的依赖注入能力。然而,这种方式应该谨慎使用,因为它可能破坏了...

    获得spring里注册Bean的四种方法

    这种方法需要在 Spring 配置文件中添加一个 Bean,例如 `&lt;bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" /&gt;`。然后,我们可以实现 BeanFactoryAware 接口,使用 ...

    Spring中与Bean相关的接口

    在Spring框架中,Bean是核心概念,它代表了应用程序中的对象。这些对象通过Spring的依赖注入(Dependency Injection,DI)机制来管理和协调。本篇文章将深入探讨Spring中与Bean相关的接口,以及它们如何帮助我们更好...

    Spring在代码中获取bean的几种方式详解

    在基于Web的应用程序中,我们可以通过Spring提供的工具类获取ApplicationContext对象,然后获取Bean实例。例如: ``` ServletContext sc = ...; ApplicationContext ac1 = WebApplicationContextUtils....

    Spring 应用上下文获取 Bean 的常用姿势实例总结

    Spring 应用上下文获取 Bean 是一个常见的操作,在 Spring 框架中获取 Bean 对象是非常重要的。本文将总结 Spring 应用上下文获取 Bean 的常用姿势实例,并对其实现方法和操作注意事项进行详细的分析和讲解。 一、...

    spring依赖注入bean

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

    spring bean 属性总结

    - **id属性**:是Bean在BeanFactory中的唯一标识符,用于通过BeanFactory获取Bean实例。例如,`&lt;bean id="myBean" class="com.example.MyClass"&gt;`。 - **name属性**:类似于`id`属性,但可以定义多个别名。例如,`...

Global site tag (gtag.js) - Google Analytics