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(‘皮皮霞‘);
}
}
原文地址:https://www.cnblogs.com/wood-life/p/10292711.html