基于反射启动Spring容器

Posted INEFFABLE LAND

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于反射启动Spring容器相关的知识,希望对你有一定的参考价值。

基于反射启动Spring容器

package com.maple.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;

/**
 * author: HuaZhe Ray
 * <p>
 * describe: TODO
 * <p>
 * createDate: 2018/1/2
 * createTime: 16:16
 */
public class TestSpring {


    public static void main(String[] args) throws Exception {

        List<String> xmlPaths = new ArrayList<>();

        Enumeration<URL> resources = TestSpring.class.getClassLoader().getResources("services.xml");

        while (resources.hasMoreElements()) {
            URL nextElement = resources.nextElement();

            // not load isuwang-soa-transaction-impl
            if (!nextElement.getFile().matches(".*dapeng-transaction-impl.*"))
                xmlPaths.add(nextElement.toString());
        }

        // ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new Object[]{xmlPaths.toArray(new String[0])});
        // context.start();
        Class<?> appClass = TestSpring.class.getClassLoader().loadClass("org.springframework.context.support.ClassPathXmlApplicationContext");

        Class<?>[] parameterTypes = new Class[]{String[].class};
        //根据参数 反射构造器
        Constructor<?> constructor = appClass.getConstructor(parameterTypes);


        Object context = constructor.newInstance(new Object[]{xmlPaths.toArray(new String[0])});

//        ApplicationContext context1 = new ClassPathXmlApplicationContext("services.xml");

//        context1.getBean("testService");

        Method startMethod = appClass.getMethod("start");

        startMethod.invoke(context);

        Method m = appClass.getMethod("getBean", String.class);

        TestService service = (TestService) m.invoke(context, "testService");
        service.foo();

    }


}

以上是关于基于反射启动Spring容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring IoC容器初始化源码—populateBeaninitializeBean填充Bean字段反射和setter方法依赖注入以及IoC容器初始化总结四万字

Spring--简记

Java利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用

Spring容器启动源码解析

面试:谈谈你对Spring框架的理解

spring框架是干什么用的