spring框架下获取bean的七种方式总结。
来源:互联网 发布:福建纵腾网络年营业额 编辑:程序博客网 时间:2024/06/14 05:38
今天进行之前某个项目的优化,发现自己当时对数据库的操作采用了Apache的DBUtils框架,导致存在大量的像获取connection、获取statement、获取resultset、遍历resultset并封装成集合、依次关闭connection,statement,resultset等这些重复操作。这样的代码简直不能忍。基于使用的框架是spring,于是决定使用spring jdbctemplate改写。但是在applicationContext.xml中配置完DataSource后,脑袋一片空白, 忘记如何获取想要的bean。查询资料后发现竟然有七种方式之多(用了这么久的spring框架,竟然一种方法没想到。。为此感到羞愧)。特此总结下来以便日后查阅。
本文不涉及自动注入等方式.
- 在初始化时保存ApplicationContext对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BasicDataSource bds1 = (BasicDataSource) context.getBean("ds");ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); BasicDataSource bds2 = (BasicDataSource)ac.getBean("ds");
这种方式实例化applicationContext是非常耗时的,适用于采用Spring框架的独立应用程序,仅仅推荐使用在程序需要通过配置文件手工初始化Spring的情况。ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。(1)、FileSystemXmlApplicationContext
这个方法是从文件绝对路径加载配置文件,例如:
ApplicationContext ctx = new FileSystemXmlApplicationContext( "C:/applicationcontext.xml ");
如果在参数中写的不是绝对路径,那么方法调用的时候也会默认用绝对路径来找。
采用绝对路径的话,程序的灵活性就很差了,所以这个方法一般不推荐。(如果要使用classpath路径,需要加入前缀classpath: )
(2)、ClassPathXmlApplicationContext
这个方法是从classpath下加载配置文件(适合于相对路径方式加载),例如:
ApplicationContext ctx = new ClassPathXmlApplicationContext( "/applicationcontext.xml ");
该方法参数中classpath: 前缀是不需要的,默认就是指项目的classpath路径下面;这也就是说用ClassPathXmlApplicationContext时默认的根目录是在WEB-INF/classes下面,而不是项目根目录。这个需要注意!
通过spring提供的工具类获取
ApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());BasicDataSource bds4 = (BasicDataSource)ac1.getBean("ds");ApplicationContext ac2 = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());BasicDataSource bds = (BasicDataSource)ac2.getBean("ds");
通过javax.servlet.ServletContext 获取到ApplicationContext实例对象,这意味着,必须使用到request、session等等。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。当使用WebApplicationContextUtils获取ApplicationContext实例时,需要在web.xml配置文件中添加org.springframework.web.context.ContextLoaderListener监听器,否则获取不到ApplicationContext对象,返回Null。web.xml配置示例如下:<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
- 实现接口ApplicationContextAware
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。package Util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;//@Componentpublic class SpringContextUtil implements ApplicationContextAware { // Spring应用上下文环境 private static ApplicationContext applicationContext; /** * 实现ApplicationContextAware接口的回调方法,设置上下文环境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 获取对象 * * @param name * @return Object * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
- 通过BeanFactory接口获得Bean
新建一个类,不过该类需要实现BeanFactoryAware接口,该接口有一个方法public void setBeanFactory(BeanFactory beanFactory) throws BeansException;该方法是为了设置BeanFactory对象,系统会在启动的时候自动设置BeanFactory。具体代码如下:package Util;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="Util"/> 通过Spring提供的ContextLoader
WebApplicationContext wc = ContextLoader.getCurrentWebApplicationContext(); BasicDataSource bds = (BasicDataSource)wc.getBean("ds");
继承自抽象类ApplicationObjectSupport
package com.controller;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ApplicationObjectSupport;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.context.ContextLoader;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import Util.SpringBeanFactoryUtils;import Util.SpringContextUtil;@Controllerpublic class TestController extends ApplicationObjectSupport{@RequestMapping("/test6.do")public String test6(HttpServletRequest request) {ApplicationContext ac = getApplicationContext();BasicDataSource bds = (BasicDataSource)ac.getBean("ds");System.out.println("6-"+bds.getMaxActive());return "NewFile";}}
- 继承自抽象类WebApplicationObjectSupport
package com.controller;import javax.servlet.http.HttpServletRequest;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.context.ApplicationContext;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.context.support.WebApplicationObjectSupport;@Controllerpublic class TestController2 extends WebApplicationObjectSupport{@RequestMapping("/test7.do")public String test7(HttpServletRequest request) {ApplicationContext ac = getApplicationContext();BasicDataSource bds = (BasicDataSource)ac.getBean("ds");System.out.println(bds.getMaxActive());return "NewFile";}}
第三、四种方法都需要将工具类配置在Spring配置文件中:
假定ApplicationTool为继承或者实现了第三、四种方法的具体实现类
<bean class="util.ApplicationTool"></bean>
否则将获取不到ApplicationContext,返回Null.
- spring框架下获取bean的七种方式总结。
- 在Spring框架下获取Bean的方式总结
- 在Spring框架下获取Bean的方式总结
- 在Spring框架下获取Bean的方式总结
- spring框架下获取bean的方式总结(转)
- Spring框架下获取Bean的几种方式
- Spring框架下获取Bean的几种方式
- 在Spring框架下获取Bean的方式总结(原创)
- 在Spring框架下获取Bean的方式总结(转)
- 在Spring框架下获取Bean的方式总结(转)
- 在Spring框架下获取Bean的方式总结(转)
- Spring中获取bean的方式总结
- spring中bean的获取方式总结
- Spring中获取bean的方式总结
- spring框架下获取Bean的两种常用方法
- spring框架下获取Bean的两种常用方法
- Spring获取Bean的几种方式
- Spring获取Bean的几种方式
- Android View深入浅出
- 微信tinker热更新
- 多线程总结
- 安装idea带破解和创建第一个Maven项目图文详解
- POJ 1967 Alibaba 笔记
- spring框架下获取bean的七种方式总结。
- python文件批处理
- C语言的字符串输入fgets()函数
- POJ 1966 Cable TV Network 笔记
- QTCreator帮我们省去了哪些步骤
- idea中Terminal终端无法执行GIT命令: touch README.md问题解决
- POJ 1965 Cube Root 笔记
- ifconfig查不出ip,并且xshell链接失败
- 修复Openssh漏洞:SSH Weak Ciphers And Mac Algorithms Supported