Spring IOC 應用進階
Spring IOC 應用進階
1.1.Bean對象屬性值的註入
在Spring中對Bean屬性賦值的過程我們稱之為依賴註入.Spring應用中為Bean的屬性註入值的方式有兩種,set註入和構造註入,set註入式通過對象的set方法為對象屬性賦值,構造註入為通過bean對象的構造方法為屬性註入值.
1.1.1.直接量值的註入
Spring 直接量值的註入指的是通過Spring IOC為對象的8種封裝類以及String類型的屬性註入值。
例如
定義OpenDataSouce類
public class OpenDataSource { private String driverClassName; private String url; private String username; private String password; private String maxIdle; private String maxActive; public OpenDataSource() {} public OpenDataSource(int maxIdle,int maxActive){ this.maxIdle=maxIdle; this.maxActive=maxActive; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUser(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
配置OpenDataSource類並通過set方法為對象屬性賦值.例如如下配置會先調用bean對象的無參構造函數構建對象,然後通過set方法為屬性賦值。
<beanid=‘dataSource‘ class=‘com.jt.common.utils.OpenDataSource‘> <property name=‘driverClassName‘ value=‘com.jdbc.mysql.Driver‘ /> <property name=‘url‘ value=‘jdbc:mysql:///test‘ /> <property name=‘username‘ value=‘root‘ /> <property name=‘password‘ value=‘root‘ /> </bean>
當然假如對象提供了對應的構造方法也可以通過指定構造方法為屬性註入值,例如在如下配置中可以調用OpenDataSource對象的有兩個參數的構造函數構建對象
<beanid=‘openDataSource‘ class=‘ com.jt.common.utils.OpenDataSource‘> <!-- 默認按照構造方法參數順序註入值 說明:配置時有幾個constructor-arg就是 要調用帶及格參數的構造函數 --> <constructor-argvalue=‘10‘ /> <constructor-argvalue=‘100‘ /> </bean>
實際項目中也可以構造註入和set註入混合使用。
<bean id=‘dataSource‘ class=‘com.jt.common.utils.OpenDataSource‘>
<constructor-argvalue=‘100‘ />
<propertyname=‘driverClassName‘ value=‘com.jdbc.mysql.Driver‘ />
<propertyname=‘url‘ value=‘jdbc:mysql:///test‘ />
<propertyname=‘username‘ value=‘root‘ />
<propertyname=‘password‘ value=‘root‘ />
</bean>
說明:依賴註入時可以將配置信息提取到properties文件中,然後通過spring表達式#{id.key}的方式提取數據。
在類路徑下定義一個configs.properties文件,內容如下
jdbcDriver= com.mysql.jdbc.Driver
jdbcUrl= jdbc:mysql:///test
jdbcUser= root
jdbcPassword=123456
在spring的配置文件中configs.properties文件
<util:propertiesid=‘cfg‘ location=‘classpath:configs.properties‘ />
在bean中為屬性註入值時使用spring 表達式
<beanid=‘dataSource‘ class=‘beans.OpenDataSource‘>
<propertyname=‘driverClassName‘ value=‘#{cfg.jdbcDriver}‘ />
<propertyname=‘url‘ value=‘#{cfg.jdbcUrl}‘ />
<propertyname=‘username‘ value=‘#{cfg.jdbcUser}‘ />
<propertyname=‘password‘ value=‘#{cfg.jdbcPassword}‘ />
</bean>
其中#為spring表達式特殊標記,{}為表達式內容,cfg為util:properties 標簽中定義的id. jdbcUser、jdbcPassword為配置文件等號左邊的key
課堂練習:整合C3P0連接池,DRUID連接池(阿裏巴巴)
1.1.2.集合對象值的註入:
Spring IOC 如何為集合類型的對象屬性註入值,例如
public class Container {
private List<String> list;
private Map<String,Object> map;
private Properties properties;
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
Spring 配置文件中為對象屬性註入值。
<bean id=‘collection‘ class=‘beans.Container‘>
<propertyname=‘list‘>
<list>
<value>A</value>
<value>B</value>
</list>
</property>
<propertyname=‘map‘>
<map>
<entrykey=‘k1‘ value=‘100‘ />
<entrykey=‘k2‘ value=‘300‘ />
</map>
</property>
<propertyname=‘properties‘>
<props>
<propkey=‘username‘>root</prop>
<propkey=‘password‘>123456</prop>
</props>
</property>
</bean>
#### 1.1.3.依賴對象值的註入
實際項目會存在很多個Bean對象,這些對象之間會存在一定依賴關系,當某個Bean對象依賴於其它Bean對象,可以通過spring按照一定的規則(例如按類型或者按名字),進行依賴查找然後進行值的註入.例如:現有一生產者對象(Producer),此對象關聯一容器(Container)對象,然後可以通過容器對象存儲相關數據。
其代碼設計如下:
類的設計
package com.jt.common.utils;
//生產者對象(負責向容器放數據)
public class Producer {//IOC(工廠,容器)
//生產者關聯一個容器對象(目的是要向此容器放數據)
private Container container;
public void setContainer(Container container) {
this.container = container;
}
public Container getContainer() {
return container;
}
}
類的基本配置
<beanid=‘producer‘ class=‘com.jt.common.utils.Producer‘>
<!-- 借助ref屬性從容器中獲取一個id為container
的對象然後賦值給Producer的container屬性 -->
<propertyname=‘Container‘ ref=‘container‘ />
</bean>
單元測試
public class TestProducer01 extends TestBase{
@Test
public void testProducer(){
//1.獲取生產者對象
Producer pro=ctx.getBean(‘producer‘,Producer. **class );
Assert._assertNotEquals_( **null** , pro);
//2.獲取生產者關聯的容器對象
Container container=pro.getContainer();
Assert._assertNotEquals_( **null** , container);
//3.向容器放數據
container.getMap().put(‘mysql‘, 100);
container.getList().add(‘皮皮霞‘);
}
}
Spring IOC 應用進階