基本数据类型、字符串注入
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<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="misterkaoli"/>
</bean>
使用p命名空间设置
<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
https://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="misterkaoli"/>
</beans>
配置java.util.Properties实例
<bean id="mappings"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<!-- typed as a java.util.Properties -->
<property name="properties">
<value>
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
</value>
</property>
</bean>
内部bean配置
<bean id="outer" class="...">
<!-- instead of using a reference to a target bean, simply define the target bean inline -->
<property name="target">
<bean class="com.example.Person"> <!-- this is the inner bean -->
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
集合配置
<bean id="moreComplexObject" class="example.ComplexObject">
<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">administrator@example.org</prop>
<prop key="support">support@example.org</prop>
<prop key="development">development@example.org</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key ="a ref" value-ref="myDataSource"/>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
</bean>
映射键或值或集合值的值也可以是以下任何元素:
bean | ref | idref | list | set | map | props | value | null
Null 和空字符串值
<bean class="ExampleBean">
<property name="email" value=""/>
<property name="phone"></null></property>
</bean>
延迟初始化
默认情况下,Spring 容器会在初始化过程中预实例化单例的bean。但某些时候我们不希望它在容器初始化的时候实例化,这时我们可以使用延迟初始化。
<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>
但是,当延迟初始化 bean 是未延迟初始化的单例 bean 的依赖项时,它ApplicationContext会在启动时创建延迟初始化 bean,因为它必须满足单例的依赖项。延迟初始化的 bean 被注入到其他地方没有延迟初始化的单例 bean 中。
您还可以通过使用元素default-lazy-init上的属性来控制容器级别的延迟初始化 ,如以下示例所示:
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
Bean 作用域
<bean/>标签的scope属性,定义了该bean的作用域。一个bean有如下几种作用域
名称 | value |
---|---|
singleton | (默认)单例,只在第一次实例化bean,之后获取都是该bean的同一个实例化对象 |
prototype | 每次获取bean都会新实例化bean |
request | 将单个 bean 定义范围限定为单个 HTTP 请求的生命周期。 |
session | 将单个 bean 定义范围限定为 HTTP 的生命周期Session |
application | 将单个 bean 定义范围限定为ApplicationContext。spring容器范围内 |
websocket | 将单个 bean 定义范围限定为WebSocket |
其中最常见的是singleton和prototype
单例作用域
Spring IoC 容器会创建该 bean 定义定义的对象的一个实例。该单个实例存储在此类单例 bean 的缓存中,并且对该命名 bean 的所有后续请求和引用都返回缓存对象。
原型作用域
在xml中配置原型作用域
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
单例作用域的bean依赖原型作用域的bean
假设你希望单例范围的 bean 在运行时重复获取原型范围的 bean 的新实例。则不能将原型范围的 bean 依赖注入到单例 bean 中,因为该注入仅发生一次,当 Spring 容器实例化单例 bean 并解析并注入其依赖项时。如果在运行时多次需要原型 bean 的新实例,请使用方法注入。