基本内容
1、Spring bean创建的基本过程
2、bean的基本常用属性
3、DI注入
Spring bean创建的基本过程
预备知识:众所周知,Spring Bean中的基本实现是利用java的反射机制进行实现的。
public class User {
private String name = "";
}
利用反射机制实例化一个类的方法有三种:分别对用bean实例化一个对象的三种方法:
(1)对于无参数的类
Class class_user = Class.forName("demo.User");
User user = (User)class_user .newInstance();
所以,在类中一定存在一个无参数的构造函数,或者不存在构造函数(默认无参),
(2)如果希望利用反射机制实例化一个类的化,就需要用到类的构造器Constructor。
Class class_user = Class.forName("demo.User"); Constructor con =class_user.getConstructor(String.class); User user = (User)con.newInstance("Tim"); System.out.println(user.toString());
(3)可以通过类的无参构造函数进行实例化一个类,然后通过setter/getter方法对参数进行设置
package demo;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
public class Person {
private String name = "";
public void setName(String name){
this.name=name;
}
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
@Test
public void testReject(){
try {
Class class_person = Class.forName("demo.Person");
Person person = (Person)class_person.newInstance();
person.setName("tim");
System.out.println(person.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
与此对应的三种设置bean的方法:
(1)默认只需要两个属性,id与class 就可以完成变量的实例化。
<bean id="person" class="demo.Person" />
(2)通过构造函数进行实例化bean,注意:如果使用此种方法进行构造,必须要有与此对应的构造函数,
public Person(String name){ this.name=name; }
<bean id="person" class="demo.Person" > <constructor-arg name="name" value="tim"/> </bean>
(3)bean中使用property进行参数设置,这里面默认调用的是类中的setter方法,并通过无参构造函数实例化对象。因此如果使用此方法有两点注意:i)有无参构造方法 ii)含有setter方法
<bean id="person" class="demo.Person" >
<property name="name" value="tim"/>
</bean>
由此 ,我们可以发现,当bean使用property方式进行参数注入的时候,首先调用了无参的构造函数,然后调用setter方法进行参数设置。