XML:可扩展的标记语言。
<?xml version="1.0" encoding="utf-8" ?><!-- xml中的标签名和属性名都可以自定义 --><bean id="xx" className="zz"><property name="xml" value="xx"></property></bean><!-- 如果在xml中需要处理注释 - 注释过后的文件内容不会被解析,要将xml代码注释 --><![CDATA[ .........]]>
DOM4J:用来解析xml
dom4j是一个第三方的提供的一种专门用于解析xml的工具类,功能十分强大。
4:for
j:java
使用步骤:**
- 获取核心类
- 获取document(整个xml文档)
- 获取beans
- 获取所有的子元素bean - bean属性

- ** ```java package day2.demo.xml;
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test;
import java.util.List;
public class DOM4JDemo {
@Test
public void testParse() throws DocumentException {
//1.获取核心类
SAXReader saxReader = new SAXReader();
//2.获取document(整个xml文档)
Document document = saxReader.read(“src/day2/demo/xml/beans.xml”);
//3.获取beans
Element rootElement = document.getRootElement();
//4.获取所有的子元素bean
List
<a name="aLI2Y"></a># 设计模式:工厂模式**设计模式:23种,常用的有:单例模式、工厂模式、代理模式、模板模式...****工厂模式:相当于工厂的作用,创建出对象,之后如果需要这个对象,可以直接去工厂拿就行。**<br />**<br />**当前案例的操作是将xml中的数据封装到BeanConfig中,使用工厂模式的概念。**- **1.BeanFactory首先加载xml配置文件 - 静态代码块**- **2.将每一个bean标签配置内容,封装到BeaConfig中去**- **3.最后将整个xml中的内容封装到一个容器中,便于快速查询,map进行数据存储**```javapackage day2.demo.ba3;import org.apache.commons.beanutils.BeanUtils;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.junit.Test;import java.util.HashMap;import java.util.List;import java.util.Map;public class BeanFactory {//1.提供map存放beans.xml中的配置文件内容,使用map,建议使用静态处理 - 好处是只要加载一次private static Map<String,BeanConfig> cache = new HashMap<>();//静态代码块处理数据添加static{try{//加载xml,获取documentSAXReader saxReader = new SAXReader();//使用DOM4J工具Document document = saxReader.read("src/day2/demo/ba3/beans.xml");//获取根节点Element rootElement = document.getRootElement();//获取根下的beanList<Element> allBeanElement = rootElement.elements("bean");//遍历listfor (Element beanElement : allBeanElement) {//获取bean中的属性String id = beanElement.attributeValue("id");String className = beanElement.attributeValue("className");//创建BeanConfig,并且封装id和classNameBeanConfig beanConfig = new BeanConfig();beanConfig.setId(id);beanConfig.setClassName(className);//再获取bean下的子标签List<Element> allProperty = beanElement.elements("property");for (Element prop : allProperty) {//获取属性:name valueString name = prop.attributeValue("name");String value = prop.attributeValue("value");//将name和value保存到BeanConfigbeanConfig.getProps().setProperty(name,value);}//内存for//将封装好的数据存放到map中cache.put(id,beanConfig);}//外层for//测试System.out.println("初始化数据:"+cache);} catch(Exception e){throw new RuntimeException(e);}}//因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象//通过指定的beanId来获取相对应的BeanConfigpublic static Object getBean(String beanId){//创建beanId获取相应的BeanConfigBeanConfig beanConfig = cache.get(beanId);//判断这个对象是不是合法if(beanConfig == null){throw new RuntimeException("获得的对象["+beanId+"]不存在");}else{//如果存在 - 通过反射机制进行获取try{String className = beanConfig.getClassName();Class cla = Class.forName(className);Object obj = cla.newInstance();//获取实例对象//循环解析 - BeanUtilsfor(String name:beanConfig.getProps().stringPropertyNames()){//每遍历到一个name,就返回name对应的valueString value = beanConfig.getProps().getProperty(name);//使用BeanUtils封装数据BeanUtils.setProperty(obj,name,value);}return obj;} catch (Exception e){throw new RuntimeException(e);}}}}
stringPropertyNames()方法用于获取此属性列表中存在的所有键,并且此处的键及其所需值是字符串,并且默认属性列表中存在唯一键以在Set中进行查看。
静态代码块
- 它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
- 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
- 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
- 一个类中可以有多个静态代码块
static{
//静态代码块
}
在代码设计中可以用来创建可以单例的对象,不用每次调用一个相同的对象时都要重新new一次,提高性能
