知识点一:spring之实例化bean

本文介绍了Spring框架中Bean的三种实例化方式:基本实例化、简单工厂方法和抽象工厂方法。详细阐述了每种方式的XML配置和Java代码示例,并解释了静态工厂方法和实例工厂方法的区别。

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

  1. 最基本的:

    Xml代码 复制代码
    1. <bean id="someBean" class="some.someBeanSimpleFactory"/>  
    <bean id="someBean" class="some.someBeanSimpleFactory"/>
    
    

     

    Java代码 复制代码
    1. public class SomeBean{    
    2.     public void excute(){    
    3.          System.out.println("hi.");    
    4.     }    
    5. }  
    public class SomeBean{ 
        public void excute(){ 
             System.out.println("hi."); 
        } 
    }
    

     

  2. 简单工厂方法:
    Xml代码 复制代码
    1. <bean id="someBean" class="some.someBeanSimpleFactory" factory-method="create"/>  
    <bean id="someBean" class="some.someBeanSimpleFactory" factory-method="create"/>
     
    Java代码 复制代码
    1. public class SomeBeanSimpleFactory{    
    2.     public static SomeBean create(){    
    3.          new SomeBean();    
    4.     }    
    5. }  
    public class SomeBeanSimpleFactory{ 
        public static SomeBean create(){ 
             new SomeBean(); 
        } 
    }
    
     注意static。
  3. 抽象工厂方法:
    Xml代码 复制代码
    1. <bean id="someBeanFactory" class="some.someBeanFactory"/>  
    2. <bean id="someBean" class="someBeanFactory" factory-method="create"/>  
    <bean id="someBeanFactory" class="some.someBeanFactory"/>
    <bean id="someBean" class="someBeanFactory" factory-method="create"/>
    
     
    Java代码 复制代码
    1. public class SomeBeanFactory{    
    2.     public SomeBean create(){    
    3.          new SomeBean();    
    4.     }    
    5. }  
    public class SomeBeanFactory{ 
        public SomeBean create(){ 
             new SomeBean(); 
        } 
    }
    
     注意不是static方法。

这3种实例化Bean的方式都是

Java代码 复制代码
  1. ApplicationContext context=....;   
  2. SomeBean bean=(SomeBean)context.getBean("someBean");  
ApplicationContext context=....;
SomeBean bean=(SomeBean)context.getBean("someBean");

 

 

p.s. id和name的不同

  在xml文件中id是固有的属性,并且属性值是唯一的。name属性值在Spring的配置文件中也是唯一的,id和name的作用都是标识一个bean的。不同之处于,name属性值可以带有特殊字符,例如:name="ss/s"

 

 

3.2.3.2. 实例化bean
就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器们将要实例化的对象的类型以及如何实例化对象。

当采用XML描述配置元数据时,将通过<bean/>元素的class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的Class属性)通常是必须的(不过也有两种例外的情形,见第 3.2.3.2.3 节 “使用实例工厂方法实例化”和第 3.6 节 “bean定义的继承”)。class属性主要有两种用途:在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。

3.2.3.2.1. 用构造器来实例化
当采用构造器来创建bean实例时,Spring对class并没有特殊的要求,们通常使用的class都适用。也就是说,被创建的类并不需要实现任何特定的接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据所采用的IoC类型,class可能需要一个默认的空构造器。

此外,IoC容器不仅限于管理JavaBean,它可以管理任意的类。不过大多数使用Spring的人喜欢使用实际的JavaBean(具有默认的(无参)构造器及setter和getter方法),但在容器中使用非bean形式(non-bean style)的类也是可以的。比如遗留系统中的连接池,很显然它与JavaBean规范不符,但Spring也能管理它。

当使用基于XML的元数据配置文件,可以这样来指定bean类:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
给构造函数指定参数以及为bean实例设置属性将在随后的部份中谈及。

3.2.3.2.2. 使用 静态工厂方法实例化
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。

下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中, createInstance()必须是一个static方法。

<bean id="exampleBean"
      class="examples.ExampleBean2"
      factory-method="createInstance"/>
给工厂方法指定参数以及为bean实例设置属性将在随后的部份中谈及。

3.2.3.2.3. 使用实例工厂方法实例化
与使用静态工厂方法实例化类似,用来进行实例化的实例工厂方法位于另外一个已有的bean中,容器将调用该bean的工厂方法来创建一个新的bean实例

为使用此机制,class属性必须为空,而factory-bean属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定(参看以下的例子)。

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="myFactoryBean" class="...">
  ...
</bean>
  <!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>
虽然设置bean属性的机制仍然在这里被提及,但隐式的做法是由工厂bean自己来管理以及通过依赖注入(DI)来进行配置。

3.2.4. 使用容器
从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory们可以访问bean定义。下面的例子创建了一个bean工厂,此工厂将从xml文件中读取bean定义:

InputStream is = new FileInputStream("beans.xml");
BeanFactory factory = new XmlBeanFactory(is);
基本上就这些了,接着使用getBean(String)方法就可以取得bean的实例;BeanFactory提供的方法极其简单。它仅提供了六种方法供客户代码调用:

boolean containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true

Object getBean(String):返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常

Object getBean(String, Class):返回以给定名称注册的bean实例,并转换为给定class类型的实例,如果转换失败,相应的异常(BeanNotOfRequiredTypeException)将被抛出。上面的getBean(String)方法也适用该规则。

Class getType(String name):返回给定名称的bean的Class。如果没有找到指定的bean实例,则抛出NoSuchBeanDefinitionException异常。

boolean isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式(singleton将在bean的作用域中讨论),如果bean没找到,则抛出NoSuchBeanDefinitionException异常。

String[] getAliases(String):返回给定bean名称的所有别名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值