一.使用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》。
相关推荐
- **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的...通过上述机制,我们可以在Spring应用运行时灵活地增加或修改Bean的定义,极大地增强了Spring框架的灵活性和扩展性。
**Spring框架简介** Spring是一个开源的Java平台,它主要为构建企业级应用提供...- 开源项目:参与开源项目,了解Spring在实际项目中的应用。 通过学习和实践,你可以掌握Spring框架,并在实际项目中发挥其强大功能。
在提交任务时,可以将bean作为参数传递,或者在任务内部使用`ApplicationContextAware`接口获取应用上下文,从而获取bean。 4. **ApplicationContextAware**:让线程处理类实现`ApplicationContextAware`接口,...
要从一个非Spring管理的类中获取Bean,我们需要先创建或获取`ApplicationContext`实例。有多种方式可以做到这一点,例如: 1. 通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`加载XML...
在本篇中,我们将深入探讨"Spring中的Bean"这一主题,包括Bean的定义、配置以及如何在实际应用中使用。 首先,我们需要理解什么是Spring中的Bean。在Spring中,Bean通常代表应用程序中的一个对象,这些对象由Spring...
Spring Boot是一种简化Spring应用程序开发的框架,它通过提供预配置的依赖和自动配置功能,使得创建独立运行的、生产级别的Java应用变得简单。在Spring Boot应用中,所有bean都由Spring IoC(Inversion of Control)...
以下将详细介绍Spring在代码中获取bean的几种主要方法: 1. **`ApplicationContext` 接口** `ApplicationContext` 是Spring中最常用的接口之一,它提供了获取Bean的多种方法。例如,`getBean(String beanName)` ...
在Spring框架中,有时我们需要在非Spring管理的类或者不适用自动装配的场景下获取到Service、DAO等Bean对象。...但在某些特殊情况下,如需在非Spring管理的类中获取Bean,上述其他方法则会派上用场。
在 Spring 框架中,获取 Bean 是一个非常重要的步骤,因为它是使用 Spring 框架的基础。Spring 提供了多种方式来获取 Bean,这些方式可以根据不同的应用场景选择使用。 通过 XML 配置文件获取 Bean 在 Spring 框架...
在`doCreateBean()`方法中,Spring会创建Bean的实例,`createBeanInstance(beanName, mbd, args)`执行Bean实例的创建,而`populateBean(beanName, mbd, instanceWrapper)`则负责填充Bean的属性,将依赖注入到Bean中...
通过以上两种方法,我们可以在Spring应用中灵活地获取所需的Bean实例。第一种方法适用于Web应用环境,而第二种方法则更加通用,可以在任何环境中使用。这两种方式都避免了硬编码Bean的获取逻辑,使得代码更加灵活和...
如果在Spring初始化之前尝试获取Bean,可能会抛出异常。 总之,在Servlet中直接获取Spring的Bean可以帮助简化代码,减少重复的工作,并利用Spring的依赖注入能力。然而,这种方式应该谨慎使用,因为它可能破坏了...
这种方法需要在 Spring 配置文件中添加一个 Bean,例如 `<bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />`。然后,我们可以实现 BeanFactoryAware 接口,使用 ...
在Spring框架中,Bean是核心概念,它代表了应用程序中的对象。这些对象通过Spring的依赖注入(Dependency Injection,DI)机制来管理和协调。本篇文章将深入探讨Spring中与Bean相关的接口,以及它们如何帮助我们更好...
在基于Web的应用程序中,我们可以通过Spring提供的工具类获取ApplicationContext对象,然后获取Bean实例。例如: ``` ServletContext sc = ...; ApplicationContext ac1 = WebApplicationContextUtils....
Spring 应用上下文获取 Bean 是一个常见的操作,在 Spring 框架中获取 Bean 对象是非常重要的。本文将总结 Spring 应用上下文获取 Bean 的常用姿势实例,并对其实现方法和操作注意事项进行详细的分析和讲解。 一、...
在 Java 应用中,我们可以创建一个主类来启动应用程序,并从 Spring 容器中获取 Bean 实例。例如: ```java public class MainApp { public static void main(String[] args) { ApplicationContext context = new...
- **id属性**:是Bean在BeanFactory中的唯一标识符,用于通过BeanFactory获取Bean实例。例如,`<bean id="myBean" class="com.example.MyClass">`。 - **name属性**:类似于`id`属性,但可以定义多个别名。例如,`...