反射实现的简单IOC(xml配置)

1 篇文章 0 订阅
本文档介绍了如何使用Java反射和XML配置实现一个简单的IOC(Inversion of Control)容器。文章通过一个实例展示了如何注册和装配bean,包括基本类型的依赖注入。核心代码包括解析XML配置文件,根据bean的name或id获取并初始化对象,以及处理各种基本类型的属性注入。
摘要由CSDN通过智能技术生成

前言

最进上课老师要求自己写一个简单IOC,所以有了这篇文章QAQ
菜鸡一枚,如有错误欢迎交流

基本功能

通过xml进行对bean的注册和依赖注入(基本类型等的依赖注入)

xml配置

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

<application>
<beans>
    <bean id="teacherBean" name="teacher" class="IOC.bean.Teacher">
        <property name="name" value="Tom"/>
        <property name="ID" value="201925227518"/>
        <property name="height" value="178.5"/>
        <property name="weight" value="68.4"/>
        <property name="teachingAge" value="12"/>
        <property name="classAndGrade" value="510"/>
    </bean>
    <bean id="studentBean" name="student" class="IOC.bean.Student">
        <property name="name" value="Eric"/>
        <property name="ID" value="201925220507"/>
        <property name="scoreRanking" value="24"/>
        <property name="height" value="181.5"/>
        <property name="weight" value="76.8"/>
        <property name="birthday" value="1633588336828"/>
        <property name="grade" value="5"/>
    </bean>
</beans>
</application>

核心代码

package IOC.applicationContext;

public interface ApplicationContext {
    public Object getBeanByName(String name);
    public Object getBeanByID(String id);
}

package IOC.applicationContextLoader;

import IOC.applicationContext.ApplicationContext;
import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author : Eric
 * @date : ${DATA}
 */

public class applicationContextLoader implements ApplicationContext {
    private static Map<String,String> beansByName = new HashMap<>();
    private static Map<String,String> beansByID = new HashMap<>();
    private static final String NOT_EXIST = " [Warning] bean not exist! ";
    private static final String NOT_SUPPORTED = " [Warning] not supported type! ";


