参考博客
在使用spring时,我们经常会使用@Autowired进行自动装配
但装配的对象大多是私有成员,在没有set方法以及构造函数的情况下spring仍能进行注入。
这是如何实现的呢?
一、通过反射拿到无参构造函数
spring在创建对象时会先通过反射获取到其构造函数,创建初始对象。
Constructor<?> constructor = Teacher.class.getConstructor(null);
二、Spring创建对象时如何注入依赖对象
由于我们将对象交由spring进行管理,spring在创建完对象后需要对对象进行赋值,但我们经常使用的@Autowired一般是夹在私有对象上的。在没有set和get方法的情况下,spring是如何注入依赖的呢
field.setAccessible(true);
在java中可以通过反射拿到所有属性,并通过setAccessible方法设置其属性可以通过反射获取
Field[] fields = Teacher.class.getDeclaredFields();
Student student = new Student();
student.setName("zhangsan");
Teacher teacher = new Teacher();
for (Field field : fields) {
if(field.getType().getName().equals(Student.class.getName())){
//关键点!设置私有成员属性为可访问!
field.setAccessible(true);
//将已创建的对象赋值
field.set(teacher, student);
}
}
teacher.print()
这样就可以将私有成员的注入进去了