spring学习(三)DI 依赖注入
使用IOC容器来解决对象之间的依赖关系:对象之间的依赖关系,其实就是给对象上的属性赋值!因为对象上有其他对象的变量,因此存在了依赖
Spring提供了好几种的方式来给属性赋值
-
1) 通过构造函数
-
2) 通过set方法给属性注入值
-
3) p名称空间
-
4)自动装配(了解)
-
5) 注解(重要)
在xml中使用构造函数赋值
<bean id="userDao" class="bean.UserDao"/>
<bean id="userService" class="bean.UserService">
<constructor-arg name="userDao" type="bean.UserDao" ref="userDao"/>
</bean>
在xml中通过set方法赋值
applicationContext.xml配置文件:通过property节点来给属性赋值
-
引用类型使用ref属性
-
基本类型使用value属性
<bean id="userDao" class="bean.UserDao"/>
<bean id="userService" class="bean.UserService">
<property name="userDao" ref="userDao"/>
</bean>
内部bean赋值
先创建userService,发现userService需要userDao的属性,再创建userDao
applicationContext.xml配置文件:property节点内置bean节点(不能复用)
<bean id="userService" class="bean.UserService">
<property name="userDao">
<bean id="userDao" class="bean.UserDao"/>
</property>
</bean>
p名称空间注入属性值
p名称控件这种方式其实就是set方法的一种优化,优化了配置而已
在<beans>元素中加入声明xmlns:p="http://www.springframework.org/schema/p"
applicationContext.xml配置文件:使用p名称空间
<bean id="userService" class="bean.UserService" p:userDao-ref="userDao"/>
自动装配
Spring还提供了自动装配的功能,能够非常简化我们的配置
自动装载默认是不打开的,自动装配常用的可分为两种:
-
根据名字装配
-
根据类型装配
XML配置根据名字装配
applicationContext.xml配置文件:使用自动装配,根据名字
<bean id="userDao" class="bean.UserDao"/>
<!--
1.通过名字来自动装配
2.发现userService中有个叫userDao的属性
3.看看IOC容器中没有叫userDao的对象
4.如果有,就装配进去
-->
<bean id="userService" class="bean.UserService" autowire="byName"/>
XML配置根据类型装配
applicationContext.xml配置文件:使用自动装配,根据类型
值得注意的是:如果使用了根据类型来自动装配,那么在IOC容器中只能有一个这样的类型,否则就会报错!
<bean id="userDao" class="UserDao"/>
<!--
1.通过类型来自动装配
2.发现userService中有个UserDao类型的属性
3.看看IOC容器中UserDao类型的对象
4.如果有,就装配进去
-->
<bean id="userService" class="UserService" autowire="byType"/>
设置全局自动装配
在<beans>声明的最后添加 default-autowire="byName"
使用注解自动装配
@Autowired注解来实现自动装配:
-
可以在 成员变量(不用写setter方法)、构造器、setter方法 上修饰
-
如果没有匹配到bean(或允许为null),又为了避免异常的出现,我们可以设置required属性为false
@Autowired(required=false)
-
J2EE的@Resource和@AutoWired有相同的功能,区别如下:
-
@Resource默认按byName装配,可以设置属性来选择使用name 或者 type 装配
-
@AutoWired默认按byType装配,如果想使用name装配,结合@Qualifier注解使用
-