`

Spring1.x 2.x 3.x AOP的区别

 
阅读更多

Spring1.x, 2.x, 3.x 对于AOP的实现方式不一样。

Spring AOP是通过动态代理模式实现的,利用了java的反射机制。
在了解动态代理之前,先要知道什么是静态代理。
代理模式,就是在客户类和目标类之间增加了一个代理类,这个代理类和目标类实现了同样的借口。这样,客户类通过调用代理类来间接的访问目标类。在代理类中调用目标类同样接口的方法。这样在代理类中就可以在调用目标类的方法之前和之后做一些操作。
静态代理,是指在代理类的构造函数中静态地制定了目标类。所谓静态,就是指在编写代码的时候制定,这样编译之后就不能改了。
动态代理,是利用了java的反射机制,在运行时动态地制定目标类。具体实现方式是,代理类实现java.lang.reflect.InvocationHandler接口,实现接口中的invoke()方法,在Method.invoke(targetObject, args);调用之前和之后可以做一些操作。在代理类中自定义一个set方法,或者叫createProxy(Object targetObject),方法签名中有一个参数,是目标类。注意,这里目标类的类型是Object。所以,可以在运行时指定任何需要的目标类(目标类必须实现一个接口)。在这个方法中调用Proxy.newProxyInstance(ClassLoader loader,  Class<?>[] interfaces, InvocationHandler h)来生成实现同一接口(目标类实现的接口)的代理类。Proxy.newProxyInstance()方法返回的是一个Object类型对象,在客户类中可以通过强制类型转换,把该对象转换成接口。然后调用该接口的业务方法,就会触发InvocationHandler接口实现类中的invoke()方法,从而达到代理的目的。
 
Spring1.x中的AOP是侵入式的,advice需要实现spring的接口MethodBeforeAdvice和AfterReturningAdvice,在applicationContext.xml中配置org.springframework.aop.framework.ProxyFactoryBean类作为代理类。例如
<bean id="userProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
在其中指定接口列表和拦截器列表(也就是advice列表),同时指定目标类。例如:
-----------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- spring1.x -->
<!-- 定义目标类 -->
<bean id="userTarget" class="com.freesky.proxy.UserTargetImpl" />
<!-- 定义通知 -->
<!-- 前置通知 -->
<bean id="beforeLogAdvice" class="com.freesky.aop.BeforeLogAdvice" />
<!-- 后置通知 -->
<bean id="afterLogAdvice" class="com.freesky.aop.AfterLogAdvice" />

<!-- 代理类作用: 生成代理类,织入通知 -->
<bean id="userProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces">
<!-- 可以添加多个接口 -->
<list>
<value>com.freesky.proxy.IUser</value>
</list>
</property>
<!-- 引入通知 -->
<property name="interceptorNames">
<list>
<value>beforeLogAdvice</value>
<value>afterLogAdvice</value>
</list>
</property>
<!-- 目标对象 -->
<property name="target" ref="userTarget" />
</bean>
</beans>
------------------------------------------------------------------------------------------
 
Spring2.x就不需要代码实现spring的接口,advice类就是一个pojo。在applicationContext.xml中通过<aop:config>来配置。其中引入了<aop:pointcut>。配置文件略显繁琐。完整的配置如下:
--------------------------------------------------------------------------------
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="  
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<!-- spring2.x后 -->
<!-- 目标对象 -->
<bean id="userImpl" class="com.freesky.proxy.impl.UserTargetImpl" />
<!-- 通知 -->
<bean id="logAdvice" class="com.freesky.advice.LogAdvice" />

<aop:config>
<aop:aspect id="logAspect" ref="logAdvice">
<!-- 切入点 -->
<!--  
<aop:pointcut id="beforePointCut" expression="execution(* sayHello*(..))" />
<aop:pointcut id="afterPointCut" expression="execution(* sayHello*(..))" />
-->
<aop:pointcut id="beforePointCut" expression="execution(* com.freesky.proxy.impl..*.*(..))" />
<aop:pointcut id="afterPointCut" expression="execution(* sayHello*(..))" />

<!-- 织入(通知作用于切入点) -->
<aop:before method="beforeLog" pointcut-ref="beforePointCut" />
<aop:after method="afterLog" pointcut-ref="afterPointCut" />
</aop:aspect>
</aop:config>
</beans>
-----------------------------------------------------------------------------------------------------
 
Spring3.x在AOP方面大大简化了开发工作量,通过annotation注解的方式在java代码中配置,而applicationContex.xml中只要一个配置<aop:aspectj-autoproxy />就可以自动实现AOP了。当然这个配置要和另外两个配置以前使用。
   <context:annotation-config />
    <context:component-scan base-package="com.freesky"/>
完整的配置如下:
------------------------------------------------------------------
<?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:aop="http://www.springframework.org/schema/aop"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
       
    <context:annotation-config />
    <context:component-scan base-package="com.itsoft"/>
    <aop:aspectj-autoproxy />
</beans>
------------------------------------------------------------------
 
参考文献:
Spring1.x 2.x 动态代理
    Spring AOP动态代理原理与实现方式
Spring3.x
   spring AOP @Around @Before @After 区别
分享到:
评论

相关推荐

    spring1.x使用AOP实例

    Spring 1.x版本虽然已经较为古老,但理解其AOP(面向切面编程)的使用对于学习Spring框架的整体架构和设计理念至关重要。AOP是Spring解决横切关注点问题的重要手段,如日志记录、事务管理等。 首先,让我们来了解...

    spring3.x注解

    首先需要添加 Spring 3.x 的基本依赖包,如 aopalliance-1.0.jar、aspectjweaver-1.5.3.jar 等。 2. 修改配置文件 applicationContext.xml 需要修改配置文件 applicationContext.xml,添加对应的注解配置。 ...

    spring4.x________

    5. AOP(面向切面编程)改进:Spring 4.x提供了更灵活的AOP配置,包括基于注解的切点表达式和类型安全的advice匹配。 6. 改进的测试框架:Spring Test模块提供了更强大的测试支持,包括对Spring Boot应用程序的集成...

    Spring1.x 和Spring2.x 版本上使用有什么区别

    Spring1.x和Spring2.x版本之间的差异主要体现在功能增强、性能优化以及对其他技术的支持上。以下将详细阐述这两个版本的主要区别。 1. **依赖注入(DI)的完善** 在Spring1.x中,依赖注入的概念已经引入,但支持的...

    Spring+3.x企业应用开发实战光盘源码,保证可用

    1. **AOP(面向切面编程)**:Spring 3.x在AOP方面进行了优化,使得切面定义更加简洁,支持更多的通知类型,并且增强了对注解的支持,使得切面编程更为直观。 2. **MVC(模型-视图-控制器)**:Spring 3.x的Web MVC...

    精通Spring4.x+企业应用开发实战 配套光盘(源码+资源)

    2. **AOP(面向切面编程)**:Spring4.x提供了一种实现AOP的方式,允许开发者定义“切面”来封装系统中横切关注点,如日志、事务管理等,提高代码复用性和可维护性。 3. **Bean管理**:Spring管理Bean的生命周期和...

    《Spring 3.x 企业应用开发实战》lib包

    1. **依赖注入(Dependency Injection, DI)**:Spring 3.x通过DI简化了对象之间的关系管理,使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。开发者可以通过XML配置、注解或基于Java的配置来实现DI。 ...

    spring4.x.x中文文档

    安全性方面,Spring Security 4.x.x与Spring 4.x.x紧密集成,提供了全面的身份验证和授权功能,包括OAuth2支持,保护了Web应用和RESTful API的安全。 总的来说,Spring 4.x.x中文文档将涵盖这些关键领域的详细内容...

    第5本书 spring3.x

    综上所述,通过阅读《第5本书 spring3.x》,读者可以全面掌握Spring 3.x的各个方面,包括但不限于依赖注入、AOP、MVC、数据访问和集成工具。同时,通过源码分析,可以深化对框架运行机制的理解。结合附录和示例代码...

    Spring4.X教学视频

    3. **AOP**:Spring的AOP允许你在不修改代码的情况下添加横切关注点,如日志、事务管理等。你会学习如何定义切面、通知和切入点表达式。 4. **Spring MVC**:对于Web应用,Spring MVC提供了一种优雅的模型-视图-...

    Spring 3.x企业应用开发实战.rar

    1. **MVC增强**:Spring 3.x对Model-View-Controller(MVC)架构进行了大量的优化,支持更多的视图技术,如FreeMarker、Velocity等,并提供了更强大的数据绑定和验证功能。 2. **数据访问集成**:Spring 3.x增强了...

    精通Spring4.x企业应用开发实战pdf+源码

    2. **AOP**:AOP是Spring提供的用于实现横切关注点(如日志记录、事务管理)的一种编程方式,通过切面和通知,可以在不修改原有业务代码的情况下,实现功能增强。 3. **Spring MVC**:Spring的Web MVC模块提供了...

    Spring4.X+Quartz2.X

    Spring4.X与Quartz2.X是两个在企业级Java应用中广泛使用的开源框架。Spring是一个全面的、模块化的应用开发框架,它简化了Java EE应用的开发,提供了强大的依赖注入、AOP(面向切面编程)以及丰富的数据访问支持。而...

    《Spring 3.x企业应用开发实战》PDF

    《Spring 3.x企业应用开发实战》是一本深入讲解Spring框架在企业级应用程序开发中的实践指南。这本书专注于Spring 3.x版本,该版本是Spring框架发展史上的一个重要里程碑,引入了许多新特性和改进,旨在提升开发效率...

    Spring3.X企业应用开发实战pdf扫描版+源码光盘

    2. **面向切面编程(AOP)**:Spring3.X提供了更强大的AOP支持,可以定义切面、通知类型,实现事务管理、日志记录等功能,提高代码的可维护性。 3. **数据访问集成(Data Access Integration, DAI)**:Spring3.X对各种...

    精通Spring4.x(包含源码)

    2. **AOP(Aspect Oriented Programming,面向切面编程)**:Spring提供了AOP支持,允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。AOP使得这些通用功能可以独立于业务逻辑进行处理。 3. **Spring...

    精通Spring+4.x++企业应用开发实战

    3. **Spring MVC**:Spring 4.x内置了一个强大的MVC框架,支持RESTful Web服务开发,并且提供了对多种视图技术的支持。 4. **数据访问**:Spring提供了多种数据访问抽象层,包括JDBC、ORM(如Hibernate)、NoSQL...

    Spring3.X编程技术与应用

    Spring3.X在AOP模块中提供了强大的支持,允许在不修改源代码的情况下动态地给程序添加额外的行为。 3.基于Java的配置: Spring3.X版本开始,强调了使用Java配置类替代传统的XML配置文件,这使得配置更加灵活和类型...

    Spring 3.x 企业应用开发实战 PDF与源码 高清 带书签

    《Spring 3.x 企业应用开发实战》是一本深度探讨Spring框架在企业级应用开发中的实践指南。Spring作为Java领域中最流行的开源框架之一,它的3.x版本为开发者提供了丰富的功能和强大的支持,使得构建复杂的企业级应用...

    spring 3.x企业应用开发实战

    Spring 3.x中的关键特性包括依赖注入、面向切面编程(AOP)、事务管理、数据访问抽象等。 1. 依赖注入:依赖注入是Spring的核心特性之一,它允许将对象的依赖关系交给Spring容器来管理。这通过XML配置文件、注解或...

Global site tag (gtag.js) - Google Analytics