spring容器創建bean對象的方式以及如何處理多個spring配置文件
1.spring容器創建bean對象的方式
注意:我們之前說的DI依賴注入是對於bean對象的屬性的注入,是如何給屬性賦值,如何配置屬性,並不是創建對象。
(1)xml文件中有bean的配置,而且這個bean所對應的java類中存在一個無參構造器,那么這個時候spring容器就可以使用反射調用無參構造器來創建實例了(常規的方式);所以默認下我們是用無參構造器來創建bean的。這里和我們就是我們原來的做法,不進行代碼演示,如果想測試,可以把一個bean類的無參構造器去掉,發現程序會報錯。
(2)通過工廠類獲得實例(工廠類實現了接口FactoryBean<?>)
注意spring中的PropertyPlaceholderConfigurer類的使用,在htmlsingle中直接搜索類名即
例如:
//工廠類實現指定接口並且實現接口中的三個抽象方法:
- public class ConnectionFactory implements FactoryBean<Connection>{
- private String driver;
- private String url;
- private String username;
- private String password;
- @Override
- public Connection getObject() throws Exception {
- Class.forName(driver);
- Connection conn =
- DriverManager.getConnection(url,username,password);
- return conn;
- }
- @Override
- public boolean isSingleton() {
- return false;
- }
- @Override
- public Class<Connection> getObjectType() {
- return Connection.class;
- }
- set/get
- ....
- }
xml文件:
<!--
下面配置的這個類,可以自動的幫我們去讀取指定的properties文件的內容,文件中用key-value的形式存放數據,讀完之后我們就可以用${key}這種形式去拿文件中的value值了
在htmlsingle中直接搜索類名即可得到相關配置樣例
classpath指的是從src下面找.
-->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="location">
- <value>classpath:oracle.properties</value>
- </property>
- </bean>
- <context:property-placeholder location="classpath:beanProperty.properties"/><span style="font-size:16px;text-align:justify;font-family:'Microsoft YaHei', SimHei, Arial;background-color:rgb(255,255,255);"> </span>
<!--
因為這個類是一個工廠類,所以我們用名字conn在容器中拿對象的時候,
拿到並不是這個工廠類對象,而是這個工廠類對象調用完工廠方法后所返回的對象.
-->
- <bean name="conn" class="com.briup.ioc.factory.ConnectionFactory">
- <property name="driver">
- <value>${driver}</value>
- </property>
- <property name="url">
- <value>${url}</value>
- </property>
- <property name="username">
- <value>${username}</value>
- </property>
- <property name="password">
- <value>${password}</value>
- </property>
- </bean>
上面的代碼是配置bean的工廠類,然后得到bean
- main:
- String path = "com/briup/ioc/factory/factory.xml";
- ApplicationContext container =
- new ClassPathXmlApplicationContext(path);
- Connection conn =
- (Connection)container.getBean("conn");
- System.out.println(conn);
//一個普通的工廠類
- public class CatFactoryBean {
- public Cat getCat(int id,String name){
- return new Cat(id, name);
- }
- }
- <bean id="catFactory" class="com.hoperun.spring.CatFactoryBean"></bean>
- <bean id="cat" class="com.hoperun.spring.Cat" factory-bean="catFactory" factory-method="getCat">
- <constructor-arg value="22"></constructor-arg>
- <constructor-arg value="fengwei"></constructor-arg>
- </bean>
(4)通過靜態工廠獲得實例
靜態工廠:就是得到工廠的方法是靜態的
- public static Cat getCat1(int id,String name){
- return new Cat(id, name);
- }
- <bean id="cat" class="com.hoperun.spring.CatFactoryBean" factory-method="getCat1">
- <constructor-arg value="2222"></constructor-arg>
- <constructor-arg value="fengwei"></constructor-arg>
- </bean>
2,處理多個配置文件
我們發現spring的配置文件每次都是指定加載的applicationContext.xml,如果把所有的bean配置都加入一個文件中,太大了,所以spring的配置文件是可以有多個的,多個文件可以一起加載。方法一:ClassPathXmlApplicationContext(),它有幾個重載的構造器,參數不一樣,可以是一個String[]數組,這樣就明白了,可以將所有的名字都放在數組里,讓它加載。
方法二:如果我們在spring框架中配置了多個xml文件,我們可以在讀取配置文件的時候把這些xml文件一下全都讀取,也可以只讀一個總的xml文件,在這個總的xml文件中把其他的xml全都都導入進來。
例如:
- student.xml文件:
- <bean name="student" class="com.briup.bean.Student">
- <property name="id">
- <value>25</value>
- </property>
- </bean>
- teacher.xml文件:
- <bean name="teacher" class="com.briup.bean.Teacher">
- <property name="student" ref="student"></property>
- </bean>
- import.xml文件:
- <import resource="teacher.xml"/>
- <import resource="student.xml"/>
- main:
- String[] path = {"com/briup/ioc/imp/import.xml"};
- ApplicationContext container =
- new ClassPathXmlApplicationContext(path);
- Teacher t = (Teacher) container.getBean("teacher");
- System.out.println(t.getStudent());