天天看點

Spring執行個體化bean的四種方式

下面介紹的是Spring執行個體化bean的四種方式,分别為:

  1. setter方式
  2. 構造方法執行個體化
  3. 靜态工廠方法執行個體化
  4. 工廠方法執行個體化

在介紹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());
}