    //bean的注册,读取xml将已在配置文件注册的bean加载到Map中
    public applicationContextLoader(){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse("src/main/resources/applicationContext.xml");
            NodeList sList = d.getElementsByTagName("beans");
            for(int i = 0; i <sList.getLength() ; i++){
                Node node = sList.item(i);
                if (node.getNodeType()==Node.ELEMENT_NODE) {
                    NodeList beanList = node.getChildNodes();
                    for (int j = 0; j < beanList.getLength(); j++) {
                        Node beanNode = beanList.item(j);
                        if (beanNode.getNodeType() == Node.ELEMENT_NODE) {
                            beansByName.put(beanNode.getAttributes().getNamedItem("name").getTextContent(),beanNode.getAttributes().getNamedItem("class").getTextContent());
                            beansByID.put(beanNode.getAttributes().getNamedItem("id").getTextContent(),beanNode.getAttributes().getNamedItem("class").getTextContent());
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //根据属性名获取属性值
    private String getNodeValue(Node beanNode, String name){
        if(beanNode == null)return null;
        NodeList properties = beanNode.getChildNodes();
        for(int i = 0; i < properties.getLength(); i++){
            Node property = properties.item(i);
            if(property.getNodeType()==Node.ELEMENT_NODE && property.getAttributes().getNamedItem("name").getTextContent().equals(name))
                return property.getAttributes().getNamedItem("value").getTextContent();
        }
        return null;
    }

    /*
    利用反射对bean进行装配(根据bean的name),只允许基本数据类型等
     */
    public Object getBeanByName(String name){
        Date time = new Date();
        SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
        if(!beansByName.containsKey(name)){
            System.out.println(ft.format(time) + NOT_EXIST + "bean : " + name);
            return null;
        }
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            //获取bean的class
            Class<?> beanClass = Class.forName(beansByName.get(name));
            Object bean = beanClass.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse("src/main/resources/applicationContext.xml");
            NodeList sList = d.getElementsByTagName("beans");
            Node beanNode = null;
            //获取bean的属性的节点
            for(int i = 0; i <sList.getLength() ; i++){
                Node node = sList.item(i);
                if (node.getNodeType()==Node.ELEMENT_NODE) {
                    NodeList beanList = node.getChildNodes();
                    for (int j = 0; j < beanList.getLength(); j++) {
                        beanNode = beanList.item(j);
                        if (beanNode.getNodeType()==Node.ELEMENT_NODE && beanNode.getAttributes().getNamedItem("name").getTextContent().equals(name)) break;
                    }
                }
            }
            Field[] fields = beanClass.getDeclaredFields();
            for (Field field:fields) {
                field.setAccessible(true);
                String fieldName = field.getName();
                Class<?> fieldType = field.getType();
                String value = getNodeValue(beanNode,fieldName);
                if (value != null){
                    if (fieldType == String.class) {//String类型
                        field.set(bean,value);
                    } else if (fieldType == int.class || fieldType == Integer.class) {//int或Integer类型
                        field.set(bean, Integer.valueOf(value));
                    }else if (fieldType == float.class || fieldType == Float.class) {//float或Float类型
                        field.set(bean, Float.valueOf(value));
                    }else if (fieldType == double.class || fieldType == Double.class) {//double或Double类型
                        field.set(bean, Double.valueOf(value));
                    }else if (fieldType == byte.class || fieldType == Byte.class) {//byte或Byte类型
                        field.set(bean, Byte.valueOf(value));
                    }else if (fieldType == short.class || fieldType == Short.class) {//short或Short类型
                        field.set(bean, Short.valueOf(value));
                    }else if (fieldType == long.class || fieldType == Long.class){//long或Long类型
                        field.set(bean, Long.valueOf(value));
                    }else if (fieldType == boolean.class || fieldType == Boolean.class) {//boolean或Boolean类型
                        field.set(bean, Boolean.valueOf(value));
                    }else if (fieldType == java.util.Date.class) {//java.util.Date类型
                        field.set(bean, new java.util.Date(Long.parseLong(value)));
                    }else if (fieldType == java.sql.Date.class){//java.sql.Date类型
                        field.set(bean, new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(value).getTime()));
                    }else if (fieldType == java.sql.Timestamp.class){//java.sql.Timestamp类型
                        field.set(bean, new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value).getTime()));
                    }else {//其余类型不支持,可以扩展
                        System.out.println(ft.format(time) + NOT_SUPPORTED + "type : " + fieldType.getName());
                    }
                }else {
                    if (fieldType == String.class) {
                        field.set(bean,null);
                    } else if (fieldType == int.class || fieldType == Integer.class) {
                        field.set(bean, 0);
                    }else if (fieldType == float.class || fieldType == Float.class) {
                        field.set(bean, 0);
                    }else if (fieldType == double.class || fieldType == Double.class) {
                        field.set(bean, 0);
                    }else if (fieldType == byte.class || fieldType == Byte.class) {
                        field.set(bean, 0);
                    }else if (fieldType == short.class || fieldType == Short.class) {
                        field.set(bean, 0);
                    }else if (fieldType == long.class || fieldType == Long.class){
                        field.set(bean, 0);
                    }else if (fieldType == boolean.class || fieldType == Boolean.class) {
                        field.set(bean, false);
                    }else if (fieldType == java.util.Date.class) {
                        field.set(bean, null);
                    }else if (fieldType == java.sql.Date.class){
                        field.set(bean, null);
                    }else if (fieldType == java.sql.Timestamp.class){
                        field.set(bean, null);
                    }else {
                        System.out.println(ft.format(time) + NOT_SUPPORTED + "type : " + fieldType.getName());
                    }
                }
            }
            return bean;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    利用反射对bean进行装配(根据bean的id),只允许基本数据类型等
    public Object getBeanByID(String id){
        Date time = new Date();
        SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
        if(!beansByID.containsKey(id)){
            System.out.println(ft.format(time) + NOT_EXIST + "bean : " + id);
            return null;
        }
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            Class<?> beanClass = Class.forName(beansByID.get(id));
            Object bean = beanClass.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse("src/main/resources/applicationContext.xml");
            NodeList sList = d.getElementsByTagName("beans");
            Node beanNode = null;
            for(int i = 0; i <sList.getLength() ; i++){
                Node node = sList.item(i);
                if (node.getNodeType()==Node.ELEMENT_NODE) {
                    NodeList beanList = node.getChildNodes();
                    for (int j = 0; j < beanList.getLength(); j++) {
                        beanNode = beanList.item(j);
                        if (beanNode.getNodeType() == Node.ELEMENT_NODE && beanNode.getAttributes().getNamedItem("id").getTextContent().equals(id))
                            break;
                    }
                }
            }
            Field[] fields = beanClass.getDeclaredFields();
            for (Field field:fields) {
                field.setAccessible(true);
                String fieldName = field.getName();
                Class<?> fieldType = field.getType();
                String value = getNodeValue(beanNode,fieldName);
                if (value != null){
                    if (fieldType == String.class) {
                        field.set(bean,value);
                    } else if (fieldType == int.class || fieldType == Integer.class) {
                        field.set(bean, Integer.valueOf(value));
                    }else if (fieldType == float.class || fieldType == Float.class) {
                        field.set(bean, Float.valueOf(value));
                    }else if (fieldType == double.class || fieldType == Double.class) {
                        field.set(bean, Double.valueOf(value));
                    }else if (fieldType == byte.class || fieldType == Byte.class) {
                        field.set(bean, Byte.valueOf(value));
                    }else if (fieldType == short.class || fieldType == Short.class) {
                        field.set(bean, Short.valueOf(value));
                    }else if (fieldType == long.class || fieldType == Long.class){
                        field.set(bean, Long.valueOf(value));
                    }else if (fieldType == boolean.class || fieldType == Boolean.class) {
                        field.set(bean, Boolean.valueOf(value));
                    }else if (fieldType == java.util.Date.class) {
                        field.set(bean, new java.util.Date(Long.parseLong(value)));
                    }else if (fieldType == java.sql.Date.class){
                        field.set(bean, new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(value).getTime()));
                    }else if (fieldType == java.sql.Timestamp.class){
                        field.set(bean, new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value).getTime()));
                    }else {
                        System.out.println(ft.format(time) + NOT_SUPPORTED + "type : " + fieldType.getName());
                    }
                }else {
                    if (fieldType == String.class) {
                        field.set(bean,null);
                    } else if (fieldType == int.class || fieldType == Integer.class) {
                        field.set(bean, 0);
                    }else if (fieldType == float.class || fieldType == Float.class) {
                        field.set(bean, 0);
                    }else if (fieldType == double.class || fieldType == Double.class) {
                        field.set(bean, 0);
                    }else if (fieldType == byte.class || fieldType == Byte.class) {
                        field.set(bean, 0);
                    }else if (fieldType == short.class || fieldType == Short.class) {
                        field.set(bean, 0);
                    }else if (fieldType == long.class || fieldType == Long.class){
                        field.set(bean, 0);
                    }else if (fieldType == boolean.class || fieldType == Boolean.class) {
                        field.set(bean, false);
                    }else if (fieldType == java.util.Date.class) {
                        field.set(bean, null);
                    }else if (fieldType == java.sql.Date.class){
                        field.set(bean, null);
                    }else if (fieldType == java.sql.Timestamp.class){
                        field.set(bean, null);
                    }else {
                        System.out.println(ft.format(time) + NOT_SUPPORTED + "type : " + fieldType.getName());
                    }
                }
            }
            return bean;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

bean

package IOC.bean;

import lombok.*;

import java.util.Date;

@Getter
@Setter
@NoArgsConstructor
public class Student {
    private String name;
    private String ID;
    private int scoreRanking;
    private double height;
    private float weight;
    private Date birthday;
    private byte grade;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", ID='" + ID + '\'' +
                ", scoreRanking=" + scoreRanking +
                ", height=" + height +
                ", weight=" + weight +
                ", birthday=" + birthday +
                ", grade=" + grade +
                '}';
    }
}

package IOC.bean;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@NoArgsConstructor
public class Teacher {
    private String name;
    private String ID;
    private double height;
    private float weight;
    private int teachingAge;
    private short classAndGrade;

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", ID='" + ID + '\'' +
                ", height=" + height +
                ", weight=" + weight +
                ", teachingAge=" + teachingAge +
                ", classAndGrade=" + classAndGrade +
                '}';
    }
}

效果

package IOC.main;

import IOC.applicationContext.ApplicationContext;
import IOC.applicationContextLoader.applicationContextLoader;
import IOC.bean.Student;


public class demo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new applicationContextLoader();
        Student student = (Student) applicationContext.getBeanByID("studentBean");
        System.out.println(student.toString());
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值