【Spring】手写简化的IOC的DI代码

知识点:xml文件解析,java反射。

配置文件test1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="userDao" class="com.myspring.day2.myioc.UserDaoImpl" />
    <bean id="userService" class="com.myspring.day2.myioc.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao" />
    </bean>
    <bean id="client" class="com.myspring.day2.myioc.Client">
        <constructor-arg name="userService" ref="userService" />
    </bean>

</beans>

配置文件test2.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="user" class="com.myspring.day1.bean.User">
        <property name="id" value="1008611"></property>
        <property name="name" value="liuzhonglin"></property>
    </bean>

</beans>

myioc

1.通过反射使用构造器实现

package com.myspring.day2.myioc;

import com.myspring.day1.bean.User;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BeanFactory {
    //ioc容器
    private static Map<String,Object> beanMap=new HashMap<>();

    /**
     * 从ioc容器中取对象
     * @param beanName
     * @return Object
     * @throws Exception
     */
    public static Object getBean(String beanName) throws Exception {
        return beanMap.get(beanName);
    }

    /**
     * 初始化ioc容器
     * @param filePath
     */
    public static void refresh(String filePath) throws Exception{
        //拿到xml文件
        SAXReader saxReader=new SAXReader();

        URL url=BeanFactory.class.getClassLoader().getResource(filePath);

        Document document = saxReader.read(url);
        //获取根节点beans
        Element rootElement = document.getRootElement();
        //子元素bean
        List<Element> elements = rootElement.elements();
        //<bean>获取id,class
        for(Element e0:elements){
            xmlParse(e0);
        }
    }

    public static void xmlParse(Element e0) throws Exception{
        String id=e0.attributeValue("id");
        String className=e0.attributeValue("class");

        //<constructor-arg>获取name,ref
        List<Element> elements1 = e0.elements();

        if(elements1.size()==0){
            //无参构造方法创建对象
            Class<?> cls=Class.forName(className);
            Object o=cls.newInstance();
            beanMap.put(id,o);
        }else {
            //有参构造方法创建对象
            Class<?>[] paramType=new Class[elements1.size()];
            Object[] params=new Object[elements1.size()];
            for (int i=0;i<elements1.size();i++){
//                String name=e1.attributeValue("name");
                String ref=elements1.get(i).attributeValue("ref");
                Object param=beanMap.get(ref);
                params[i]=param;
                paramType[i]=param.getClass().getInterfaces()[0];
            }
            Object o=Class.forName(className)
                    .getDeclaredConstructor(paramType)
                    .newInstance(params);
            beanMap.put(id,o);
        }

    }

    public static void main(String[] args) throws Exception{
        BeanFactory.refresh("test1.xml");
        Client client = (Client) BeanFactory.getBean("client");
        client.add(new User("lzlsb","1999"));
    }
}

2.通过反射使用fields实现

public static void xmlParse(Element e0) throws Exception{
        String id=e0.attributeValue("id");
        String className=e0.attributeValue("class");

        //<constructor-arg>获取name,ref
        List<Element> elements1 = e0.elements();

        if(elements1.size()==0){
            //无参构造方法创建对象
            Class<?> cls=Class.forName(className);
            Object o=cls.newInstance();
            beanMap.put(id,o);
        }else {
            //有参构造方法创建对象
            Class<?> cls=Class.forName(className);
            Object o=Class.forName(className)
                    .newInstance();
            for (int i=0;i<elements1.size();i++){
                String name=elements1.get(i).attributeValue("name");
                String value=elements1.get(i).attributeValue("value");

                Field field = cls.getDeclaredField(name);
                field.setAccessible(true);
                field.set(o,value);
            }
            beanMap.put(id,o);
        }

    }

3.通过反射使用methods实现

public static void xmlParse(Element e0) throws Exception{
        String id=e0.attributeValue("id");
        String className=e0.attributeValue("class");

        //<constructor-arg>获取name,ref
        List<Element> elements1 = e0.elements();

        if(elements1.size()==0){
            //无参构造方法创建对象
            Class<?> cls=Class.forName(className);
            Object o=cls.newInstance();
            beanMap.put(id,o);
        }else {
            //有参构造方法创建对象
            Class<?> cls=Class.forName(className);
            Object o=Class.forName(className)
                    .newInstance();
            for (int i=0;i<elements1.size();i++){
                String name=elements1.get(i).attributeValue("name");
                String value=elements1.get(i).attributeValue("value");
                name="set"+name.substring(0,1).toUpperCase()+name.substring(1,name.length());
                Method method = cls.getMethod(name,String.class);
                method.invoke(o,value);
            }
            beanMap.put(id,o);
        }

    }

其他的普通类:

public class UserDaoImpl implements UserDao {
    public void addUser(User user) {
        System.out.println("add user successful :"+user.toString());
    }
}
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void addUser(User user) {
        userDao.addUser(user);
    }
}
public class Client {
    private UserService userService;

    public Client(UserService userService) {
        this.userService = userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void add(User user){
        userService.addUser(user);
    }

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user=(User) context.getBean("user");
        Client client=(Client) context.getBean("client");
        client.userService.addUser(user);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值