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"

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="..."
      xsi:schemaLocation="..."
      default-autowire="byName">

使用注解自动装配

@Autowired注解来实现自动装配:

  • 可以在 成员变量(不用写setter方法)、构造器、setter方法 上修饰

  • 如果没有匹配到bean(或允许为null),又为了避免异常的出现,我们可以设置required属性为false @Autowired(required=false)

  • J2EE的@Resource和@AutoWired有相同的功能,区别如下:

    • @Resource默认按byName装配,可以设置属性来选择使用name 或者 type 装配

    • @AutoWired默认按byType装配,如果想使用name装配,结合@Qualifier注解使用

    @Autowired 
    @Qualifier ( "baseDao" )

 

上一篇:ApplicationContext 容器


下一篇:AtomicStampedReference解决CAS机制中ABA问题