AOP(Aspect-Oriented Programming)是一种面向切面编程的技术,它通过将程序中的横切关注点与业务逻辑分离,使得代码更加简洁、易于维护和扩展。在本文中,我们将深入探讨AOP的背景、原理、实现方式以及应用场景。
一、AOP的背景
在软件开发中,我们经常会遇到一些横切关注点,比如日志记录、缓存管理、安全检查等。这些关注点通常分散在应用程序的各个模块中,导致代码重复、难以维护和扩展。为了解决这些问题,AOP应运而生。
二、AOP的原理
AOP通过将程序中的横切关注点与业务逻辑分离,实现了代码重用和简化。具体来说,AOP采用了一种称为“切面”的技术,将所有横切关注点抽象成一个个切面,然后将这些切面插入到程序执行流程中的特定位置,实现对程序行为的控制和调整。
三、AOP的实现方式
在AOP中,切面可以通过不同的实现方式来实现,包括静态代理、动态代理和字节码操作等。其中,动态代理是一种较为常见的实现方式,它通过在运行时生成代理对象来实现对目标对象方法的增强。在Java中,动态代理主要有两种实现方式:JDK Proxy和CGLIB。
四、AOP的应用场景
AOP广泛应用于日志记录、事务管理、安全检查、性能监控等方面。例如,在一个Web应用程序中,我们可能需要记录用户请求的日志、检查用户权限等。如果将这些功能分散到每个业务逻辑中去实现,会导致代码重复和难以维护。而如果采用AOP技术,将这些共同的关注点提取出来,就可以使代码变得更加简洁、易于维护和扩展。
总之,AOP是一种非常重要的编程思想,可以有效地解决横切关注点带来的问题,使得代码更加简洁、易于维护和扩展。在实际开发中,我们可以选择不同的AOP框架来实现自己的需求,比如Spring AOP和AspectJ等。
AOP基于XML配置的入门案例:
首先是导入架包和创建所需要的包
1 创建service类,这个类完成核心功能操作
public class BookserImpl implements Bookser {
@Override
public void chan() {
System.out.println("打打看看");
}
@Override
public void rep() {
}
@Override
public void lse() {
}
@Override
public void aa() {
}
}
接口
public interface Bookser {
void chan();
void rep();
void lse();
void aa();
}
创建Logger类,这个类是用来做功能的增强。
public class Logger {
public void before(){
System.out.println("前置");
}
public void afterReturning(){
System.out.println("后置");
}
public void afterTwroing(){
System.out.println("异常“");
}
public void after(){
System.out.println("释放");
}
}
在 src 目录下创建一个 Spring 的配spring .xml,配置内容如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.把所有类的对象交给IOC容器进行管理-->
<bean id="lohher" class="com.zm.logger.Logger"/>
<bean id="bookser" class="com.zm.serlet.impl.BookserImpl"/>
<!--2.AOP的配置:让增强类 的 哪个方法 动态进行何种增强 核心类 的 哪个方法-->
<aop:config>
<aop:aspect id="check" ref="lohher">
<aop:before method="before" pointcut="execution(* *..BookserImpl.*(..))"/>
<aop:before method="afterReturning" pointcut="execution(* *..BookserImpl.*(..))"/>
<aop:before method="afterTwroing" pointcut="execution(* *..BookserImpl.*(..))"/>
<aop:before method="after" pointcut="execution(* *..BookserImpl.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
public class Bookstest { public static void main(String[] args) { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("serivce.xml"); Bookser bookser = context.getBean(Bookser.class); bookser.chan(); } }
完后就可以在servlet中测试了