Spring源码解析-前置篇

276 阅读1分钟

Spring源码解析-前置篇

spring源码非常复杂,所以我以一个FileSystemXmlApplicationContext作为整个源码解析的切入点.

  1. User 一个简单的POJO

  2. FileSystemXmlApplicationContextStudy 启动类

  3. beans.xml 和beans2.xml xml配置文件

  4. UserToStringMethodPlacer 一个方法替换类

大家可以按照我写的这些类切入Spring源码

FileSystemXmlApplicationContextStudy

/**
 * @author wangpp
 */
public class FileSystemXmlApplicationContextStudy {

    public static void main(String[] args) {
        /*
        使用 FileSystemXmlApplicationContext
         */
        fileSystemXmlApplicationContextTest();

    }

    private static void fileSystemXmlApplicationContextTest() {
        FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext();

        fileSystemXmlApplicationContext.setConfigLocation("D:\\sts_workspace\\study\\string-study\\src\\main\\resources\\beans.xml");

        fileSystemXmlApplicationContext.refresh();

        User user = fileSystemXmlApplicationContext.getBean("user", User.class);

        System.out.println(user);

    }
}

User

/**
 * @author wangpp
 */
public class User {
    private String name;
    private String password;
    private User admin;

    public User getAdmin() {
        return admin;
    }

    public void setAdmin(User admin) {
        this.admin = admin;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

使用了2个xml文件,分别是beans.xml和beans2.xml

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--111
222
333
444
555-->
<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">
    <alias name="methodPlacer" alias="mm"/>

    <import resource="classpath:beans2.xml"/>
    <bean class="spring.beans.User" name="user">
        <description>message</description>
        <constructor-arg name="name" value="nn"/>
        <constructor-arg name="password" value="1"/>
        <meta key="ak" value="av"/>
        <property name="name" value="wpp"/>
        <property name="password" value="1234"/>
        <replaced-method name="toString" replacer="methodPlacer"/>
        <lookup-method name="getAdmin" bean="parent"/>
        <replaced-method name="toString" replacer="methodPlacer"/>
        <qualifier value="s" type="java.lang.String"/>
    </bean>
    <bean class="spring.beans.UserToStringMethodPlacer" name="methodPlacer"></bean>
</beans>

beans2.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 name="parent" class="spring.beans.User"></bean>
</beans>

UserToStringMethodPlacer

/**
 * @author wangpp
 */
public class UserToStringMethodPlacer implements MethodReplacer {
    @Override
    public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
        return method.getName();
    }
}