6.1增强类型扩展
在Spring框架中,增强(Advice)和类型扩展(Type Extensions)是AOP(面向切面编程)概念的一部分,用于在不修改源代码的情况下,为应用添加额外的行为。虽然Spring本身并不直接提供一个名为“类型扩展”的明确术语,但我们可以将其理解为通过AOP来扩展或修改类的行为,这通常通过动态代理或字节码操作实现。
1. AOP与增强
AOP允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,并在运行时将它们动态地织入到应用程序中。增强(Advice)是AOP中的一个核心概念,它代表了要注入到目标对象连接点(如方法调用)的额外行为。
增强类型包括:
前置增强(Before Advice):在目标方法执行之前执行。
最终增强(After Advice):在目标方法执行之后执行,无论方法执行是否成功。
语法:
<aop:config>
<aop:aspect ref="增强方法所在的Bean">
<aop:after method="增强处理方法" pointcut-ref="切入点id"/>
</aop:aspect>
</aop:config>
抛出异常后增强(After Throwing Advice):在目标方法抛出异常后执行。
语法:
<aop:config>
<aop:aspect ref="增强方法所在的Bean">
<aop:after-throwing method="增强处理方法"
pointcut-ref="切入点id" throwing="e"/>
</aop:aspect>
</aop:config>
环绕增强(Around Advice):在目标方法执行前后执行,并且可以决定是否继续执行目标方法或中断执行流程。
语法:
<aop:config>
<aop:aspect ref="增强方法所在的Bean">
<aop:around method="增强处理方法" pointcut-ref="切入点id" />
</aop:aspect>
</aop:config>
2. Spring AOP的实现方式
Spring AOP主要通过两种方式来实现:
基于代理的AOP:这是Spring AOP的默认方式,它依赖于JDK动态代理(针对接口)或CGLIB(针对类)来创建目标对象的代理。当代理对象的方法被调用时,Spring AOP框架会拦截这个调用,并根据配置执行相应的增强逻辑。
基于AspectJ的AOP:AspectJ是一个完整的AOP框架,它提供了编译时和加载时的AOP支持。Spring提供了与AspectJ的集成,允许开发者使用AspectJ的注解或XML配置来定义切面。这种方式可以支持更复杂的AOP需求,包括更细粒度的控制和更强大的织入能力
6.2 依赖注入方式扩展
依赖注入(Dependency Injection,简称DI)是Spring框架中的一个核心概念,它允许对象在创建时不依赖于其他具体类的实例,而是依赖于抽象的接口或类。这样可以在运行时动态地将依赖关系注入到对象中,从而实现了对象之间的解耦。依赖注入的方式主要有以下几种:
1. 构造器注入(Constructor Injection)
构造器注入是通过类的构造器来注入依赖项。在Spring配置文件中,可以通过<constructor-arg>标签来指定注入的依赖项。
语法:
<bean id="唯一标识" class="类的全路径">
<constructor-arg name="参数名称" ref="依赖对象" />
</bean>
2.p命名空间注入
在Spring框架中,p命名空间注入是一种XML配置方式,它允许你直接在<bean>标签的属性中注入依赖项,而不需要使用<property>或<constructor-arg>子标签。这种方式使得XML配置更加简洁,但请注意,随着Spring注解的广泛使用,p命名空间注入在现代Spring应用中可能不如注解注入那样常见
语法:
<bean id="唯一标识" class="类的全路径"
p:"属性1"="注入的值"p:"属性2"="注入的值" />
<bean id="唯一标识" class="类的全路径"
p:属性-ref="注入的Bean" />
3. 不同数据类型的注入
在Spring框架中,不同数据类型的注入是通过Spring的配置文件(如XML配置文件)或注解来实现的。这些数据类型包括基本数据类型(如int、String等)、集合类型(如List、Set、Map等)以及自定义对象类型等。以下是对不同数据类型注入的详细说明:
1. 基本数据类型和字符串的注入
对于基本数据类型(如int、float等)和字符串(String),可以直接使用<value>标签在Spring的XML配置文件中进行注入。例如:
<bean id="myBean" class="com.example.MyClass">
<property name="myIntProperty" value="10"/>
<property name="myStringProperty" value="Hello, Spring!"/>
</bean>
或者,如果使用注解方式,可以通过@Value注解来注入:
@Component
public class MyClass {
@Value("${my.int.property}")
private int myIntProperty;
@Value("${my.string.property}")
private String myStringProperty;
// getters and setters
}
这里${my.int.property}和${my.string.property}是从Spring的配置文件中(如application.properties或application.yml)读取的属性值。