Spring学习----------Spring Bean 的3种实例化方法介绍

本文介绍了Spring IoC容器中Bean的三种实例化方式:构造器实例化、静态工厂实例化及实例工厂实例化,并通过具体示例展示了每种方式的配置与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring IoC容器如何实例化Bean呢?

传统应用程序可以通过new反射方式进行实例化Bean。而Spring IoC 容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC 容器中主要有以下几种创建Bean实例的方式:

一.构造器实例化
构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean,如以下方式指定要创建的Bean类型:

1. 空构造器实例化:

[html] view plain copy
  1. <bean id="helloServiceNoWithArgs" class="cn.lovepi.***.HelloWorldImpl" />  
2. 有参数构造器实例化:
[html] view plain copy
  1. <bean id="helloServiceWithArgs" class=" cn.lovepi.***.HelloWorldmpl">  
  2.     <!-- 指定构造器参数 -->  
  3.     <constructor-arg index="0" value="Hello Spring!"/>  
  4. </bean>  
接下以一个简单的例子来介绍:
在项目中创建一个instance包,在包中创建一个HelloWorld接口:
[java] view plain copy
  1. public interface HelloWorld {  
  2.     public  void sayHello();  
  3. }  
接下来为这个接口创建一个实现类HelloWorldImpl:
[java] view plain copy
  1. public class HelloWorldImpl implements HelloWorld{  
  2.     private String message;  
  3.   
  4.     /** 
  5.     * 空构造器 
  6.     */  
  7.     HelloWorldImpl(){  
  8.         message="Hello World";  
  9.     }  
  10.   
  11.     /** 
  12.     * 带参数的构造器 
  13.     * @param message 
  14.     */  
  15.     HelloWorldImpl(String message){  
  16.         this.message=message;  
  17.     }  
  18.     public void sayHello() {  
  19.         System.out.println(message);  
  20.     }  
  21. }  
编写配置文件conf-instance.xml:
[html] view plain copy
  1. <!--使用默认构造参数-->  
  2. <bean id="helloWorldWithNoArgs"  
  3. class="cn.lovepi.chapter03.instance.HelloWorldImpl" />  
  4.   
  5. <!--使用有参数构造参数-->  
  6. <bean id="helloWorldWithArgs"  
  7. class="cn.lovepi.chapter03.instance.HelloWorldImpl" >  
  8.     <!-- 指定构造器参数 -->  
  9.     <constructor-arg index="0" value="Hello Args!"/>  
  10. </bean>  
接下来创建Main.java,作为程序入口
[java] view plain copy
  1. /** 
  2. * 使用无参数的构造函数来实例化bean 
  3. */  
  4. public static void sayHelloWordWithNoArgs(){  
  5.     BeanFactory factory=  
  6.             new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");  
  7.     HelloWorld helloWorld=factory.getBean("helloWorldWithNoArgs",HelloWorldImpl.class);  
  8.     helloWorld.sayHello();  
  9. }  
  10.   
  11. /** 
  12. * 使用有参数的构造函数来实例化bean 
  13. */  
  14. public static void sayHelloWorldWithArgs(){  
  15.     BeanFactory factory=  
  16.             new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");  
  17.     HelloWorld helloWorld=factory.getBean("helloWorldWithArgs",HelloWorldImpl.class);  
  18.     helloWorld.sayHello();  
  19. }  
二.使用静态工厂来实例化Bean
使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean,配置如下:
[html] view plain copy
  1. <!--使用有参数构造参数-->  
  2. <bean id="helloServiceStaticFactory"  class="cn.lovepi.***.HelloWorldStaticFactory"  
  3. factory-method="newInstance">  
  4.      <!-- 指定构造器参数 -->  
  5.      <constructor-arg index="0" value="Hello Static Factory!"/>  
  6. </bean>  
接下来我们在项目中实现:
首先编写静态工厂方法类HelloWorldStaticFactory
[java] view plain copy
  1. public class HelloWorldStaticFactory {  
  2.     /** 
  3.     * 工厂方法 
  4.     * @param message 
  5.     * @return 
  6.     */  
  7.     public static HelloWorld newInstance(String message){  
  8.         //返回带参数的HelloWorldImpl构造的helloWorld实例  
  9.         return new HelloWorldImpl(message);  
  10.     }  
  11. }  
接下来在配置文件中来配置当前bean
[html] view plain copy
  1. <!--静态工厂方式-->  
  2. <bean id="helloWorldStaticFactory"  
  3. class="cn.lovepi.chapter03.instance.HelloWorldStaticFactory"  
  4. factory-method="newInstance" >  
  5.     <!-- 指定构造器参数 -->  
  6.     <constructor-arg index="0" value="Hello Static Factory!"/>  
  7. </bean>  
在Main中实例化Bean
[java] view plain copy
  1. public static void sayHelloWordStaticFactory(){  
  2.     //读取配置文件,实例化一个IoC容器  
  3.     BeanFactory factory=  
  4.             new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");  
  5.     //从容器中获取bean,注意此处完全“面向接口编程而不是面向实现”  
  6.     HelloWorld helloWorld=factory.getBean("helloWorldStaticFactory",HelloWorld.class);  
  7.     //执行业务逻辑  
  8.     helloWorld.sayHello();  
  9. }  
三.使用实例工厂来实例化bean
使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
[html] view plain copy
  1. <!-- 1、定义实例工厂Bean -->  
  2. <bean id="beanInstanceFactory" class="cn.lovepi.***.HelloWorldInstanceFactory" />  
  3. <!-- 2、使用实例工厂Bean创建Bean -->  
  4.     <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory"  
  5.                               factory-method="newInstance">  
  6.          <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>  
  7.     </bean>  
接下来在项目中实现
首先我们编写实例化工厂方法HelloWorldInstanceFactory
[java] view plain copy
  1. public class HelloWorldInstanceFactory {  
  2.     /** 
  3.     * 工厂方法 
  4.     * @param message 
  5.     * @return 
  6.     */  
  7.     public HelloWorld newInstance(String message){  
  8.         //需要返回的bean实例  
  9.         return new HelloWorldImpl(message);  
  10.     }  
  11. }  
在配置文件中配置相关属性:
[html] view plain copy
  1. <!-- 1、定义实例工厂Bean -->  
  2. <bean id="helloWorldInstanceFactory"  
  3. class="cn.lovepi.chapter03.instance.HelloWorldInstanceFactory" />  
  4. <!-- 2、使用实例工厂Bean创建Bean -->  
  5. <bean id="helloWorldInstance"  
  6.       factory-bean="helloWorldInstanceFactory"  
  7.       factory-method="newInstance">  
  8.     <constructor-arg index="0"  
  9.                       value="Hello Instance Factory!">  
  10.   
  11.     </constructor-arg>  
  12. </bean>  
在Main中实例化Bean
[java] view plain copy
  1. public static void sayHelloWorldInstanceFactory(){  
  2.     //读取配置文件,实例化一个IoC容器  
  3.     BeanFactory factory=  
  4.             new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");  
  5.     //从容器中获取bean,注意此处完全“面向接口编程而不是面向实现”  
  6.     HelloWorld helloWorld=factory.getBean("helloWorldInstance",HelloWorld.class);  
  7.     //执行业务逻辑  
  8.     helloWorld.sayHello();  
  9. }  
总结:
实例化Bean的三种方式的不同之处仅仅在于其配置文件的格式上,其使用方式都是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值