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进行数据存储**
```java
package 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,获取document
SAXReader saxReader = new SAXReader();//使用DOM4J工具
Document document = saxReader.read("src/day2/demo/ba3/beans.xml");
//获取根节点
Element rootElement = document.getRootElement();
//获取根下的bean
List<Element> allBeanElement = rootElement.elements("bean");
//遍历list
for (Element beanElement : allBeanElement) {
//获取bean中的属性
String id = beanElement.attributeValue("id");
String className = beanElement.attributeValue("className");
//创建BeanConfig,并且封装id和className
BeanConfig beanConfig = new BeanConfig();
beanConfig.setId(id);
beanConfig.setClassName(className);
//再获取bean下的子标签
List<Element> allProperty = beanElement.elements("property");
for (Element prop : allProperty) {
//获取属性:name value
String name = prop.attributeValue("name");
String value = prop.attributeValue("value");
//将name和value保存到BeanConfig
beanConfig.getProps().setProperty(name,value);
}//内存for
//将封装好的数据存放到map中
cache.put(id,beanConfig);
}//外层for
//测试
System.out.println("初始化数据:"+cache);
} catch(Exception e){
throw new RuntimeException(e);
}
}
//因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象
//通过指定的beanId来获取相对应的BeanConfig
public static Object getBean(String beanId){
//创建beanId获取相应的BeanConfig
BeanConfig 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();//获取实例对象
//循环解析 - BeanUtils
for(String name:beanConfig.getProps().stringPropertyNames()){
//每遍历到一个name,就返回name对应的value
String value = beanConfig.getProps().getProperty(name);
//使用BeanUtils封装数据
BeanUtils.setProperty(obj,name,value);
}
return obj;
} catch (Exception e){
throw new RuntimeException(e);
}
}
}
}
stringPropertyNames()方法用于获取此属性列表中存在的所有键,并且此处的键及其所需值是字符串,并且默认属性列表中存在唯一键以在Set中进行查看。
静态代码块
- 它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
- 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
- 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
- 一个类中可以有多个静态代码块
static{
//静态代码块
}
在代码设计中可以用来创建可以单例的对象,不用每次调用一个相同的对象时都要重新new一次,提高性能