java xml转map_JAVA学习之路~spring框架(一)

本文介绍了Spring框架的基础知识,包括MVC思想、高级框架介绍、核心概念如IOC和DI,以及如何手动创建IOC容器。详细阐述了IOC实例化bean的三种方式、依赖注入、Bean自动扫描和不同作用域。同时,讨论了Bean的生命周期和初始化、销毁方法。
摘要由CSDN通过智能技术生成

3ebd857a9decc6011f25d842671bc435.png

一.MVC思想

M:Model 数据模型(javaBean实体类) V:View 视图(前端jsp,html等等) C:Controller 控制层(处理业务逻辑)

二.高级框架介绍

Dao层: MyBatis,Hibernate,Spring Data jpa Bean管理: Spring Controller层: SpringMVC 微服务:Dubbo,SpringCloud

三.spring的核心

IOC:控制反转

DI:依赖注入

AOP:面向切面

四.环境搭建

1.创建maven项目 2.添加项目依赖 3.添加配置文件 4.编写测试代码 5.运行单元测试

五.IOC容器---控制反转

a8a756511d5e8545a0610dc58ff68c27.png

5.1.手写IOC容器

知识点: xml解析(dom4j+xPath) 反射 集合(list,map)

步骤:

1.在pom.xml中添加dom4j和xPath的依赖

    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.6</version>
    </dependency>

2.创建资源文件resoures

新建xxxx.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="userService" class="com.shsxt.service.UserService"></bean>
</beans>

新建bean,里面只有id,class

public class SxtBean {

    private String id;
    private String clazz;

    public SxtBean(String id, String clazz) {
        this.id = id;
        this.clazz = clazz;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "SxtBean{" +
                "id='" + id + ''' +
                ", clazz='" + clazz + ''' +
                '}';
    }
}

3.在java中新建ApplicationContext接口

package com.shsxt.ioc;

/** 接口
 *
 *
 * 手写IOC容器
 */
public interface ApplicationContext {
    

   //抽象方法
    public  Object getBean(String id);
}

4.在java中新建xxApplicationContext普通类实现接口

public class ShsxtApplicationContext implements ApplicationContext {
   //xml配置文件路径
    private String xmlPath;
    // 存储解析结果
    private List<SxtBean> sxtBeans = new ArrayList<>();
     //容器来存放反射生成的实例
    private Map<String ,Object> beanMap=new HashMap<>();

 /**  4.1.解析xml
     * 4.2.存放bean
     * 4.3.通过Map映射key与实例的关系
     *
     * @param id
     * @return
     */

       //构造器快捷键  alt+insert  
       //带参构造,用来传递xml文件路径
    public ShsxtApplicationContext(String xmlPath) {
        this.xmlPath = xmlPath;
        //1.解析xml
        parseXml(xmlPath);
        // 3.反射生成bean
        initBeans();
    }

    //重写方法
      @Override
    public Object getBean(String id) {

        return beanMap.get(id);
    }
 
}

4.1解析xml文件

4.2将解析出来的结果添加到集合

/**
     * 解析xml
     * @param xmlPath
     */
    private void parseXml(String xmlPath) {
        if(null==xmlPath || "".equals(xmlPath)){
            System.err.println("文件不存在");
        }else {
            // 读取xml文件
            SAXReader reader = new SAXReader();
            URL url = this.getClass().getClassLoader().getResource(xmlPath);
            try {
                Document document = reader.read(url);
                //获取节点
                List<Element> list = document.selectNodes("/beans/bean");
                for(Element e : list){
                    String id = e.attributeValue("id");
                    String clazz = e.attributeValue("class");
                    //System.out.println(id + ": "+clazz);
                    // 添加到集合
                    sxtBeans.add(new SxtBean(id, clazz));
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }

    }

4.3反射生成bean并添加到map容器中

/**
     * 反射生成bean
     */
    private void initBeans() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        if(sxtBeans.size()>0){
            for(SxtBean s : sxtBeans){
                String id = s.getId();
                String clazz = s.getClazz();
                beans.put(id,Class.forName(clazz).newInstance());
            }
        }
    }

5.新建单元测试类,测试代码(快捷键 alt+enter)

public class SxtApplicationContextTest {

    @Test
    public void test01() throws IllegalAccessException, ClassNotFoundException, InstantiationException {
        ApplicationContext context = new SxtApplicationContext("spring.xml");
        HelloService helloService = (HelloService) context.getBean("helloService");
        helloService.hello();
       
    }



}

六.IOC实例化bean的三种方式

1.通过空构造(默认)

一般使用这种形式,只需配置bean标间,必须保证空构造

2.通过静态工厂

bean初始化

3.通过实例化工厂

使用场景:框架整合

3ec81b22f9ef62e3dc07853297b76943.png

七.DI 依赖注入

c48af962f9529d527fce2cff688e3af6.png

所注入的属性,必须存在setter方法

1.注入的方式:

set注入(默认):必须存在setter方法----掌握
构造器注入:必须存在构造器------掌握

静态工厂注入(了解)
实例化工厂注入(了解)

2.p标签和c标签

用来简化注入的配置

八.Bean自动扫描

1.@controller-----control层,servlet层

2.@Service-----service层

3.@Repository-----dao层

4.@Component-----不明确的层(不属于上面三种)

九.依赖注入注解

1.Autowired----通过类型来匹配(跟id无关)

由spring提供,默认通过类型匹配

2.@Resource(name="id")

由jdk提供,默认通过name(id)匹配,如果name为空,则通过类型匹配

后面不带属性,默认name为空

十.bean作用域

1.单例和prototype(原型)

默认单例,每次返回的对象是同一个对象;

dbd851667acfae3137f76a86a273a484.png
自带单例验证方法

非单例设置:xml中配置scope="prototype"每次返回新对象

2.懒加载(lazy-init)

默认非懒加载

十一.bean 的生命周期

1.bean的定义:定义bean标签<bean></bean>

2.bean的初始化:通过init-method="init"来监听bean的初始化操作

3.bean的使用

4.bean 的销毁(需要通过抽象容器的destroy方法销毁)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值