上文提到了 Spring 的 IoC 特性和 AOP 特性,只提到个别的实现方法。本文将对 IoC 和 AOP 其他方法进行讲解。

多种方式实现依赖注入

1.设值注入

上文中使用的注入方法:通过 setter 访问器实现对属性的赋值。

2.构造注入

通过类的构造方法实现属性的注入。

如何通过构造注入为业务类注入所依赖的数据访问层对象?下面是步骤

1)获取Spring开发包并为工程添加Spring支持。

2)为业务层和数据访问层设计接口,声明所需方法。

3)编写数据访问层接口UserDao的实现类,完成具体的持久化操作。

4)在业务实现类中声明UserDao接口类型的属性,并添加适当的构造方法为属性赋值。

图片描述

5)在Spring的配置文件中将DAO对象以构造注入的方式赋值给业务实例中的 UserDao 类型的属性。

图片描述

6)在代码中获取Spring配置文件中装配好的业务类对象,实现程序功能。
一个 <constructor-arg> 元素表示构造方法的一个参数,且使用时不区分顺序。当构造方法的参数出现混淆,无法区分时,可以通过 <constructor-arg> 元素的 index 属性指定该参数的位置索引,位置从0开始。

3.使用 p 命名空间实现属性注入

p 命名空间的特点是使用属性而不是子元素的形式配置 Bean 的属性,从而简化了 Bean 的配置。注意使用前要先添加 p 命名空间的声明。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<strong> xmlns:p="http://www.springframework.org/schema/p"</strong>
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd">

图片描述
对于直接量(基本数据类型、字符串)属性  语法:p:属性名="属性值"对于引用 Bean 的属性  语法:p:属性名-ref="Bean的id"

注入不同的数据类型

1.注入直接量(基本数据类型、字符串)

对于基本数据类型及其包装类、字符串,除了可以使用value属性,还可以通过 <value> 子元素进行注入。

图片描述

2.引用其他 Bean 组件

Spring 中定义的 Bean 可以互相引用,从而建立依赖关系,除了使用 ref 属性,还可以通过 <ref> 子元素实现。

图片描述

3.使用内部 Bean

如果一个Bean组件仅在一处需要使用,可以把它定义为内部Bean。

图片描述

4.注入集合类型的属性

对于 List 或数组类型的属性,可以使用 <list> 标签注入。

<property name="hobbies">
    <list>
        <value>足球</value>
        <value>篮球</value>
    </list>
</property>

对于 Set 类型的属性,可以使用 <set> 标签注入。

<property name="hobbies">
    <set>
        <value>足球</value>
        <value>篮球</value>
    </set>
</property>

对于 Map 类型的属性,可以使用 <map> 标签注入。

<property name="hobbies">
    <map>
        <entry>
             <key><value>football</value></key>
             <value>足球</value>
         <entry>
         <entry>
             <key><value>basketball</value></key>
             <value>篮球</value>
         <entry>
    </map>
</property>

对于 Properties 类型的属性,可以使用 <props> 标签注入。

<property name="hobbies">
    <props>
        <prop key="football">足球</prop>
        <prop key="basketball">篮球</prop>
    </props>
</property>

5.注入 null 和空字符串值

<!-- 注入空字符串值 -->
     <bean id="user" class="pojo.User">
         <property name="email"><strong><</strong><strong>value></value</strong><strong>></strong></property>
     </bean>
     <!-- 注入 null 值 -->
     <bean id="user" class="pojo.User">
         <property name="email"><strong><</strong><strong>null</strong><strong>/></strong></property>
     </bean>

其他增强类型

1.异常抛出增强

异常抛出增强的特点是在目标方法抛出异常时织入增强代码。使用异常抛出增强,可以为各功能模块提供统一的、可拔插的异常处理方案。

在增强类中添加异常抛出增强代码

图片描述

在配置文件中添加异常抛出增强相关配置

图片描述

2.最终增强

最终增强的特点是无论方法抛出异常还是正常退出,该增强都会得到执行,类似于异常处理机制中的 finally 块的作用,一般用于释放资源。

在增强类中添加最终增强代码

图片描述

在配置文件中添加最终增强相关配置

图片描述

3.环绕增强

环绕增强在目标方法的前后都可以织入增强处理。环绕增强是功能最强大的增强处理,Spring 把目标方法的控制权全部交给了它。在环绕增强处理中,可以获取或修改目标方法的参数、返回值,可以对它进行异常处理,甚至可以决定目标方法是否被执行。

在增强类中添加环绕增强代码

图片描述

在配置文件中添加环绕增强相关配置

图片描述

下次更新Spring注解相关配置