Spring读取配置文件,获取bean的几种方式

方法一:在初始化时保存ApplicationContext对象
代码:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明:
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。


方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:

import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。


方法三:继承自抽象类ApplicationObjectSupport
说明:
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

方法四:继承自抽象类WebApplicationObjectSupport
说明:
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

方法五:实现接口ApplicationContextAware
说明:
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。

这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。

本人认为,方法五比较可行,可以设计一个工具类,专门来获取Spring中的类。减少对业务代码的侵入性。

读取xml文件

/**
* 利用XmlBeanFactory(Resource resource)
* 这里Resource必须是xml格式
* Resource包括:AbstractResource, ClassPathResource, FileSystemResource,
* InputStreamResource, ServletContextResource, UrlResource
*/


/*
* 利用 InputStreamResource(InputStream inputStream)
* 要将applicationContext.xml放在项目根目录下
*/
InputStream is = null;
try {
is = new FileInputStream("applicationContext.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Resource resource = new InputStreamResource(is);
BeanFactory factory = new XmlBeanFactory(resource);
UserDao userDao = (UserDao)factory.getBean("userDao");

/*
* 利用 Properties
* 要将bean.properties放在类路径--源文件夹(src)目录下
*/

这里介绍两种技术:利用spring读取properties 文件和利用java.util.Properties读取
(一)利用spring读取properties 文件
利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件

构造如下config.properties文件properties代码

userDao.class=com.spring.dao.UserDao

属性文件中的"userDao"名称即是Bean的别名设定,.class用于指定类来源。
然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件
   BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
   PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);
   reader.loadBeanDefinitions(new ClassPathResource("config.properties"));
   BeanFactory factory = (BeanFactory)reg;
   UserDao userDao = (UserDao)factory.getBean("userDao");
(二)利用java.util.Properties读取属性文件
1.    String str=File.separator;
        InputStream path=this.getServletContext().getResourceAsStream(str+"WEB-INF"+str+"classes"+str+"password.properties");
        //InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("password.properties");

    /*File filepath=new File(this.getServletContext().getRealPath(str+"WEB-INF"+str+"classes")+str+"password.properties");

        InputStream path=new FileInputStream(filepath);*/
        Properties pros = new Properties();
        try {
            pros.load(path);
        } catch (IOException ex) {
            //System.out.println("file is not exist");
            errorMessage="资源文件不存在";
        }
        System.out.println("username:"+p.getProperty("username")+",password:"+p.getProperty("password"));

2.    import org.springframework.core.io.ClassPathResource;

        ClassPathResource cr = new ClassPathResource("password.properties");//会重新加载spring框架
        Properties pros = new Properties();
        try {
            pros.load(cr.getInputStream());
        } catch (IOException ex) {
            //System.out.println("file is not exist");
            errorMessage="资源文件不存在";
        }

1.利用ClassPathXmlApplicationContext

可以从classpath中读取XML文件

(1) ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)context.getBean("userDao");

(2) ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new  String[]{"applicationContext-ibatis-oracle.xml","applicationContext.xml","applicationContext-data-oracle.xml"});

BeanFactory factory = resource;

UserDao userDao = (UserDao) factory.getBean("userDao");

2. 利用ClassPathResource

可以从classpath中读取XML文件

Resource cr = new ClassPathResource("applicationContext.xml");

BeanFactory bf=new XmlBeanFactory(cr);

UserDao userDao = (UserDao)bf.getBean("userDao");

加载一个xml文件org.springframework.beans.factory.config.PropertyPlaceholderConfigurer不起作用

3.利用XmlWebApplicationContext读取

从Web应用程序的文件架构中,指定相对位置来读取定义文件。


XmlWebApplicationContext 的建構子無法帶參數,參考API文件會發現,預設的location會指向/WEB-INF/applicationContext.xml檔案。使用其 public static屬性DEFAULT_CONFIG_LOCATION可取得此預設檔名。由於我使用MyEclipse,預設會多一個"/WebRoot"的 目錄在WEB-INF之前,因此若在web project裡有一些與web無關的程式要使用context時(例如處理一些MVC架構中的"M"的部份),就無法使用 XmlWebApplicationContext來讀取bean定義檔,因為default location會差一個"WebRoot"的目錄。
即 使在web.xml裡面,在DispatcherServlet定義中重新定義contextConfigLocation也一樣(此定義可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值),因為與web無關的程式 並不會經過web.xml的定義檔設定。目前我還沒試成功過XmlWebApplicationContext取得bean定義檔,使用 ClassPathXmlApplicationContext反而會快一些。


XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocations(new String[] {"/WEB-INF/ applicationContext.xml");
ctx.setServletContext(pageContext.getServletContext());
ctx.refresh();
UserDao  userDao = (UserDao ) ctx.getBean("userDao ");

4.利用FileSystemResource读取

Resource rs = new FileSystemResource("D:/tomcat/webapps/test/WEB-INF/classes/ applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(rs);
UserDao  userDao  = (UserDao )factory.getBean("userDao");

值得注意的是:利用FileSystemResource,则配置文件必须放在project直接目录下,或者写明绝对路径,否则就会抛出找不到文件的异常

 

5.利用FileSystemXmlApplicationContext读取

可以指定XML定义文件的相对路径或者绝对路径来读取定义文件。

方法一:

String[]   path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"};
ApplicationContext context = new FileSystemXmlApplicationContext(path);


方法二:

String path="WebRoot/WEB-INF/applicationContext*.xml";
ApplicationContext context = new FileSystemXmlApplicationContext(path);

方法三:
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址");
没有classpath的话就是从当前的工作目录

Spring读取配置文件,获取bean的几种方式相关推荐

  1. Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式

    Spring获取ApplicationContext方式 我自己常用的方法: 读取一个文件1 //创建Spring容器 2 ApplicationContext ctx = new ClassPath ...

  2. Spring Boot 获取 Bean 的 3 种方式!还有谁不会?

    作者 | chilx 来源 | https://blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 方式一 注解@PostC ...

  3. 【Spring杂烩】探讨Spring向容器注册Bean的三种方式

    探讨Spring向容器注册Bean的三种方式 重点了解@Import实现的三种子方式 前提概要 Spring向容器注册Bean的三种方式 通过@ComponentScan.@Componet 通过@B ...

  4. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  5. Spring Boot当中获取request的三种方式

    本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧! 目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controlle ...

  6. Spring 使用@Import注入Bean的三种方式

    一.准备工作 1.导入spring-context依赖 <dependency><groupId>org.springframework</groupId>< ...

  7. Spring RedisTemplate 批量获取值的2种方式

    1.利用mGet List<String> keys = new ArrayList<>(); //初始keys List<YourObject> list = t ...

  8. Spring容器中获取Bean实例的七种方式(附实战源码)

    目录 写作说明 一:写作原因 二:源码出处 实现方式 一:使用BeanFactory直接获取(不推荐) 二:在初始化时保存ApplicationContext对象 三:继承自抽象类Applicatio ...

  9. Spring容器中获取 Bean 实例的七种方式

    点击关注公众号,利用碎片时间学习 说明 一.写作原因 首先解释一下写这篇博文的原因,因为在使用spring框架的过程中获取bean是非常常见的操作,但是网上非常的博文大多承自一家之言,因此很多可操作性 ...

最新文章

  1. unsigned int 和 int
  2. IP地址与子网掩码总结
  3. 牛客练习赛44 B 小y的线段 (思维)
  4. 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案
  5. 《BI项目笔记》多维数据集中度量值设计时的聚合函数
  6. cakephp 1.3 Models
  7. HBase架构设计及原理分析
  8. 出错也很美的404页面设计模板
  9. Centos 7安装yum时发生错误https:nginx.orgpackagesmainlinecentos7%24baseearchrepodatarepomd.xml: Errno 14 HTT
  10. Ubuntu安装报错E: Could not get lock /var/lib/dpkg/lock-frontend
  11. Python 数据结构与算法——侏儒排序
  12. TypeError: tuple indices must be integers, not tuple是怎么回事
  13. 突破网吧及机房管理限制的方法(转)
  14. 录制GIF动画 MAC
  15. 银行系统需要处理的信息
  16. 程序员值得看的电影(20170420EDIT)
  17. yilia 的html模板,自己动手修改完善yilia主题(下)
  18. css table thead tr border生效
  19. 枚举.........
  20. 苹果5港行和大陆行货的区别

热门文章

  1. 今天在YY上听课感觉不错
  2. pdf转ppt怎么转换,pdf转换ppt的方法分享
  3. Exchange Server 2007 移动邮件
  4. cacti监控批量加,省时省力又省心。
  5. 064文件方式实现完整的英文词频统计实例
  6. 设计模式之工厂模式和抽象工厂模式
  7. Hadoop SequenceFile BLOCK压缩类型写入数据机制
  8. 二级联动菜单,简单实现
  9. Java中的Cookie(1)——基本操作
  10. 6月份不良与垃圾信息举报:垃圾邮件占40.4%