XML解析和代理模式

一、XML

  • 作用:作为配置文件、存储数据、传输数据、描述数据
  • 文档声明:<?xml version="1.0" encoding="utf-8" ?> 要写在第一行第一列
  • 特殊字符:
    在这里插入图片描述
  • CDATA区(解析器忽略其中的内容,直接当作文本)
    格式:<![CDATA[任意内容,但不能写"]]>"]]>

二、XML约束

  • 分为两种:
    • dtd约束
    • schema约束

三、XML解析

  • DOM解析:
    • 原理:将xml文件加载到内存,形成一棵dom树
    • 优点:可以进行增删改查
    • 缺点:如果xml文件太大,dom树占内存多,解析慢,可能会内存溢出
    • 其中:Document(文档节点)、Element(标签节点)、Text(文本节点)、Attribute(属性节点)、Comment(注释节点)
  • SAX解析
    • 原理:逐行读取,内存中只有读取的那一行
    • 优点:内存占用很小,速度快
    • 缺点:只能读取,不能回写
  • pull解析
    • Android 内置解析器
  • 常用xml解析(jar包)
    • JAXP:JDK自带,支持dom和sax
    • JDOM:
    • DOM4J: 支持dom和sax
    • JSOUP:爬虫,解析html
  • DMO4J的使用(没有如约束)
    • xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<studnets>
    <studnet id="01">
        <name>张三</name>
        <age>18</age>
    </studnet>
    <studnet id="02">
        <name>李四</name>
        <age>19</age>
    </studnet>
</studnets>
```
    //1.创建SaxReader对象
    SAXReader saxReader=new SAXReader();
    //2.读取xml文件,获得输入流,读取src目录下文件
    InputStream is = demo01.class.getClassLoader().getResourceAsStream("Student.xml");
    //3.获得文档对象
    Document document = saxReader.read(is);

    //4.获得根元素 studnets
    Element rootElement = document.getRootElement();

    //5.获得根标签的所有子标签
    List<Element> elements = rootElement.elements();

    //6.获得第一个子标签
    Element element = elements.get(0);

    //7.获得第一个子标签的属性值 id
    String id = element.attributeValue("id");
```
  • XPath的使用,基于dom4j(导入 jaxen-1.1-beta-6.jar和DOM4J包)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
        //8.1获得一个标签
        Element nameElement = (Element) document.selectSingleNode("/students/student/name");
        //8.2获得子标签student集合
        List<Element> list = document.selectNodes("/students/student");
    

四、动态代理:

  • 代理模式

    • 作用:对目标类进行增强,增强一个类中的某个方法.对程序进行扩展. Spring框架中AOP.
    • 使用场景:在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。(租房–>中介–>房东)
    • 与装饰者模式相比:装饰者模式可以对实现了同一个接口的类进行增强(多态),而代理是对指定类进行增强(指定对象)
    • 静态代理和动态代理的区别:静态代理有有具体的代理类,动态代理是通过反射生成一个代理对象
  • 静态代理:

    //接口类
    public interface FangZhi {
    public void fangZhi01();
    public void fangZhi02();
    }
    
    //房东有房子
    public class FangDong implements FangZhi{
        @Override
        public void fangZhi01() {
            System.out.println("出租房,888元每月,不包水电");
        }
    
        @Override
        public void fangZhi02() {
            System.out.println("出租房,666元每月,不包水电");
        }
    }
    
    	//中介的房子是房东的
    	public class Zhongjie implements FangZhi{
        private FangDong fangDong;
    
        public Zhongjie() {
            fangDong=new FangDong();
        }
    
    	//增强的方法
        @Override
        public void fangZhi01() {
            System.out.println("出租房,1288元每月,不包水电");
        }
    
        @Override
        public void fangZhi02() {
        fangDong.fangZhi02();
        }
    }
    
    
    public class ZhuKe {
        public static void main(String[] args) {
            //租客通过中介租房子
            Zhongjie zhongjie=new Zhongjie();
            zhongjie.fangZhi01();//增强的方法
            zhongjie.fangZhi02();//实际调用的是房东的方法
    
            //租客直接找房东找房子
            FangDong fangDong=new FangDong();
            fangDong.fangZhi01();
            fangDong.fangZhi02();
        }
    }
    
  • 动态代理:

    public class ZhuKe {
        public static void main(String[] args) {
    
            FangZhi target=new FangDong();
            InvocationHandler invocationHandler=new InvocationHandler() {
                @Override
                //参数1: proxy,代理对象,没有用
                //参数2:method,代理类当前执行的方法
                //参数3:argus,代理类当前执行方法的实际参数
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    //获取方法名
                    String methodName = method.getName();
    
                    //房子1租金上涨
                    if ("fangZhi01".equals(methodName)){
                        System.out.println("出租房,1288元每月,不包水电");
                        return null;
                    }
                    //执行不增强目标的方法
                    return method.invoke(target,args);
                }
            };
            Class[] interfaces=new Class[]{FangZhi.class};
            //1.代理类
            //参数1:类加载器,程序运行时,创建的新类,需要类加载器将其加载到内存中 固定写法:当前类名.class.getClassLoader()
            //参数2: 实现的接口的class类,是一个数组参数,new Class[]{接口.class,...}
            //参数3:处理类 InvocationHandler,代理类调用每一个方法都会执行invoke方法
            FangZhi proxyObj=(FangZhi) Proxy.newProxyInstance(ZhuKe.class.getClassLoader(),interfaces,invocationHandler);
            proxyObj.fangZhi01();
            proxyObj.fangZhi02();
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot并没有特定的设计模式,它是基于Spring框架的快速开发工具。然而,Spring框架本身使用了多种设计模式来实现其功能。其中一些常见的设计模式包括: 1. 工厂模式(Factory Pattern):Spring使用工厂模式来创建和管理Bean实例。通过配置文件或注解,Spring可以根据需要动态地创建和配置Bean。 2. 单例模式(Singleton Pattern):Spring默认将Bean定义为单例,即在整个应用程序中只创建一个实例。这样可以提高性能并确保Bean的一致性。 3. 模板模式(Template Pattern):Spring的JdbcTemplate是一个典型的模板模式的应用。它提供了一种简化数据库操作的方式,将常见的操作封装在模板中,开发人员只需要关注业务逻辑。 4. 策略模式(Strategy Pattern):Spring在加载Bean定义信息时,可以根据不同的来源(如XML、注解、Properties等)使用不同的策略来解析。这种灵活的方式正是策略模式的应用。 5. 装饰器模式(Decorator Pattern):Spring的AOP(面向切面编程)功能使用了装饰器模式。通过在原有的业务逻辑上添加额外的功能,实现了横切关注点的分离。 6. 观察者模式(Observer Pattern):Spring的事件机制使用了观察者模式。通过定义事件和监听器,可以实现组件之间的解耦和通信。 7. 代理模式Proxy Pattern):Spring的AOP功能也使用了代理模式。通过动态代理,可以在目标对象的方法执行前后添加额外的逻辑。 8. 适配器模式(Adapter Pattern)与责任链模式(Chain of Responsibility Pattern):这两种设计模式在Spring中并没有直接的应用,但是Spring的整体架构和设计理念可以看作是一种适配器模式和责任链模式的应用,通过各种组件的协作来实现灵活、可扩展的应用开发。 综上所述,Spring框架在实现功能时使用了多种设计模式,这些设计模式为开发人员提供了灵活、可扩展的开发方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值