一、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>