zoukankan      html  css  js  c++  java
  • Java中spring读取配置文件的几种方法

    Spring读取配置XML文件分三步:

    一.新建一个Java Bean:

    package springdemo;
    
    public class HelloBean {
        private String helloWorld;
        public String getHelloWorld() {
            return helloWorld;
        }
        public void setHelloWorld(String helloWorld) {
            this.helloWorld = helloWorld;
        }
    }

    二.构建一个配置文件bean_config.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
    <beans>
      <bean id="helloBean" class="springdemo.HelloBean">
        <property name="helloWorld">
          <value>Hello!chb!</value>
        </property>
      </bean>
    </beans>

    三.读取配置文件:

    1.利用ClassPathXmlApplicationContext:

    ApplicationContext context = new ClassPathXmlApplicationContext("bean_config.xml");
    //这种用法不够灵活,不建议使用。
     HelloBean helloBean = (HelloBean)context.getBean("helloBean");
     System.out.println(helloBean.getHelloWorld());

      ClassPathXmlApplicationContext实现了接口ApplicationContext,ApplicationContext实现了BeanFactory。其通过jdom进行XML配置文件的读取,并构建实例化Bean,放入容器内。

    public interface BeanFactory {
        public Object getBean(String id);
    }
    
    
    //实现类ClassPathXmlApplicationContext
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    
    public class ClassPathXmlApplicationContext implements BeanFactory {
        
        private Map<String , Object> beans = new HashMap<String, Object>();
        
        //(IOC:Inverse of Control/DI:Dependency Injection)
        public ClassPathXmlApplicationContext() throws Exception {
            SAXBuilder sb=new SAXBuilder();
            
            Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象
            Element root=doc.getRootElement(); //获取根元素HD
            List list=root.getChildren("bean");//取名字为disk的所有元素
            for(int i=0;i<list.size();i++){
               Element element=(Element)list.get(i);
               String id=element.getAttributeValue("id");
               String clazz=element.getAttributeValue("class");
               Object o = Class.forName(clazz).newInstance();
               System.out.println(id);
               System.out.println(clazz);
               beans.put(id, o);
               
               for(Element propertyElement : (List<Element>)element.getChildren("property")) {
                   String name = propertyElement.getAttributeValue("name"); //userDAO
                   String bean = propertyElement.getAttributeValue("bean"); //u
                   Object beanObject = beans.get(bean);//UserDAOImpl instance
                   
                   String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
                   System.out.println("method name = " + methodName);
                   
                   Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
                   m.invoke(o, beanObject);
               }         
            }        
        }
    
        public Object getBean(String id) {
            return beans.get(id);
        }
    }

      BeanFactory是一个很根的接口,ApplicationContext和ClassPathXmlApplicationContext都实现了接口BeanFactory,所以也可以这么写:

    ApplicationContext context = new ClassPathXmlApplicationContext("bean_config.xml");
    HelloBean helloBean = (HelloBean)context.getBean("helloBean");
    
    BeanFactory factory= new ClassPathXmlApplicationContext("bean_config.xml");
    HelloBean helloBean = (HelloBean)factory.getBean("helloBean");

      ClassPathXmlApplicationContext层级关系如下:

    2.利用FileSystemResource读取

    Resource rs = new FileSystemResource("D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/bean_config.xml");
    BeanFactory factory = new XmlBeanFactory(rs);
    HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
    System.out.println(helloBean.getHelloWorld());

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

    Spring读取properties配置文件

    介绍两种技术:利用spring读取properties 文件和利用java.util.Properties读取:

    一.利用spring读取properties 文件

      还利用上面的HelloBean.java文件,构造如下bean_config.properties文件:

    helloBean.class=springdemo.HelloBean
    helloBean.helloWorld=Hello!HelloWorld!

      属性文件中的"helloBean"名称即是Bean的别名设定,.class用于指定类来源。

          然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件。

    BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
    PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);
    reader.loadBeanDefinitions(new ClassPathResource("bean_config.properties"));
    BeanFactory factory = (BeanFactory)reg;
    HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
    System.out.println(helloBean.getHelloWorld());

    二.利用java.util.Properties读取属性文件

      比如,我们构造一个ip_config.properties来保存服务器ip地址和端口,如:

    ip=192.168.0.1
    port=8080

      我们可以用如下程序来获得服务器配置信息:

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ip_config.properties");
    Properties p = new Properties();
    try {
        p.load(inputStream);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    System.out.println("ip:"+p.getProperty("ip")+",port:"+p.getProperty("port"));

    三.用接口类WebApplicationContext来取。

    private WebApplicationContext wac;
    wac =WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
    wac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");

      其中,jdbcTemplate为spring配置文件中的一个bean的id值。

      这种用法比较灵活,spring配置文件在web中配置启动后,该类会自动去找对应的bean,而不用再去指定配置文件的具体位置。

  • 相关阅读:
    递归 深拷贝
    js 基础复习(0)
    js数组冒泡排序,快速排序的原理以及实现
    .sass 和 .scss 区别
    ionic2-从搭建环境说起
    Unity3d截图保存到Android相册的实现
    总是要总结一年的工作(写给自己和想要从技术创业开公司的朋友们)
    初入职场(插曲-如何更称职的工作)
    初入职场(插曲-你的成长代价)
    初入职场(面试)
  • 原文地址:https://www.cnblogs.com/jing99/p/6395981.html
Copyright © 2011-2022 走看看