要使用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 }