`
ch_space
  • 浏览: 111749 次
  • 性别: Icon_minigender_1
  • 来自: 农村进城务工人员
社区版块
存档分类
最新评论

Spring AOP(1)

阅读更多
1、我理解的Spring AOP
AOP其实就是划分出来了一个切面,然后在这个切面里面进行了一些增强,最后产生一个增加了新功能的代理对象,注意,是代理对象,这是Spring AOP实现的基础。这个对象只不过比原始对象(Bean)多了一些功能而已,比如Bean预处理,Bean后处理,异常处理等。

2、简单的Demo理解Spring AOP
首先定义一个AOP代理工厂AOPProxyFactory,这个工厂产生增强后的代理对象。
public class AOPProxyFactory{ 
  public static Object createProxy(Object target,MethodBeforeAdvice mbAdvice){
  return Proxy.newProxyInstance(target.getClass().getClassLoader(),
  target.getClass().getInterfaces(),
  new InvocationHandler(){//拦截器
    public Object invoke()(Object proxy,Method m,Object[] args) throws Throwable{
      mbAdvice.before(m,args,target);//方法执行前增强
      return m.invoke(target,args);//方法调用
    }
  });
}

然后定义before增强
MethodBeforeAdvice mbAdvice =new MethodBeforeAdvice(){
  public before(Method m,Object[] args,Object target){
       do something;
  }
};

最后使用代理工厂产生一个业务Bean的代理
UserserviceImpl target=new UserserviceImpl();//待增强的原始业务bean,在Spring中并非new出来,而是使用IOC注入Userservice接口中的
Userservice us= (Userservice)AOPProxyFactory.create(target,mbAdvice);
us.login(username,password);//us即为代理对象,此方法执行时,会首先执行before()

原理就是这么简单:InvocationHandler--MethodBeforeAdvice--invoke
这里是在方法嗲调用前增强,当然也可以在方法调用后增强、方法抛出异常时增强。

3、在Spring中实现的AOP
上面的例子是我的一个demo,以说明Spring的AOP实现原理。实际上Spring有一个org.springframework.aop.framework.ProxyFactoryBean接口,可以注入target(欲增强的对象)、interceptorNames(拦截器的一个list)属性,从而实现AOP。

示例中的MethodBeforeAdvice可以对代理对象的任何方法进行增强,也就是说,Advice只实现了功能的扩展,而没有拦截器的功能(事实上是拦截了所有的方法),而实际中并不需要这样,下面介绍针对特定方法的增强。

4、只拦截特定的方法
使用Spring的PointCutAdvisor。一个Advisor定义了一个Pointcut和一个Advice,满足Poincut(指定了哪些方法需要增强),则执行相应的Advice(定义了增强的功能)。

有两个常用的实现类:
NameMacthMethodPointCutAdvisor、RegexpMethodPointCutAdvisor
前者需要注入mappedName和advice属性,后者需要注入pattern和advice属性。
mappedName指明了要拦截的方法名,pattern按照正则表达式的方法指明了要拦截的方法名,advice定义了一个增强(需要自己实现MethodBeforeAdvice、MethodAfterAdvice、ThrowsAdvice、MethodInterceptor接口之一)。然后在ProxyFactoryBean的拦截器(interceptorNames)中注入这个PointCutAdvisor即可。
<bean id="loginBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
   <property name="pattern" value=".*UserService\.login"/>
   <property name="advice">
      <bean class="com.xxx.LoginBeforeAdvice"/>
   </property>
</bean>


最后将PointCutAdvisor和(或)Advice装配到ProxyFactoryBean中即可。
ProxyFactoryBean中可同时注入Advisor和Advice,只不过二者的拦截不一样而已。
<bean id="userService" class="org.spring.aop.framework.ProxyFactoryBean">
   <property name="interceptorNames">
      <list>
         <value>loginBeforeAdvisor</value>
         <value>loginThrowsAdvice</value>
         ...
      </list>
   </property>
   <property name="target" ref="targetService"/>
</bean>


注意:一个ProxyFactoryBean只能指定一个代理目标,不是很方便,第2节将介绍自动代理,方便配置。
分享到:
评论

相关推荐

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    spring aop的demo

    在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    SpringAOP1.zip

    本文将基于"LYFspringAOP系列:自己写的springAOP例子"进行深入讲解。 首先,了解AOP的基本概念。AOP是一种编程范式,旨在解决程序中分散的、与业务逻辑不直接相关的部分,如日志记录、事务管理、性能监控等。通过...

    简单spring aop 例子

    1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    Spring Aop四个依赖的Jar包

    1. **aspectj-1.7.3.jar**:这是AspectJ库的核心部分,提供了AOP语言支持,包括AspectJ编译器和运行时库。AspectJ是Java平台上的一个开源项目,它扩展了Java语言,支持声明式地编写横切关注点。通过AspectJ,我们...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    Spring AOP面向方面编程原理:AOP概念

    1. **非侵入性**:Spring AOP的设计理念是非侵入性的,这意味着开发人员无需修改现有代码就可以添加新的功能。这一点极大地降低了代码的耦合度。 2. **轻量级**:与一些需要预编译器的AOP框架不同,Spring AOP无需...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    spring aop 五个依赖jar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...

    spring AOP依赖三个jar包

    1. aopalliance-1.0.jar:这是一个非常基础的AOP库,定义了AOP的核心接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`,这些接口为不同的AOP框架提供了统一的交互方式。Spring...

    spring AOP 引入jar包,spring IOC 引入Jar包

    Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。...利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护性。

    spring-aop实例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、安全性等,从而解耦应用程序的核心业务逻辑。在Spring AOP中,关注点被模块化为独立的“切面”...

    spring aop 学习笔记

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...

Global site tag (gtag.js) - Google Analytics