Java反射应用_自己实现简易Spring IOC逻辑过程

1、首先定义UserModel测试类

package com.gooagoo.ioc;

public class UserModel
{
    private String username;
    
    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public void printUser(){
        System.out.println("User[username=" + this.username + "]");
    }
}

2、定义applicationContext.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" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	
	<bean id="user" class="com.gooagoo.ioc.UserModel">
		<property name="username" value="liup" />
	</bean>
	</beans>

3、使用dom4j解析xml文件,并使用反射技术动态创建实例对象,调用setter方法注入属性值

package com.gooagoo.ioc;

import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

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

import com.gooagoo.common.utils.FileUtils;


public class TestIOC
{

    public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        // 查找配置文件方式:
        InputStream inputStream = TestIOC.class.getResourceAsStream("/applicationContext.xml"); // 查找原理?
        SAXReader saxReader = new SAXReader();
        Document xmlDoc = saxReader.read(inputStream);
        Element rootElement = xmlDoc.getRootElement();
        
        // 示例:Map<beanId,beanInstance>
        Map<String,Object> beanMap = new HashMap<String,Object>();
        
        String beanId = null;
        String beanClassName = null;
        List<Element> subElesFirstLevel = rootElement.elements("bean");
        for(Element subEleFirstLevel:subElesFirstLevel){
            beanId = subEleFirstLevel.attribute("id").getValue();
            beanClassName = subEleFirstLevel.attribute("class").getValue();
            
            // 暂时只处理User
            if(!beanId.equals("user")){
                continue;
            }
            
            Map<String,String> properties = new HashMap<String,String>();
            List<Element> subElesSecondLevel = subEleFirstLevel.elements("property");
            for(Element subEleSecondLevel:subElesSecondLevel){
                properties.put(subEleSecondLevel.attribute("name").getValue(), subEleSecondLevel.attribute("value").getValue());
            }
            
            // 动态创建类
            Class<?> beanClass = Class.forName(beanClassName); // 并没有创建instance,只是将类型描述信息(Class)加载到JVM内存中
            // 创建实例并加入Map集合中
            Object instanceObj = Class.forName(beanClassName).newInstance(); // 真正实例化
            beanMap.put(beanId, instanceObj);
            
            // 获取setter方法
            Method[] methods = beanClass.getMethods();
            
            // 遍历xml中配置属性集合Map
            Set<String> keySet = properties.keySet();
            for(String key:keySet){
                // 遍历找到属性对应setter方法
                for(Method method: methods){
                    if(method.getName().toLowerCase().contains("set") && method.getName().toLowerCase().contains(key)){
                        // 匹配到setter方法,调用一下将配置的属性值注入
                        method.invoke(instanceObj, properties.get(key));
                    }
                }
            }
        }
        
        // 测试:根据BeanId获取对应Bean Instance
        UserModel userTest = (UserModel)beanMap.get("user");
        userTest.printUser();
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值