正如上一节[1.4.1依赖注入](1.4.1依赖注入.md)提到的,你可以通过`<property/>`和`<constructor-arg/>`元素注入成员属性和构造参数或者直接使用简单值完成依赖的配置。
[1.4.1.依赖注入](1.4.1.依赖注入.md)
### **简单值(基本类型、字符串等等)**
`<property/>`元素的`value`属性可以为成员属性或者构造参数指定一个可读性高的字符串值,并且Spring的类型转换服务([3.5.4.ConversionService API](3.5.4.ConversionServiceAPI.md))可以将String类型的数据转换为属性或者参数实际需要的类型。
~~~
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 通过调用 setDriverClassName(String) 来设置属性 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>
~~~
下面的样例使用了`p-namespace`来简化XML配置。
~~~
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/mydb"
p:username="root"
p:password="masterkaoli"/>
</beans>
~~~
上面的例子显得更加简洁,但是单词拼写错误在运行时才发现而不是编写代码时,除非使用[IntelliJ IDEA](http://www.jetbrains.com/idea/) 或者[Spring Tool Suite](https://spring.io/tools/sts) (STS)等支持属性自动完成的IDE,并且使用这样的IDE是一种很棒的体验。
你也可以像这样配置`java.util.Properties`实例:
~~~
<bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties">
<value>
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
</value>
</property>
</bean>
~~~
Spring容器通过`PropertyEditor`将`<value/>`元素内的文本转换为`java.util.Properties`实例。这种方式简单快捷,所以Spring团队更喜欢`<value/>`元素而不是`value`属性。
##### `<idref/>`元素
此元素是一种通过其他Bean的id值来引用Bean的方式,可以使用在`<constructor-arg/>`或者`<property/>`元素中,并且拥有错误校验的功能。
~~~
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean"/>
</property>
</bean>
~~~
上面的配置与下面的配置完全等价(运行时):
~~~
<bean id="theTargetBean" class="..." />
<bean id="client" class="...">
<property name="targetName" value="theTargetBean"/>
</bean>
~~~
第一种形式的配置要优于第二种,因为`<idref/>`元素使得容器会在部署时就验证引用的Bean是否真实存在。在第二例子中,`targetName`的值不会被验证,拼写错误只能在`client` Bean被实例化时才出现(很有可能出现严重错误)。如果`client` Bean是原型模式的,拼写错误和异常结果可能会在容器发布很久之后才被发现。
- ---- 阅读说明
- 一、核心技术
- 1.IOC容器
- 1.1.IOC 容器和 Bean 简介
- 1.2.容器概览
- 1.2.1.配置元数据
- 1.2.2.实例化容器
- 1.2.3.使用容器
- 1.3.Bean概览
- 1.3.1.Bean的命名
- 1.3.2.实例化Bean
- 1.4.依赖
- 1.4.1.依赖注入
- 1.4.2.依赖配置详情
- 1.4.5.注入合作者
- 1.4.4.Bean的懒加载
- 1.5.Bean的范围
- 1.6.自定义Bean的特性
- 1.6.1.生命周期回调函数
- 1.7.继承Bean定义
- 1.9.基于注解的容器配置
- 1.9.1.@Required
- 1.12.基于Java的容器配置
- 1.12.3.使用@Bean注解
- 1.15.ApplicationContext的附加功能
- 1.15.4.Web 应用中便捷的 ApplicationContext 实例
- 1.16.BeanFactory
- 2.资源
- 2.7.应用上下文和资源路径
- 3.验证、数据绑定以及类型转换
- 3.5.Spring类型转换
- 3.5.4.ConversionService API
- 5.基于 Spring 的面向切面编程
- 5.8.在 Spring 中使用 AspectJ
- 5.8.1.在 Spring 中使用 AspectJ 注入领域对象
- 二、测试
- 三、数据访问
- 四、Web应用
- 五、Web响应式编程
- 六、集成
- 4.1.介绍
- 七、编程语言