下面介紹的是Spring執行個體化bean的四種方式,分别為:
- setter方式
- 構造方法執行個體化
- 靜态工廠方法執行個體化
- 工廠方法執行個體化
在介紹spring執行個體化bean的方式前,先展示bean代碼,後面執行個體化所用到的都是同一個bean
public class Student {
private String name;
private int age;
public Student() {
super();
System.out.println("無參構造方法");
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
System.out.println("帶參構造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
setter方式:
setter方式需要實體有對應的set方法,在配置檔案中利用property注入值。
bean.xml配置
<!-- setter 方式 -->
<bean id="student" class="com.zjm.spring.ioc.Student">
<property name="name" value="李四"></property>
<property name="age" value="30"></property>
</bean>
測試方法
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student stu = (Student)context.getBean("student");
System.out.println("姓名:"+stu.getName()+";年齡:"+stu.getAge());
}
構造方法執行個體化
構造方法執行個體化是最常用的執行個體化方法,一種是預設執行個體化,一種是帶參執行個體化
bean.xml
<!-- 預設構造方法執行個體化 -->
<bean id="student" class="com.zjm.spring.ioc.Student"></bean>
<!-- 帶參構造方法執行個體化 -->
<bean id="studentArgs" class="com.zjm.spring.ioc.Student">
<constructor-arg name="name" value="張三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
測試方法
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student stu = (Student)context.getBean("student");
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
stu = (Student)context.getBean("studentArgs");
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
}
靜态工廠方法執行個體化
靜态工廠指定使用class屬性指定工廠方法的類路徑,使用factory-method屬性來指定要執行個體化bean的方法,并且可以指定方法參數
<!-- 靜态工廠方法 -->
<bean id="studentFactory" class="com.zjm.spring.ioc.StudentFactory"
factory-method="createStudent"></bean>
<bean id="studentFactoryArgs" class="com.zjm.spring.ioc.StudentFactory"
factory-method="createStudent">
<constructor-arg name="name" value="張三" />
<constructor-arg name="age" value="18" />
</bean>
工廠方法
public static Student createStudent(){
return new Student();
}
public static Student createStudent(String name,int age){
return new Student(name,age);
}
測試方法
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student stu = context.getBean("studentFactory",Student.class);
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
stu = context.getBean("studentFactoryArgs",Student.class);
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
}
工廠方法執行個體化
工廠方法用class屬性指定工廠方法所在的bean,用factory-bean指定工廠bean,用factory-method指定工廠方法
bean.xml
<!-- 執行個體工廠方法 -->
<!-- 工廠方法所在的bean -->
<bean id="studentFactory" class="com.zjm.spring.ioc.StudentFactory"></bean>
<!-- 用工廠方法執行個體化bean -->
<bean id="student" factory-bean="studentFactory" factory-method="createStudent"></bean>
<bean id="studentArgs" factory-bean="studentFactory"
factory-method="createStudent">
<constructor-arg name="name" value="張三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
工廠方法
public Student createStudent(){
return new Student();
}
public Student createStudent(String name,int age){
return new Student(name,age);
}
測試方法
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student stu = context.getBean("student",Student.class);
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
stu = context.getBean("studentArgs",Student.class);
System.out.println("姓名:"+stu.getName()+" 年齡:"+stu.getAge());
}