在面向对象程序中,如要使用某个对象,就需要先实例化这个对象。同样的,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别是:构造器实例化、静态工厂实例化、实例工厂方式实例化。
构造器实例化 : 构造器实例化是指Spring容器通过Bean对应类中默认的无参构造方法来实例化Bean。
(1)创建一个Bean1类
1 public class Bean1 { 2 public void say() { 3 System.out.println("Bean1 by Construtor !"); 4 } 5 }
(2)配置xml文件
1 <bean id="bean1" class="constructor.Bean1" />
(3)创建一个测试类测试是否能实例化Bean1
1 public class Test1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 ClassPathXmlApplicationContext context = 6 new ClassPathXmlApplicationContext("applicationContext.xml"); 7 Bean1 bean1 = (Bean1)context.getBean("bean1"); 8 bean1.say(); 9 context.close(); 10 } 11 12 }
静态工厂方式实例化
(1)创建一个Bean2类
1 public class Bean2 { 2 public void say() { 3 System.out.println("Bean2 by StaticFactory !"); 4 } 5 }
(2)创建一个MyBean2Factory类,并创建一个静态方法createBean()来返回Bean2实例
1 public class MyBean2Factory { 2 public static Bean2 createBean() { 3 return new Bean2(); 4 } 5 }
(3)配置XML文件
1 <bean id="bean2" class="static_factory.MyBean2Factory" factory-method="createBean" />
实例工厂方式实例化
(1)创建一个Bean3类
1 public class Bean3 { 2 public void say() { 3 System.out.println("Bean3 by Factory !"); 4 } 5 }
(2)创建一个MyBean3Factory类,并创建一个静态方法createBean()来返回Bean2实例
1 public class MyBean3Factory { 2 public Bean3 createBean() { 3 return new Bean3(); 4 } 5 }
(3)配置XML文件
1 <!-- 配置工厂 --> 2 <bean id="myBean3Factory" class="factory.MyBean3Factory" /> 3 <!-- 使用factory-bean 属性指向配置的实例工厂 --> 4 <bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean"/>
三种实例化方式的区别
构造器实例化:通过无参构造的方法实例化Bean,其实质是将Bean对应的类交给Spring自带的工厂(BeanFactory)管理,由Spring自带的工厂模式帮我们创建和维护这个类
静态工厂方式实例化:通过静态工厂创建并返回Bean。其实质是将Bean对应的类交给我们自己的静态工厂管理。Spring只是帮我们调用了静态工厂创建实例的方法。运用:很多时候我们在使用第三方jar包提供给我们的类时,由于这个类没有构造方法,是通过第三方包提供的静态工厂创建的,如果我们想把第三方jar包里面的这个类交由Spring来管理的话,就可以使用Spring提供的静态工厂创建实例的配置。
实例工厂方式实例化:通过实例工厂创建并返回Bean,其实质就是把创建实例的工厂类和调用工厂类的方法创建实例的方法的过程也交由Spring管理,创建实例的这个过程也是由我们自己配置的实例工厂内部实现的。运用:如Spring整合Hibernate就是通过这种方式实现的。但对于没有与Spring整合过的工厂类,我们一般都是自己用代码来管理的。