`

动态创建和修改Spring的bean配置文件

    博客分类:
  • java
阅读更多
1、如果只是创建一个XML文件,那么只需要导入dom4j-1.6.1.jar就可以了,路径如下:
spring-framework-2.5.6\lib\dom4j\dom4j-1.6.1.jar

如果是需要读取或者修改,那么就需要导入这个库内的另外一个文件:
spring-framework-2.5.6\lib\dom4j\jaxen-1.1-beta-7.jar
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.dom4j.dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1-beta-7</version>
</dependency>
// MyDom4j.java
import java.io.File;    
import java.io.FileWriter;    
import java.io.IOException;    
import java.util.List;    
   
import org.dom4j.Document;    
import org.dom4j.DocumentException;    
import org.dom4j.DocumentHelper;    
import org.dom4j.Element;    
import org.dom4j.Node;    
import org.dom4j.io.SAXReader;    
import org.dom4j.io.XMLWriter;    

public class MyDom4j {    
    /**   
     * 动态创建一个bean配置文件,包含HelloWorld这个bean,并添加初始值   
     * */   
    public void createXML(String xmlPath, String msg) throws IOException {    
        Document XmlDoc = DocumentHelper.createDocument();    
        XmlDoc.addDocType("beans", "-//SPRING//DTD BEAN//EN",    
                "http://www.springframework.org/dtd/spring-beans.dtd");    
        //首先创建beans根节点    
        Element beansEle = XmlDoc.addElement("beans");    
            
        //注意:dom4j是支持类似于jQuery一样的链式操作的    
        Element beanHelloWorld = beansEle.addElement("bean")    
                .addAttribute("id", "HelloWorld")    
                .addAttribute("class", "HelloWorld");
        Element propertyHelloWorld = beanHelloWorld.addElement("property")    
                .addAttribute("name", "msg");    
        Element valueHelloWorld = propertyHelloWorld.addElement("value")    
                .addText(msg);    
        XMLWriter outXml = new XMLWriter(new FileWriter(new File(xmlPath)));    
        outXml.write(XmlDoc);    
        outXml.close();    
    }    
   
    /**   
     * 首先遍历一个bean配置文件里的所有bean,获取id和class的值, 然后修改HelloWorld这个bean的msg的值   
     * @throws IOException    
     * */   
    public void editXML(String xmlPath, String msg) throws DocumentException, IOException {    
        Document XmlDoc = new SAXReader().read(new File(xmlPath));    
        List xmlList = XmlDoc.selectNodes("/beans/bean");    
        System.out.println("\r\n遍历所有的bean获得id和class:");    
        for (Element element : xmlList) {    
            System.out.println("id:" + element.attributeValue("id")    
                    + " / class:" + element.attributeValue("class"));    
        }    
        System.out.println("\r\n动态修改HelloWorld这个bean的msg值:");    
   
//用XPath来获取单一节点    
        Node valueHelloWorld = XmlDoc    
                .selectSingleNode("/beans/bean[@id='HelloWorld']/property[@name='msg']/value");    
        System.out.println("原始值为:" + valueHelloWorld.getText());    
        valueHelloWorld.setText(msg);    
        System.out.println("修改后的值为:" + valueHelloWorld.getText());    
//修改完了以后记得保存,要不然你会纳闷为什么XML文件没变的,哈哈    
        XMLWriter outXml = new XMLWriter(new FileWriter(new File(xmlPath)));    
        outXml.write(XmlDoc);    
        outXml.close();    
    }    
}   

// HelloWorld.java
public class HelloWorld {    
    public String msg;    
   
    public String getMsg() {    
        return msg;    
    }    
   
    public void setMsg(String msg) {    
        this.msg = msg;    
    }    
}

// HelloWorldTester.java
import java.io.IOException;    
   
import org.dom4j.DocumentException;    
import org.springframework.context.ApplicationContext;    
import org.springframework.context.support.FileSystemXmlApplicationContext;    
   
import com.iteye.bolide74.action.HelloWorld;    
import com.iteye.bolide74.action.MyDom4j;    
   
public class HelloWorldTester {    
    public static void main(String[] args) {    
        String xmlPath = "/WebContent/WEB-INF/conf/config_dom4j.xml";    
        MyDom4j myBeans = new MyDom4j();    
        try {    
            myBeans.createXML(System.getProperty("user.dir") + xmlPath,    
                    "Hello,world!this is created by dom4j!");    
        } catch (IOException e) {    
            e.printStackTrace();    
        }    
        ApplicationContext ac = new FileSystemXmlApplicationContext(xmlPath);    
        HelloWorld helloWorld = (HelloWorld) ac.getBean("HelloWorld");    
        System.out.println(helloWorld.getMsg());    
        try {    
            myBeans.editXML(System.getProperty("user.dir") + xmlPath,    
                    "Hello,world!this is edited by dom4j!");    
        } catch (DocumentException e) {    
            e.printStackTrace();    
        } catch (IOException e) {    
            e.printStackTrace();    
        }    
        // 重新获取bean配置文件    
        ac = new FileSystemXmlApplicationContext(xmlPath);    
        helloWorld = (HelloWorld) ac.getBean("HelloWorld");    
        System.out.println("\r\n" + helloWorld.getMsg());    
    }    
}   
分享到:
评论

相关推荐

    Spring动态加载配置文件

    在Spring框架中,动态加载配置文件是一项重要的功能,它使得开发者在开发过程中无需重启应用就能实时更新配置,极大地提高了开发效率。热部署方案是这一功能的具体应用,它允许我们在不中断服务的情况下,对应用程序...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    解决这个问题的关键在于深入理解Spring的Bean生命周期和配置机制,检查配置文件、注解使用、依赖关系等,确保每个Bean的定义都是唯一的,且作用域设置正确。同时,对源码进行调试也是一个有效的排查手段,可以追踪到...

    spring读取配置文件

    本篇文章将深入探讨如何在Spring中读取不同目录下的配置文件,以及使用`ClassPathXmlApplicationContext`和`FileSystemXmlApplicationContext`这两种不同的上下文环境来加载它们。 首先,让我们了解`...

    Spring之AOP配置文件详解

    通过上述的分析与解释,我们可以看出Spring AOP配置文件的核心在于定义不同的Bean以及它们之间的关系。这些Bean可以是具体的实现类也可以是代理工厂,通过这种方式,Spring AOP为我们提供了一种优雅的方式来管理横切...

    实例化Spring bean的两种工厂方法

    本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念。Spring Bean是Spring IoC容器管理的对象,这些对象的生命周期、依赖关系以及初始化行为由...

    Spring3.0 配置文件中加载Properties文件的小例子

    本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...

    springboot 基于spring-kafka动态创建kafka消费者

    以上就是基于Spring Boot和Spring Kafka动态创建Kafka消费者的基本步骤。动态创建消费者允许我们在运行时根据需求开启或关闭消费功能,提高了应用的灵活性。理解并熟练运用这些知识,能够帮助你在实际项目中构建出...

    spring mvc 读取配置文件

    在Spring MVC框架中,配置文件是整个应用的核心组成部分,它定义了bean的创建、依赖关系以及各种服务的配置。这篇博客“spring mvc 读取配置文件”将深入探讨如何在Spring MVC中读取和使用配置文件,以及相关工具的...

    spring IOC反射装载bean

    在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...

    Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取

    以上就是关于"Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取"的详细解释,涵盖了Spring的配置处理、ZooKeeper的使用以及两者结合的实现过程。理解并掌握这一技术,有助于提升...

    普通类调用Spring bean对象

    这里的`beans.xml`是配置文件,`myBean`是bean的ID。这样,我们就能在普通类中获取到Spring管理的bean实例。 2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`...

    Spring Boot如何动态创建Bean示例代码

    Spring Boot动态创建Bean示例代码详解 Spring Boot框架中提供了多种方式来创建Bean,今天我们就来学习其中的一种,即动态创建Bean。动态创建Bean可以根据特定的条件来决定是否创建Bean,这在实际开发中非常有用。 ...

    Spring 源码(14)Spring Bean 的创建过程(5).doc

    `@Autowired`注解用于自动装配Bean的依赖,`@Value`用于注入值,可以是从配置文件或表达式计算出的值,而`@Lookup`则用于动态查找服务。 `AutowiredAnnotationBeanPostProcessor`在解析构造函数时,会检查类上和...

    spring在@Bean注解中initMethod调用方法异步

    10. `PlaceHolderBinder`:这个类可能负责解析和绑定属性占位符,如环境变量和配置文件中的值,到bean的属性上。 总的来说,这个压缩包中的代码片段展示了如何在Spring中利用`@Bean`注解和`initMethod`属性实现异步...

    Spring動態加載Bean

    通常,Spring容器会在应用启动时扫描配置文件,创建并初始化所有定义的Bean。然而,通过动态加载,我们可以避免不必要的初始化,直到真正需要某个Bean时才去创建它。 动态加载Bean主要有以下几种实现方式: 1. **...

    Spring在应用中获得Bean的方法

    对于接口,Spring提供了`@Lookup`注解,可以在运行时动态创建Bean实例。这通常用于实现类的懒加载或者运行时的选择。 6. **使用`ApplicationContextAware`接口** 实现`ApplicationContextAware`接口,可以获取到`...

    Spring动态加载bean后调用实现方法解析

    通过使用 Spring 的 BeanFactoryPostProcessor 接口类,我们可以动态地加载所需要的 bean,即使是在引入已经打包在 jar 里面的程序而没有办法做出修改的情况下。 在本文中,我们将通过一个示例代码,详细介绍如何...

    spring核心工厂配置源码

    Spring提供了多种方式来实例化Bean,如`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`,它们都是从指定的XML配置文件加载Bean定义。在实例化Bean时,Spring会根据Bean定义的scope属性决定是...

Global site tag (gtag.js) - Google Analytics