依赖注入
- 依赖注入Dependency Injection
- 依赖
- bean对象的创建依赖于容器
- bean对象依赖于资源
- 注入
- bean对象依赖的资源由容器设置和装配
- 依赖
Spring依赖注入方式
- 构造器注入
官网API示例
java代码
package x.y; public class Foo { public Foo(Bar bar, Baz baz) { // ... } }
配置文件
<beans> <bean id="foo" class="x.y.Foo"> <constructor-arg ref="bar"/> <constructor-arg ref="baz"/> </bean> <bean id="bar" class="x.y.Bar"/> <bean id="baz" class="x.y.Baz"/> </beans>
set注入
- 被注入的属性一定要有set方法,且方法名为set + 属性名(首字母大写)
- 如果属性是Boolean类型,没有get方法,只有is + 属性名
常量注入
<bean id="student" class="com.eric.vo.Student"> <property name="name" value="char"></property> </bean>
bean注入
<bean id="addr" class="com.eric.vo.Address"/> <bean id="student" class="com.eric.vo.Student"> <property name="name" value="char"></property> <property name="address" ref="addr"></property> </bean>
- 对象包含另一个对象
- 首先创建对应的bean对象,再通过
<property>
中的ref
引用该对象
数组注入
<bean id="student" class="com.eric.vo.Student"> <property name="name" value="char"></property> <property name="address" ref="addr"></property> <property name="books"> <array> <value>java</value> <value>servlet/jsp</value> <value>ssh</value> </array> </property> </bean>
- 通过
<array>
以及<value>
标签来传入数组数据
- 通过
List注入
<property name="hobbies"> <list> <value>coding</value> <value>game</value> <value>movie</value> </list> </property>
- 通过
<list>
以及<value>
标签来传入数组数据
- 通过
Map注入
<property name="cards"> <map> <entry key="vip" value="19980321"></entry> <entry> <key><value>china bank</value></key> <value>32151305153324523</value> </entry> </map> </property>
Set注入
<property name="games"> <set> <value>lol</value> <value>qqt</value> <value>dnf</value> </set> </property>
null注入
<property name="wife"><null/></property>
Properties注入
<property name="info"> <props> <prop key="id">01</prop> <prop key="sex">male</prop> <prop key="birthday">03.21</prop> </props> </property>
p-namesapce注入
<bean id="user" class="com.eric.vo.User" p:name="char" p:pwd="1234"/>
- 需要引用
xmlns:p="http://www.springframework.org/schema/p"
- 在bean中使用
p:attr
来赋值 - 需要属性的set方法
- 需要引用
c:namespace注入
<bean id="user1" class="com.eric.vo.User" c:name="eric" c:pwd="1111"/>
- 需要引用
xmlns:c="http://www.springframework.org/schema/c"
- 需要有对应的构造方法
- 需要引用
bean自动装配
设置
<bean>
中的autowire
属性autowire="byName"
: 根据属性获取方法名称setFoo(Foo f)
查找相应的<bean id="foo" class="x.y"/>
<bean id="userDao" class="com.eric.impl.UserDaoOracleImpl"/> <bean id="service" class="com.eric.service.impl.UserServiceImpl" autowire="byName"/>
autowire="byType"
: 根据类型进行自动装配setFoo(Foo f)
即查找<bean class="x.y.Foo"/>
,后者的类可以为前者类的子类<bean class="com.eric.impl.UserDaoOracleImpl"/> <bean id="service" class="com.eric.service.impl.UserServiceImpl" autowire="byType"/>
autowire="no"
: 不使用自动装配autowire="constructor"
: 当通过构造器的方法实例化bean时,按照byType
的方式自动装配