Spring源码解析-前置篇
spring源码非常复杂,所以我以一个FileSystemXmlApplicationContext作为整个源码解析的切入点.
User 一个简单的POJO
FileSystemXmlApplicationContextStudy 启动类
beans.xml 和beans2.xml xml配置文件
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();
}
}