`
lee3836
  • 浏览: 68276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring aop总结

    博客分类:
  • SSH
阅读更多
最近在学习spring,做了一些关于Spring AOP的总结和例子,参考书籍是李刚老师著的《轻量级J2EE企业应用实战》。如下:

                                             Spring AOP介绍

       Spring的AOP是上面代理模式的深入。使用Spring AOP,开发者无需实现业务逻辑对象工厂,无需实现代理工厂,这两个工厂都由Spring容器充当。Spring AOP不仅允许使用XML文件配置目标方法,ProxyHandler也允许使用依赖注入管理,Spring AOP提供了更多灵活的选择。
在下面Spring AOP的示例中,InvocationHandler采用动态配置,需要增加的方法也采用动态配置,一个目标对象可以有多个拦截器(类似于代理模式中的代理处理器)。
下面是原始的目标对象:
//目标对象的接口
[color=red]
public interface  Person 
{ 
//该接口声明了两个方法 
void info(); 
void run(); 
} 
[/color]

下面是原始目标对象的实现类,实现类的代码如下:
//目标对象的实现类,实现类实现Person接口
[color=red]
public class PersonImpl implements Person 
{ 
//两个成员属性 
private String name; 
private int age; 
//name属性的 setter方法 
public void setName(String name) 
{ 
  this.name = name; 
} 
//age属性的setter方法 
public void setAge(int age) 
{ 
  this.age = age; 
} 
//info方法,该方法仅仅在控制台打印一行字符串 
public void info() 
{ 
  System.out.println("我的名字是:  " + name + " , 今年年龄为:  " + age); 
} 
//run方法,该方法也在控制台打印一行字符串。 
public void run() 
{ 
  if (age < 45) 
  { 
   System.out.println("我还年轻,奔跑迅速..."); 
  } 
  else 
  { 
   System.out.println("我年老体弱,只能慢跑..."); 
  } 
} 
} 
[/color] 该Person实例将由Spring容器负责产生和管理,name属性和age属性也采用依赖注入管理。
为了充分展示Spring AOP的功能,此处为Person对象创建三个拦截器。第一个拦截器是调用方法前的拦截器,代码如下:
//调用目标方法前的拦截器,拦截器实现MethodBeforeAdvice接口
public class MyBeforeAdvice implements MethodBeforeAdvice 
{ 
//实现MethodBeforeAdvice接口,必须实现before方法,该方法将在目标 
//方法调用之前,自动被调用。 
     public void before(Method m, Object[] args, Object target) throws Throwable 
{ 
  System.out.println("方法调用之前..."); 
  System.out.println("下面是方法调用的信息:"); 
  System.out.println("所执行的方法是:" + m); 
  System.out.println("调用方法的参数是:" + args); 
  System.out.println("目标对象是:" + target); 
     } 
} 
第二个拦截器是方法调用后的拦截器,该拦截器将在方法调用结束后自动被调用,拦截器代码如下:
//调用目标方法后的拦截器,该拦截器实现AfterReturningAdvice接口
public class MyAfterAdvice implements AfterReturningAdvice
{
//实现AfterReturningAdvice接口必须实现afterReturning方法,该方法将在目标方法
//调用结束后,自动被调用。
    
public void afterReturning(Object returnValue, Method m, Object[] args, Object target)throws Throwable 
{ 
  System.out.println("方法调用结束..."); 
System.out.println("目标方法的返回值是 : " + returnValue); 
  System.out.println("目标方法是 : " + m); 
  System.out.println("目标方法的参数是 : " + args); 
  System.out.println("目标对象是 : " + target); 
    } 
} 
第三个拦截器是是Around拦截器,该拦截器既可以在目标方法之前调用,也可以在目标方法调用之后被调用。下面是Around拦截器的代码:
//Around拦截器实现MethodInterceptor接口
public class MyAroundInterceptor implements MethodInterceptor 
{ 
//实现MethodInterceptor接口必须实现invoke方法 
     public Object invoke(MethodInvocation invocation) throws Throwable 
{ 
  //调用目标方法之前执行的动作 
         System.out.println("调用方法之前: invocation对象:[" + invocation + "]"); 
  //调用目标方法 
         Object rval = invocation.proceed(); 
  //调用目标方法之后执行的动作 
         System.out.println("调用结束..."); 
         return rval; 
    } 
} 
利用Spring AOP框架,实现之前的代理模式相当简单。只需要实现对应的拦截器即可,无需创建自己的代理工厂,只需采用Spring容器作为代理工厂。下面在Spring配置文件中配置目标bean,以及拦截器。
下面是Spring配置文件的代码:
<?xml version="1.0" encoding="gb2312"?>
<!--  Spring配置文件的文件头-->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<!--  Spring配置文件的根元素-->
<beans>
 <!--  配置目标对象-->
 <bean id="personTarget" class="lee.PersonImpl">
  <!--  为目标对象注入name属性值-->
  <property name="name">
   <value>Wawa</value>
  </property>
  <!--  为目标对象注入age属性值-->
  <property name="age">
   <value>51</value>
  </property>
 </bean>
 <!--  第一个拦截器-->
 <bean id="myAdvice" class="lee.MyBeforeAdvice"/>
 <!--  第二个拦截器-->
 <bean id="myAroundInterceptor" class="lee.MyAroundInterceptor"/>
<!--  将拦截器包装成Advisor,该对象还确定代理对怎样的方法增加处理-->
 <bean id="runAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <!--  advice属性确定处理bean-->
  <property name="advice">
   <!-- 此处的处理bean定义采用嵌套bean,也可引用容器的另一个bean-->
   <bean class="lee.MyAfterAdvice"/>
  </property>
  <!--  patterns确定正则表达式模式-->
  <property name="patterns">
   <list>
    <!--  确定正则表达式列表-->
    <value>.*run.*</value>
   </list>
  </property>
 </bean>
 <!--  使用ProxyFactoryBean 产生代理对象-->
 <bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
  <!--  代理对象所实现的接口-->
  <property name="proxyInterfaces">
   <value>lee.Person</value>
  </property>
  <!--  设置目标对象-->
  <property name="target">
   <ref local="personTarget"/>  
  </property>
  <!--  代理对象所使用的拦截器-->
  <property name="interceptorNames">
   <list>
    <value>runAdvisor</value>
    <value>myAdvice</value>
    <value>myAroundInterceptor</value>
   </list>
  </property>
 </bean>
</beans>

该配置文件使用ProxyFactoryBean来生成代理对象,配置ProxyFactoryBean工厂bean时,指定了target属性,该属性值就是目标对象,该属性值为personTarget,指定代理的目标对象为personTarget。通过interceptorNames属性确定代理需要的拦截器,拦截器可以是普通的Advice,普通Advice将对目标对象的所有方法起作用,拦截器也可以是Advisor,Advisor是Advice和切面的组合,用于确定目标对象的哪些方法需要增加处理,以及怎样的处理。在上面的配置文件中,使用了三个拦截器,其中myAdvice、myAroundInterceptor都是普通Advice,它们将对目标对象的所有方法起作用。而runAdvisor则使用了正则表达式切面,匹配run方法,即该拦截器只对目标对象的run方法起作用。

下面是测试代理的主程序:
public class BeanTest 
{ 
    public static void main(String[] args)throws Exception 
{ 
  //创建Spring容器 
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml"); 
  //获取代理对象 
  Person p = (Person)ctx.getBean("person"); 
  //执行info方法 
  p.info(); 
         System.out.println("==========================================="); 
  //执行run方法 
  p.run(); 
    } 
} 
下面是程序的执行结果:
方法调用之前...
下面是方法调用的信息:
所执行的方法是:public abstract void lee.Person.info()
调用方法的参数是:null
目标对象是:lee.PersonImpl@b23210
调用方法之前: invocation对象:[invocation: method 'info', arguments
[]; target is of class [lee.PersonImpl]]
我的名字是:  Wawa , 今年年龄为:  51
调用结束...
===========================================
方法调用之前...
下面是方法调用的信息:
所执行的方法是:public abstract void lee.Person.run()
调用方法的参数是:null
目标对象是:lee.PersonImpl@b23210
调用方法之前: invocation对象:[invocation: method 'run', arguments [
]; target is of class [lee.PersonImpl]]
我年老体弱,只能慢跑...
调用结束...
方法调用结束...
目标方法的返回值是 : null
目标方法是 : public abstract void lee.Person.run()
目标方法的参数是 : null
目标对象是 : lee.PersonImpl@b23210
程序的执行结果中一行&ldquo;=&rdquo;用于区分两次调用的方法。在调用info方法时,只有myAdvice和myAroundInterceptor两个拦截器起作用,调用run方法时候,三个拦截器都起作用了。

       通过上面的介绍,可看出Spring的AOP框架是对代理模式简化,并拓展了代理模式的使用。
Spring AOP是Spring声明式事务的基础。了解Spring AOP对深入理解Spring的声明式事务管理是非常有好处的。Spring AOP还可以完成很多功能,例如基于AOP的权限检查。


[color=darkred][/color]
分享到:
评论

相关推荐

    Spring AOP总结

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许开发者通过定义切面来实现代码的解耦和模块化。AOP的核心概念包括切面、通知、连接点、切入点、织入等,这些概念帮助我们实现横切关注点的分离...

    Spring AOP完整例子

    总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...

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

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    springAop的配置实现

    **Spring AOP 配置实现详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来简化应用程序的开发。在传统的面向对象编程中,业务逻辑与日志记录...

    spring-aop-jar

    总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...

    Spring AOP IOC源码笔记.pdf

    Spring框架是Java开发中不可...总结,Spring框架的IoC和AOP特性极大地简化了Java开发,通过依赖注入解耦了组件,通过面向切面编程解决了共性问题。理解并熟练掌握这些概念和机制,对于提升开发效率和代码质量至关重要。

    spring AOP 理论知识点总结.wps

    spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps

    spring aop demo 两种实现方式

    总结来说,Spring AOP提供了一种强大的方式来实现横切关注点,降低了代码的耦合度。无论是通过注解还是配置文件,都能够有效地实现切面的定义和拦截操作。理解并掌握Spring AOP的使用,对于提升Spring框架的应用能力...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    ### Spring AOP 实现流程日志跟踪 #### 一、背景与目的 在现代软件开发过程中,为了确保系统的稳定性和可维护性,通常会引入非功能性的需求来增强应用程序的功能,比如日志记录、安全控制等。这些需求往往不是业务...

    Spring aop 性能监控器

    总结来说,Spring AOP性能监控器通过切面编程实现了对目标方法的无侵入性监控,通过自定义注解、切面类以及配置,我们可以轻松地记录和分析应用程序的性能数据。结合源码学习,可以提升对Spring AOP机制的深入理解。

    SpringAOP.rar_springAOP

    《Spring AOP:面向切面编程的深度解析》 在软件开发中,Spring框架以其强大的功能和灵活性,已经成为Java企业级应用的首选框架之一。其中,Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架...

    spring aop 附带测试实例

    在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...

    spring之AOP(动态代理)

    总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    spring aop

    总结来说,这个项目提供了基于Maven和Spring的Web应用实例,展示了如何利用Spring AOP进行切面编程,包括XML配置和注解两种方式。通过学习这个项目,你可以深入理解Spring AOP的工作原理,以及如何在实际项目中有效...

    Spring AOP学习资料(pdf)

    ### Spring AOP 学习资料知识点总结 #### 一、Spring AOP 概念与背景 **Spring AOP**(面向切面编程)是Spring框架中的一个重要组成部分,它通过预定义的切入点来分离关注点,使得核心业务逻辑更加清晰,同时能够...

    Spring AOP 入门作者:廖雪峰

    ### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有...

    Spring AOP的底层实现技术

    总结来说,Spring AOP通过代理模式和切面编程思想,实现了代码的解耦和模块化,提高了软件的可维护性和可扩展性。了解并熟练掌握Spring AOP的底层实现技术,对于提升开发效率和编写高质量的Java应用程序具有重要意义...

Global site tag (gtag.js) - Google Analytics