疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Spring学习笔记Bean的命名及实例化


 

 
一、Bean的命名
 
前一篇讲到IoC是一个管理Bean的容器,Bean多数情况下都是通过XML文件进行配置的,其中Bean的命名有以下几种方式,现在梳理一下。
 
1. 不指定id,只配置类名
 
<bean class="com.erving.HelloImpl"></bean>
若要调用该Bean,需要用以下语句:
 
HelloApi helloApi = context.getBean(HelloApi.class);
2. 指定id,且id必须在IoC容器中唯一
 
<bean id="hello" class="com.erving.HelloImpl"></bean>
若要调用,则需要用以下语句:
 
HelloApi helloApi = context.getBean("hello", HelloApi.class);
3. 指定name,且name必须在IoC容器中唯一
 
<bean name="hello" class="com.erving.HelloImpl"></bean>
若要调用,则需要用以下语句:
 
HelloApi helloApi = context.getBean("hello", HelloApi.class);
4. 同时指定了id和name,则id作为标识符,name作为别名,这两者在容器中都唯一。
 
<bean id="hello" name="alias" class="com.erving.HelloImpl"></bean>
这时Bean即可通过id实例化,也可通过name实例化:
 
HelloApi helloApi1 = context.getBean("hello", HelloApi.class);
HelloApi helloApi2 = context.getBean("alias", HelloApi.class);
5. 当一个Bean有多个name时,第一个为标识符,其他的为别名。多个name之间可通过分号、顿号或空格隔开。
 
6. 此外,还可以通过<alias>标签指定别名。
 
<bean name="hello" class="com.erving.HelloImpl"></bean>
<alias name="hello" alias="alias"/>
这与以下语句的效果完全一致
 
<bean name="hello;alias" class="com.erving.HelloImpl"></bean>
 
 
二、Bean的实例化
 
Bean的实例化有三种形式,分别为构造器、静态工厂和实例工厂。
 
1. 构造器。
 
通常情况,通过反射调用指定类的构造器来创建bean。此时bean的类型不一定为JavaBean,任何Java类都可以。构造器又分为无参数构造器和有参数构造器。
 
以上介绍的都是无参数构造器,配置如下:
 
<bean id="hello" class="com.erving.HelloImpl"></bean>
有参数的构造器,配置如下:
<bean name="hello" class="com.erving.HelloImpl2">
     <constructor-arg index="0" value="erving..."></constructor-arg>
</bean>
2. 静态工厂。
 
首先定义静态工厂类:
 
public class HelloApiStaticFactory {
    
    public static HelloApi newInstance(String message) {
        return new HelloImpl2(message);
    }
}
然后编辑配置文件:
 
<bean id="bean2" class="com.erving.HelloApiStaticFactory" factory-method="newInstance">
      <constructor-arg index="0" value="tian..."></constructor-arg>
</bean>
其中的class属性为静态工厂类,另外需要指明实例化bean的方法。
 
具体实例化与第一种方法完全一致:
 
public void testStaticFactory() {
    ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
    HelloApi helloApi = context.getBean("bean2", HelloApi.class);
    helloApi.sayHello();
}
3. 实例工厂。
 
首先定义实例工厂类:
 
public class HelloApiInstanceFactory {
    
    public HelloApi newInstance(String message) {
        return new HelloImpl2(message);
    }
}
然后修改配置文件,配置文件分为两部分:一是实例工厂的bean,二是通过工厂bean创建bean。
 
<!-- 1、定义实例工厂Bean -->  
<bean id="beanInstanceFactory" class="com.erving.HelloApiInstanceFactory"/>  
<!-- 2、使用实例工厂Bean创建Bean -->  
<bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance">  
    <constructor-arg index="0" value="Hello Spring!"></constructor-arg>  
</bean>