天天看点

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