Spring 实例化Bean的3种方式

时间:2022-10-27 19:05:55

 

要使用Spring中的Bean,需要先创建这个Bean的实例。

实例化Bean有3种方式:

  • 构造器方式
  • 静态工厂方式
  • 实例工厂方式

 

 

构造器方式

构造器方式是最常用的。在Bean中写构造函数,然后在配置文件中传递实参。

 示例:

1、写一个Bean,用构造器初始化这个Bean

 1 class Student{
 2     private String name;
 3     private int score;
 4 
 5     //通过构造器初始化对象
 6     public Student(String name,int score){
 7         this.name=name;
 8         this.score=score;
 9     }
10 
11     public void out(){
12         System.out.println(name+"的成绩是"+score);
13     }
14 }

 

 

2、在Spring配置文件中配置这个Bean,传递实参

1 <bean name="student" class="my_package.Student">
2         <constructor-arg value="张三" />
3         <constructor-arg value="90" />
4     </bean>

 

 

3、使用这个Bean

1 public class Test {
2     public static void main(String[] args) {
3         ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
4         Student student=applicationContext.getBean("student",Student.class);
5         student.out();   
6     }
7 }

 

 可以看到控制台输出了"张三的成绩是90"。

 

 

 

 

静态工厂方式

需要创建一个工厂类,在工厂类中写一个静态方法,返回该Bean的一个实例。

示例:

1、写一个Bean,依然需要构造器

 1 class Student{
 2     private String name;
 3     private int score;
 4 
 5     //构造器
 6     public Student(String name,int score){
 7         this.name=name;
 8         this.score=score;
 9     }
10 
11     public void out(){
12         System.out.println(name+"的成绩是"+score);
13     }
14 }

 

 

2、写一个工厂类,用静态方法生产该类的实例

1 class Factory{
2     //是静态方法
3     public static Student createStudent(String name,int age){
4         return new Student(name,age);
5     }
6 }

 因为在工厂中使用的是静态方法来生产该Bean的实例,所以称为静态工厂方式。

一个工厂可以有多个静态方法,生产多个Bean的实例。

 

 

3、在xml文件中配置Bean,只需要配置该Bean,不需要配置工厂。

<bean name="student" class="my_package.Factory" factory-method="createStudent">
        <constructor-arg value="张三" />
        <constructor-arg value="90" />
    </bean>

 class指定工厂类,factory-method指定生产该Bean实例的静态方法是哪个,这样就确定了这个Bean(类)。需要传参就传参。

因为是静态方法,直接通过工厂类名调用,所以不需要工厂类的实例,也就不需要在xml文件中配置工厂类。

 

 

4、使用该Bea的实例

1 public class Test {
2     public static void main(String[] args) {
3         ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
4         Student student=applicationContext.getBean("student",Student.class);
5         student.out();
6     }
7 }

 控制台打印出“张三的成绩是90”。

 

 

 

 

 

实例工厂方式

工厂中生产该Bean的方法不是静态的,在xml文件中需要同时配置工厂、该Bean。

1、写一个Bean,需要构造器

 1 class Student{
 2     private String name;
 3     private int score;
 4 
 5     //通过构造器初始化对象
 6     public Student(String name,int score){
 7         this.name=name;
 8         this.score=score;
 9     }
10 
11     public void out(){
12         System.out.println(name+"的成绩是"+score);
13     }
14 }

 

 

2、写一个工厂类,用实例方法生产Bean

1 class Factory{
2     //实例方法
3     public Student createStudent(String name,int age){
4         return new Student(name,age);
5     }
6 }

 

 

3、在xml文件中同时配置工厂类、该Bean

  <bean name="factory" class="my_package.Factory" />

    <bean name="student" factory-bean="factory" factory-method="createStudent">
        <constructor-arg value="张三" />
        <constructor-arg value="90" />
    </bean>

因为是通过工厂类的实例方法来创建Bean的实例,所以需要先创建工厂类的实例,所以需要在xml中配置工程类。工厂类是一个普通的Bean,配置方式和普通的配置一样。

该Bean是通过实例工厂生产的,需要通过factory-bean指定工厂所在的bean,通过factory-method指定生产该bean的实例方法,这样就确定了这个Bean(类)。

 

 

4、使用该Bean的实例

1 public class Test {
2     public static void main(String[] args) {
3         ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
4         Student student=applicationContext.getBean("student",Student.class);
5         student.out();
6     }
7 }