什么是AOP(Aspect Oriented Programming)?
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改 变这些行为的时候不影响业务逻辑的代码。
AOP的底层实现技术是JDK动态代理。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式(GoF强调的是接口或抽象类在实际案例中的灵活应用和智慧)的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
代理模式Proxy Pattern,23种java常用设计模式之一。代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
-----------------------------------------------------------------------------------------
//Junit测试类
@Test
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();//新建被拦截类
LogInterceptor li = new LogInterceptor();//新建日志拦截器
li.setTarget(userDAO);//把被拦截的类添加到拦截器里面去
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance
(userDAO.getClass().getClassLoader(),
userDAO.getClass().getInterfaces(), li);//根据拦截器生成代理类,下面有解释
System.out.println(userDAOProxy.getClass());//输出代理类的名
userDAOProxy.save(new User());//往代理类进行操作
userDAOProxy.delete();
}
-----------------------------------------------------------------------------------------
//LogInterceptor日志拦截类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//拦截器类要继承自InvocationHandler,InvocationHandler 是代理实例的调用处理程序实现的接口
public class LogInterceptor implements InvocationHandler {
private Object target;
//拦截器的setter和getter方法
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
//Method是方法,beforeMethod就是方法在执行之前的方法
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
//Object invoke(Object proxy, Method method, Object[] args) 方法是在代理实例上处理方法调用并返回结果。每个代码实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。也就是说:调用一个功能,不直接调用原类而去调用它的代理,代理通过反射机制找到它的这个功能的方法。然后代理自己去执行,所以invoke()会自动执行.
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);//关于加不加这句请看下面分析
return null;
}
}
-----------------------------------------------------------------------------------------
//加m.invoke(target, args)的输出结果:
class $Proxy4
save start
user saved!
save start
user saved!
save start
user saved!
delete start
user deteleted
//不加m.invoke(target, args)的输出结果:
class $Proxy4
save start
save start
save start
delete start
//save start是beforeMethod()的输出,
user saved是UserDAOImpl的save()的输出。不知道怎么解释了?求大神,大家帮忙。意会意会一下.....
*。关于代理类,JDK 中具体的动态代理类是怎么产生的呢?
1.产生代理类$Proxy0 类:
执行了 Proxy. newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)将产生$Proxy0 类,它继承Proxy 对象,并根据第二个参数,实现了被代理类的所有接口,自然就可以生成接口要实现的所有方法了(这时候会重写hashcode ,toString 和equals 三个方法),但是还没有具体的实现体。
2.将代理类$Proxy0类加载到JVM中,这时候是根据 Proxy. newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 它的第一个参数---- 就是被代理类的类加载器,把当前的代理类加载到JVM 中。
3.创建代理类$Proxy0类的对象,调用的$Proxy0类的$Proxy0 (InvocationHandler )构造函数,生成$Proxy0 类的对象,参数就是 Proxy. newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 它的第三个参数,这个参数就是我们自己实现的InvocationHandler 对象,我们知道InvocationHandler 对象中组合加入了代理类代理的接口类的实现类;所以,$Proxy0 对象调用所有要实现的接口的方法,都会调用InvocationHandler 对象的invoke ()方法实现。
相关推荐
**Spring Boot整合Mybatis、Druid、PageHelper、Swagger、AOP、过滤器与拦截器、Thymeleaf基础入门** 在现代Java开发中,Spring Boot以其简洁的配置和强大的功能,成为了主流的微服务框架。这个入门示例将帮助我们...
此外,PostSharp还支持与常见的设计模式和框架集成,如DI(依赖注入)容器、ORM(对象关系映射)工具等,进一步提升代码的灵活性和可扩展性。 通过阅读《PostSharp - AOSD2008》这篇论文,我们可以深入理解...
拦截器是AOP(面向切面编程)的一种表现形式,它可以在方法调用前后执行特定的操作,如日志记录、权限检查、性能统计等。在Spring MVC中,拦截器可以拦截HTTP请求,进一步增强我们的应用程序功能。 要创建一个...
- **Spring AOP 实现**:Spring 使用代理模式实现 AOP 功能,支持基于接口的动态代理和 CGLIB 字节码生成库。 - **Spring AOP 对 AspectJ 的支持**:Spring 允许使用 AspectJ 的注解来定义切面和切点。 - **Spring ...
Spring AOP则是一种设计模式,用于分离关注点,通过代理模式实现横切关注点,如日志、事务管理等。 首先,让我们理解反射的基础。在Java中,`java.lang.Class`类是所有类的通用表示,可以用于获取任何对象的类信息...
6. **拦截器(Interceptors)**:拦截器是Struts2的重要特性,它们类似于AOP(面向切面编程)的切面,在Action执行前后进行额外操作,如日志记录、权限检查、事务管理等。Struts2内置了多种拦截器,同时允许自定义...
拦截器是Struts2的一大特色,它们在Action执行前后执行,可以实现日志记录、权限验证、事务管理等功能。通过拦截器栈,可以灵活地组合和配置拦截器。 **6. OGNL(Object-Graph Navigation Language)** OGNL是...
常见的拦截器有日志、事务管理、性能监控等。通过配置,可以灵活地组合和堆叠多个拦截器来实现复杂的需求。 **4. 结果类型与结果配置** Struts2支持多种结果类型,如JSP、FreeMarker、Velocity等。结果配置在struts...
拦截器是Struts2的一个重要特色,它是AOP(Aspect-Oriented Programming,面向切面编程)的具体应用。拦截器允许开发者以插拔式的方式将功能注入到Action中,实现代码的分离,提高系统的可扩展性。同时,拦截器可以...
2. 自定义拦截器:开发者可以根据需求创建自己的拦截器,实现特定功能,如日志记录、权限验证等。 六、Struts2的插件: Struts2提供了一系列插件,如Struts2-dojo-plugin(提供Dojo库的支持),Struts2-json-plugin...
Struts2通过使用拦截器(Interceptors)实现了AOP(面向切面编程)的概念,使得控制层的逻辑更加清晰和模块化。 2. **MVC模式** MVC模式是Struts2的核心设计模式,它将应用程序分为三个主要部分:模型(Model)、...
其次,项目中引入了AOP(面向切面编程)的概念,具体表现为异常拦截器。AOP允许开发者在不修改源代码的情况下,对程序进行功能增强,如在方法执行前后添加日志记录、事务管理或异常处理等。在WebApi中,异常拦截器...
- **Interceptor**:拦截器是Struts2的核心功能之一,它们在Action调用前后执行,实现AOP(面向切面编程)功能,如日志记录、权限检查等。 - **Value Stack**:值栈存储Action和结果之间的数据,方便视图层直接...
- **综合示例**:实际项目中,可能需要创建多个拦截器来处理不同的逻辑,如会话管理、日志记录等。 #### 5. 探讨IOC模式 IOC(Inversion of Control,控制反转)是一种设计模式,用于减少对象之间的耦合度。在...
另一方面,拦截器(Interceptor)是Struts2的核心特性之一,它类似于AOP(面向切面编程)的概念,可以在动作执行前后插入自定义逻辑,比如事务管理、权限检查、日志记录等,极大地增强了框架的可扩展性和灵活性。...
3. **Interceptor(拦截器)**:Struts2的一个强大特性是拦截器,它们是处理请求和响应的中间件,可以在Action执行前后插入额外的功能,如日志记录、权限验证、性能统计等。默认的拦截器栈提供了许多内置的拦截器,...
Struts2是Struts的升级版本,引入了更多现代Web开发的特性,如拦截器(Interceptors)和更灵活的配置方式。 3. Hibernate框架: Hibernate是一个优秀的对象关系映射(Object-Relational Mapping,ORM)工具,它将...
10. **拦截器(Interceptor)**:自定义拦截器可以实现预处理和后处理逻辑,如权限验证、日志记录等。 11. **数据绑定和验证**:Spring MVC支持JSR-303/JSR-349 Bean Validation,可以在模型对象上添加验证注解,...
总结来说,Spring Boot中的AOP是通过预编译和运行时动态代理来实现的,它使得我们能够创建拦截器,对应用程序的特定部分进行拦截,从而实现统一的功能处理。通过定义切点表达式和使用不同的通知类型,我们可以灵活地...