name指定类属性,value为类属性的值,注意到value的值是字符串,spring通过conversion service API完成类型转换
也可以使用p-namespace,需要在xml中添加xmlns:p="http://www.springframework.org/schema/p":
如果需要引用其他类,可以加上ref后缀,例如:p:password—ref
java.util.Properties配置方式如下:
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
通过javaBeans的PropertyEditor机制将value的值转换为java.util.Properties实例
idref允许在容器创建时就就验证依赖bean是否存在,不必等到创建bean的时候在验证
使用
当依赖是其他bean时,可以使用ref标签引用,ref有bean、parent两种
class="org.springframework.aop.framework.ProxyFactoryBean">
在
inner bean不要求id和name,这也意味着inner bean只能注入outer bean(本例中为id为outer的bean),inner bean会忽略scope标志的设置(scope和outer bean是一致的)
使用、
[email protected]
[email protected]
[email protected]
just some string
对于map的key和value、set的value来说,可以指定的值如下:
bean、ref、idref、list、set、map、props、value、null
一个集合可以指定自己的父集合是谁,子集合可以覆盖父集合的值,拿property来说,如下:
[email protected]
[email protected]
[email protected]
[email protected]
注意id为child的bean,用parent指定了父集合的id,将merge属性置为true,同时覆盖了父集合中的support属性的值,最终child的属性如下:
[email protected]
[email protected]
[email protected]
、、
来说,父链的值先于子链,set、map、properties不存在这种现象(因为内部使用的数据结构不是链表,所以可能会重新排列)
不同类型的集合不能合并(例如Map和List),merge属性只对子集合有效
集合支持泛型编程,我们可以指定集合的关键字、键值的类型,此时spring的类型转换器会将配置中bean的属性值转换为对应的类型
,例如:
public class Foo {
private Map accounts;
public void setAccounts(Map accounts) {
this.accounts = accounts;
}
}
spring会将one、two、six转换为string类型,9.99、2.75、3.99转换为float类型,当实例化foo时,spring会反射生成map
在spring中间属性值设置为null的方法:
c-namespace等效于
如果遇到构造函数参数名字不可用的情况(极少数情况,字节码没有debug信息),可以使用构造函数参数的index指定:
由于xml语法的要求,索引表示法要用“_”作为前导
在设置bean属性时,可以使用复合属性或嵌套属性名,只要路径的所有组件(最终属性名除外)都不是空的。
如上所示,fred和bob均不能为空,否则会抛出NullPointerException异常,这种方式优先于setter方法注入,顺序为——初始化bean实例(调用默认构造函数或是有参构造函数),接着设置复合属性名的值,最后运行setter方法,如果我们使用setter方法注入,将会抛出NullPointerException异常(由于复合属性先于setter方法执行,此时setter方法set的属性的值为空)
当bean初始化到一半,发现某个依赖还未初始化,就会去初始化依赖,使用depends-on,可以控制bean的依赖先于bean初始化
对于上面的例子,spring可以保证当beanOne初始化时,manager、accountDao已经完成初始化,depends-on也可以控制bean销毁的顺序,以上面的例子为例,beanOne会先被销毁,接着manager、accountDao被销毁
一般情况下,容器初始化时会先初始化单例bean,我们可以指定lazy-initialized属性来延迟初始化单例bean,在第一次请求(例如作为某个bean的依赖)的时候才初始化该单例bean,如下:
上述例子中,由于lazy bean的lazy-init值为true,所以lazy bean将会延迟初始化
我们也可以将需要延迟初始化的bean一次性配置好: