spring的DI,实现思路解析。
1、加载配置文件(解析配置文件)
教程不介绍怎么解析,直接从拿到那些所需参数开始。
创建spring容器对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
需要加载配置文件的原因是:里面有类的路径,对象的属性值。
spring容器需要拿到这些东西去创建对象。并给他们赋值。
这里就说下spring是怎么创建对象的:
通过反射来实现,这里看一串代码:
public class test1 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//定义一个类路径
String classPath="com.xxp.bean.Student";
Class<?> c= Class.forName(classPath);
//通过反射创建对象
Object o = c.newInstance();
System.out.println(o);
//运行结果:Student{stuName='null', stuAge=null, stuGender='null'}
}
}
反射就可以通过获取到类路径然后创建对象,那么spring容器也是这样,所以他配置文件里面要配置一个类路径。
ok,接着说这个对象创建好之后,肯定要给属性赋值,spring是怎么实现的
public class test1 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//定义一个类路径
String classPath="com.xxp.bean.Student";
Class<?> c= Class.forName(classPath);
//通过反射创建对象
Object o = c.newInstance();
//获取到对象中的所有属性
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
//通过这种方式可以获取到所有的属性名
String fieldName=field.getName();
System.out.println(fieldName);
/***
* 运行结果:
* stuName
* stuAge
* stuGender
*/
}
}
}
到这里就通过这种方式获取到所有属性名,接下来就是说下spring的set方式赋值
下面代码获取到啦所以的属性名:
public class test1 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//定义一个类路径
String classPath="com.xxp.bean.Student";
Class<?> c= Class.forName(classPath);
//通过反射创建对象
Object o = c.newInstance();
//获取到对象中的所有属性
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
//通过这种方式可以获取到所有的属性名
String fieldName=field.getName();
//这里就是拼接 比如:setStuName
String setName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
//打印一下看看结果
System.out.println(setName);
/***
* 结果:
* setStuName
* setStuAge
* setStuGender
*/
}
}
}
给对象属性赋值
public class test1 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
//定义一个类路径
String classPath="com.xxp.bean.Student";
Class<?> c= Class.forName(classPath);
//通过反射创建对象
Object o = c.newInstance();
//获取到对象中的所有属性
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
//通过这种方式可以获取到所有的属性名
String fieldName=field.getName();
//这里就是拼接 比如:setStuName
String setName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
//给属性赋值
if ("stuName".equals(fieldName)){
Method method =c.getDeclaredMethod(setName,field.getType());
method.invoke(o,"1");
}
}
System.out.println(o);
/***
结果
* Student{stuName='1', stuAge=null, stuGender='null'}
*/
}
图中的框框里面的参数都是在配置文件中的,spring会对配置文件解析,这里不对配置文件解析进行解释,有兴趣可以看其他文章。
到这里就基本把spring–DI 的set方式实现说完啦,实际上就是通过反射调用啦类的set方法进行赋值。
所以类一定要有set方法