Java Spring AOP详解
什么是 AOP
AOP (Aspect-Oriented Programming) 是一种编程思想,它将程序模块化分成维护和开发,可以让我们专注于业务逻辑处理,解决了代码耦合、代码重复等问题。
AOP 的原理就是通过将特性从业务逻辑中分离出来,在运行时动态地将它们与适当的程序节点关联起来。
AOP 的优点
AOP 为项目带来了许多优点,如下:
- 代码重复性降低:通过将特性抽象出来,避免重复代码的产生,从而提高应用程序的可重用性并简化代码。
- 可维护性增强:把业务逻辑与特性分离,大大减少了代码的耦合性和难度,让代码更加容易维护。
- 代码集中:通过划分组件,降低了业务逻辑的复杂性,让代码更好的集中在业务逻辑上。
- 程序员可以集中精力于业务逻辑中,不会被一些实现细节所干扰,提高开发效率。
Spring AOP 的实现
Spring AOP 实现了规范的 AOP 开发接口,支持 环绕增强,方法前增强,方法后增强和异常抛出增强等,同时,Spring AOP还通过各种 AOP术语来完整 阐述了 AOP 的全部实现。
提到 Spring AOP 那便不得不说它的核心接口和核心实现类,这也是使用 AOP 实现特性的关键类。
在引入 Spring AOP 的情况下,我们需要了解以下接口以及类:
- Advice
- JoinPoint
- AspectJ pointcut
- Advisor
- PointcutAdvisor
Advice
Advice 是 Spring AOP 的增强接口,Spring AOP 支持 5 种类型的 Advice,具体如下:
- Before advice
- After returning advice
- After throwing advice
- After advice
- Around advice
Advice 类提供了 AOP 中执行的通知,可以在指定时间点织入被增强对象的代码,是 Spring AOP 进行 AOP 增强的关键。
JoinPoint
JoinPoint 是 AOP 需要封装的关键。除了被建议的对象,JoinPoint 声明还包含被增强方法的信息,例如签名和参数。
AspectJ pointcut
Pointcut 不同于 JoinPoint,Pointcut 更细粒度,它只代表着需要增强的代码位置,即程序把代码块传递给 Advice,告诉它要织入什么样的代码。
@Pointcut("com.test.model.assembler.profile.ProfileAssembler.createProfile")
public void createProfile() {}
Advisor
Advisor 是 Spring AOP 中一个重要的抽象类,提供了 Advice 与 Pointcut 的关联。
PointcutAdvisor
Spring 框架提供了另外一种类型的 Advisor,即 PointcutAdvisor,它与 Advisor 的区别在于它的 Advice 语句必须基于 Pointcut 的表达式,而 Advisor 可以独立地封装 Advice 和 Pointcut。
以上是 Spring AOP 的一些主要概念,下面我们通过示例来更好地理解 Spring AOP。
示例1:冰淇淋销售
通过这个示例,我们来看下 Spring AOP 前置增强的实现
public class IceCreamSeller{
public void sellIceCream( String name ){
System.out.println("今天的日推是 " + name + "口味的冰激凌");
}
}
public class SellerAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target){
System.out.println("每位客人可以多尝试几种口味哦!");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
IceCreamSeller iceCreamSeller = (IceCreamSeller) context.getBean("iceCreamSeller");
SellerAdvice sellerAdvice = (SellerAdvice) context.getBean("sellerAdvice");
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(iceCreamSeller);
proxyFactory.addAdvice(sellerAdvice);
IceCreamSeller iceCreamSellerProxy = (IceCreamSeller) proxyFactory.getProxy();
iceCreamSellerProxy.sellIceCream("荔枝");
上述代码中,IceCreamSeller
类是我们要增加代码的类,SellerAdvice
类是 Spring AOP 前置增强实现的类。通过 ApplicationContext
构建实例,通过 ProxyFactory
添加想增强的类和 Advice,最后通过 getProxy()
获取动态代理对象并调用增强方法。
示例2:冰淇淋促销
通过这个示例,我们来看下 Spring AOP 后置增强的实现。
public class IceCreamSeller {
public void sale(String flavor) {
System.out.println("销售 " + flavor + " 口味的冰淇淋");
}
}
public class After implements AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
throws Throwable {
System.out.println("买 " + returnValue + " 送一罐可乐哦");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
IceCreamSeller iceCreamSeller = (IceCreamSeller) context.getBean("iceCreamSeller");
After after = (After) context.getBean("after");
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(iceCreamSeller);
proxyFactory.addAdvice(after);
IceCreamSeller proxy = (IceCreamSeller) proxyFactory.getProxy();
proxy.sale("荔枝");
上述例子中,After
类是 Spring AOP 后置增强的类,代码中我们通过 AfterReturningAdvice
把增强的代码写入了 afterReturning()
方法中,程序执行后会输出 买 荔枝 送一罐可乐哦
总结
Spring AOP 提供的增强机制为开发者进行更高节奏、更高效率的编程,而它背后的实现逻辑也并不算是特别复杂。 通过以上示例,我们了解了 Spring AOP 的特性和底层实现,相信大家都对 Spring AOP 的实现有了更深入的理解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Spring AOP详解 - Python技术站