Java练习(十八):编写代码,简单模拟Spring容器管理实例

目录

1. 要求

2. 运用到的知识点

2.1 spring的实例管理思想 

2.2 dom4j解析XML文件

3. 示例代码

3.1 在IDEA中创建Maven项目,在配置文件pom.xml中配置Spring相关的依赖包

 3.2 定义bean实体类:Info.java, Car.java, Train.java

3.3 准备bean配置文件 application.xml

3.4 定义接口BeanFactory, 接口中有一个getBean方法

3.5 定义MyXmlApplicationContext类,用来解析xml文件(bean配置文件)

3.6 定义入口测试类BeanFactoryTest, 通过MyXmlApplicationContext的getBean方法获取实例,运行实例相关的方法


1. 要求

模拟spring的容器管理实例。

即自己编码,取代下面这个API的功能,读取bean.xml文件,并生成实例。

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

HelloSpring helloSpring = (HelloSpring) context.getBean("hellospring");

1.1 准备配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="car" class="com.my.springfactory.Car">
    </bean>
    <bean id="train" class="com.my.springfactory.Train">
    </bean>
</beans>

1.2 定义类Car和Train里面只有一个run方法,默认构造方法

1.3 设计接口

public interface BeanFactory {    
     Object getBean(String id);
}​​

1.4 定义MyXmlApplicationContext类,用来解析xml文件,并实现接口BeanFactory。

1.5 测试类BeanFactoryTest中 ,通过MyXmlApplicationContext的getBean()方法获取实例,并完成Car或者Train的实例申请。

1.6 最后完成run方法的调用。

2. 运用到的知识点

2.1 spring的实例管理思想 

参考:Java练习(五):Spring应用之JavaBean (HelloSpring简单工程)

2.2 dom4j解析XML文件

(1)定义:dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。

(2)API接口

 (3)常见API

1)class org.dom4j.io.SAXReader

read  提供多种读取xml文件的方式,返回一个Document对象

2)interface org.dom4j.Document

iterator  使用此法获取node

getRootElement  获取根节点

3)interface org.dom4j.Node

getName  获取node名字,例如获取根节点名称为bookstore

getNodeType  获取node类型常量值,例如获取到bookstore类型为1——Element

getNodeTypeName  获取node类型名称,例如获取到的bookstore类型名称为Element

4)interface org.dom4j.Element

attributes  返回该元素的属性列表

attributeValue  根据传入的属性名获取属性值

elementIterator  返回包含子元素的迭代器

elements  返回包含子元素的列表

5)interface org.dom4j.Attribute

getName  获取属性名

getValue  获取属性值

6)interface org.dom4j.Text

getText  获取Text节点值

7)interface org.dom4j.CDATA

getText  获取CDATA Section值

8)interface org.dom4j.Comment

getText  获取注释 

3. 示例代码

3.1 在IDEA中创建Maven项目,在配置文件pom.xml中配置Spring相关的依赖包

在pom.xml上右键 --> Maven --> Reload project, 下载依赖包。

补:pom.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>BeanFactoryDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.3</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>


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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

 3.2 定义bean实体类:Info.java, Car.java, Train.java

(1)Info.java

package MyBeanFactory;

public class Info {
    public String getInfo(String p_msg){
        return p_msg;
    }
}

(2)Car.java

package MyBeanFactory;

public class Car {

    Info info = new Info(); //引用其他类
    public void run(){
        System.out.println(info.getInfo("打印信息"));
        System.out.println("汽车在跑...");
    }
}

(3)Train.java

package MyBeanFactory;

public class Train {
    public void run(){
        System.out.println("火车在跑...");
    }
}

3.3 准备bean配置文件 application.xml

<?xml version="1.0" encoding="UTF-8" ?>

<beans>
    <bean id="car1022" class="MyBeanFactory.Car">
    </bean>
    <bean id="train1022" class="MyBeanFactory.Train">
    </bean>
</beans>

3.4 定义接口BeanFactory, 接口中有一个getBean方法

package MyBeanFactory;

public interface BeanFactory {
    public Object getBean(String id);
}

3.5 定义MyXmlApplicationContext类,用来解析xml文件(bean配置文件)

package MyBeanFactory;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//MyXmlApplicationContext类用来解析xml文件(使用到了dom4j),实现接口BeanFactory
public class MyXmlApplicationContext implements BeanFactory{

    private Map<String, Object> instanceMap = new HashMap<String, Object>();

    //构造方法
    public MyXmlApplicationContext(String fileName) throws DocumentException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        // 创建SAXReader实例
        SAXReader reader = new SAXReader();
        // read()读取指定的XML文档并形成DOM树
        Document document = reader.read(new File(fileName));
        // getRootElement()获取根节点
        Element root = document.getRootElement();
        // elements()获取根节点的子节点
        @SuppressWarnings("unchecked")
        List<Element> childElements = root.elements();

        // 遍历子节点,获取id和生成实例,存放到Map中
        for(Element ele: childElements){
            instanceMap.put(ele.attributeValue("id"), Class.forName(ele.attributeValue("class")).newInstance());
        }
    }

    //重写方法,根据id,获取对应的类的实例
    @Override
    public Object getBean(String id) {
        return instanceMap.get(id);
    }
}

3.6 定义入口测试类BeanFactoryTest, 通过MyXmlApplicationContext的getBean方法获取实例,运行实例相关的方法

package MyBeanFactory;

import java.io.File;

public class BeanFactoryTest {

    public static void main(String[] args) {
        //System.getProperty()方法获取系统变量,获取指定键指示的系统属性
        //File.separator 的作用相当于 ' \ ',windows中文件分隔符用 ' \ ' 或者 ' / ' 都可以, 但在 Linux 中,是不识别 ' \ '  的,而 File.separator 是系统默认的文件分隔符号,在 UNIX 系统上,此字段的值为 ' / '
        //这里的application.xml,就是bean文件
        //下面这条语句,就是获取了bean文件的绝对路径
        String configFile = System.getProperty("user.dir") + File.separator + "application.xml";
        System.out.println(configFile);

        Object obj = null;
        try {
            //通过MyXmlApplicationContext的getBean方法获取实例
            obj = new MyXmlApplicationContext(configFile).getBean("car");
        } catch (Exception e) {
            e.printStackTrace();
        }

        //Car 或者Train的实例申请/转换
        Car car = (Car) obj;
        car.run();
    }

}

输出结果:

C:\Users\xxx\sourcecode\BeanFactoryDemo\application.xml
打印信息
汽车在跑...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值