配置依赖关系深入
无论是setter注入,还是constructor注入,都需要传入参数。
根据不同的参数类型,配置方式也要随之改变。
a. 标量类型(基本类型及其包装类、String、Date):用value子元素或value属性配置即可。
b.复合类型:
1。 用ref引用容器中已有的Bean。
2。 用嵌套Bean。
嵌套Bean:将<bean.../>元素定义成<property...>或<constructor-arg...>的子元素,
该<bean.../>元素配置得到Bean将只作为setter方法、构造器的参数注入。
不能被容器直接访问。
因此嵌套Bean一般不需要指定id属性值。
普通Bean和嵌套Bean的两点差别:
- 定义的位置不同。嵌套Bean定义成<property...>或<constructor-arg...>的子元素。
- 作用不同。嵌套Bean只是作为setter方法或构造器的参数注入
嵌套Bean提供了更好的封装,嵌套Bean丧失了灵活性。
c.自动装配(重点)
autowire属性可以接受如下值:
- no:不使用自动装配。Bean依赖必须通过ref元素定义。这是默认的配置。
- byName:根据setter方法名来自动装配。Spring查找容器中全部Bean,找出其中id与setter方法名
去掉set前缀后同名的Bean来完成注入。如果没有找到匹配的Bean实例,
则Spring不会进行任何注入,也不报错。
- byType:根据setter方法形参类型来自动装配。Spring查找容器中全部Bean,如果正好有一个Bean类型
与setter形参类型匹配,就自动注入这个Bean;
如果没有找到匹配的Bean实例,则Spring不会进行任何注入,也不报错。
如果有多个这样的Bean,就抛出一个异常;
- constructor:与byType类似,区别是用于构造注入的参数。
如果容器中不是恰好有一个Bean与构造器参数类型相同的,则会抛出一个异常。
- autodetect:BeanFactory根据Bean内部结构,决定使用constructor或byType。
如果找到一个默认的构造函数,那么就会应用byType。
autowire-candidate="false",对byName无效,该Bean不作为自动装配的候选人。
无论是setter注入,还是constructor注入,都需要传入参数。
根据不同的参数类型,配置方式也要随之改变。
a. 标量类型(基本类型及其包装类、String、Date):用value子元素或value属性配置即可。
b.复合类型:
1。 用ref引用容器中已有的Bean。
2。 用嵌套Bean。
嵌套Bean:将<bean.../>元素定义成<property...>或<constructor-arg...>的子元素,
该<bean.../>元素配置得到Bean将只作为setter方法、构造器的参数注入。
不能被容器直接访问。
因此嵌套Bean一般不需要指定id属性值。
普通Bean和嵌套Bean的两点差别:
- 定义的位置不同。嵌套Bean定义成<property...>或<constructor-arg...>的子元素。
- 作用不同。嵌套Bean只是作为setter方法或构造器的参数注入
嵌套Bean提供了更好的封装,嵌套Bean丧失了灵活性。
c.自动装配(重点)
autowire属性可以接受如下值:
- no:不使用自动装配。Bean依赖必须通过ref元素定义。这是默认的配置。
- byName:根据setter方法名来自动装配。Spring查找容器中全部Bean,找出其中id与setter方法名
去掉set前缀后同名的Bean来完成注入。如果没有找到匹配的Bean实例,
则Spring不会进行任何注入,也不报错。
- byType:根据setter方法形参类型来自动装配。Spring查找容器中全部Bean,如果正好有一个Bean类型
与setter形参类型匹配,就自动注入这个Bean;
如果没有找到匹配的Bean实例,则Spring不会进行任何注入,也不报错。
如果有多个这样的Bean,就抛出一个异常;
- constructor:与byType类似,区别是用于构造注入的参数。
如果容器中不是恰好有一个Bean与构造器参数类型相同的,则会抛出一个异常。
- autodetect:BeanFactory根据Bean内部结构,决定使用constructor或byType。
如果找到一个默认的构造函数,那么就会应用byType。
autowire-candidate="false",对byName无效,该Bean不作为自动装配的候选人。