`
sslaowan
  • 浏览: 380315 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
 
Spring中的AOP
创建时间: 2007127星期六
一、概述
(一)基本概念
1、什么是AOP?
    面向方面编程。所谓方面即是指日志、权限、异常处理、事务处理等。
2、AOP的3个关键概念
   (1)切入点(Pointcut):Pointcut是Join Point的集合,Join Point就是需要注入Adivce的位置,也就是需要插入日志输出代码、事务处理代码等“方面”(Aspect,也就是AOP中的A)代码的地方。
    比如我现在要写一个存钱的方法:saving()
    通常情况下我就得在这个saving()方法前后写些事务代码
    如:
 
          logger.log(Level.INFO,”start”);
Saving();
                         logger.log(Level.INFO,”end”);
      
         对于事务代码而言,saving()方法的前后就都是Join Point了。在Spring中它对应config.xml中设定的方法,这个方法就是类(class)中需要进行某方面处理的方法(method)。
        (2)通知(Advice):就是指Join Point对应的代码(方法)。比如日志输出这个方面,指的就是日志输出的代码或方法了。在Spring中,它对应类(class)。
        (3)Advisor是Poincut和Advice的配置器,它包括Pointcut和Advice,是将Advice注入程序中Pointcut位置的代码。在Sping中,它对应config.xml中的配置段<bean id=logAdvisor class=”org.springframework.aop.support.RegexpMethodPointcutAdvisor”>
 <bean id=”logAdvisor” class=”org.springframework.aop.support.RegexpMetho
dPointcutAdvisor”>
    //advice属性对应的当然就是输出日志的类,也就是对应的那个bean
    <property name=”advice”>
         <ref bean=”log”/>
    </property>
   //patterns属性指出指定要代理的方法,使用的是正则表达式
    <property name=”patterns”>
         <value>.*doAuditing.*</value>
    </property>
</bean>
 
(二)框架图

 

创建代理的两种方法
ProxyFactoryBean
动态代理
 
Spring4Advice
Interception Around
Before
After Returning
Throw
 
两种代理方式
Java动态代理
CGLIB代理
 

(三)何时使用什么
 1、创建代理的两种方法中首选动态代理。
第1种:针对某个类jakarta-oro-2.0.8.jar包。进行配置。可以指定某个类中所有方法都调用方面,也可以指定某个类中的某个方法,此时由于用到正则表达式,于是需要引入
第2种:针对某个方法进行配置。
 2、Spring4种Advice:
      第1种:在需要调用方面的方法前后都调用处理方面的代码
      第2种:在需要调用方面的方法之前调用处理方面的代码
第3种:在需要调用方面的方法之后都调用处理方面的代码
第4种:在需要调用方面的方法发生异常时调用处理方面的代码
3、两种代理方式首选第1种。
          第1种:面向接口,必须先定义接口,这是好的习惯,应该提倡
          第2种:当没有接口的时候,可以使用这种方法。需引入cglib-nodep-2.1_3,jar包。
二、详细
(一)、创建AOP代理的两种方法:
1、用ProxyFactoryBean创建AOP代理
   (需要指明代理目标类)
(1)代理目标类的所有方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
//下面interceptorNames属性(property)中的value值就是这个bean的id,其主要对应的是写入日志的那个类,也就是Spring AOP概念中的Advice(通知)。
<bean id="log" class="com.gc.action.LogAround"/>
//要输出日志的那个类(因为这种方法必须要指明代理目标类)
<bean id="timeBook" class="com.gc.action. timeBook "/>
//下面开始定义代理类,也就是ProxyFactoryBean,这是Spring自带的类,这也是Spring AOP中的Advisor
<bean id=”logProxy” class=”org.springframework.aop.framework.ProxyFactor
yBean”>
 //第一个属性,是指明要代理的类的接口,因为这个例子中使用的是Java动态代理机制来实现AOP的,因此必须指明接口
    <property name=”proxyInterfaces”>
        <value>com.gc.impl.TimeBookInterface</value>
    </property>
//这个属性是指明代理目标(target)类,也就是定义的那个类
        <ref bean=”timeBook”/>
    </property>
[U1] //这个属性是用来指明插入哪个Advice,此处使用list,应该表示这个类不只是可以调用这一个log类
         <list>
              <value>log</value>//这个值(log)对应中定义的那个id为log的bean
         </list>
    </property>
[U2] </bean>
</beans>
(2)代理目标类的指定方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="log" class="com.gc.action.LogAround"/>
<bean id="timeBook" class="com.gc.action. timeBook "/>
//在上一段配置文件中添加了下面这个bean,用来指明要输出日志的指定方法(上一个例子是所有方法都输出日志)
<bean id=”logAdvisor” class=”org.springframework.aop.support.RegexpMetho
dPointcutAdvisor”>
    //advice属性对应的当然就是输出日志的类,也就是对应的那个bean
    <property name=”advice”>
         <ref bean=”log”/>
    </property>
   //patterns属性指出指定要代理的方法,使用的是正则表达式
    <property name=”patterns”>
         <value>.*doAuditing.*</value>
    </property>
</bean>
<bean id=”logProxy” class=”org.springframework.aop.framework.ProxyFactor
yBean”>
    <property name=”proxyInterfaces”>
        <value>com.gc.impl.TimeBookInterface</value>
    </property>
    <property name=”target”>
        <ref bean=”timeBook”/>
    </property>
    <property name=”interceptorNames”>
         <list>
              <value>log</value>
         </list>
    </property>
</bean>
</beans>
 
2、用DefaultAdvisorAutoProxyCreator创建自动代理
   (好处:不用指明代理目标类,如果一个大项目中有很多类也不必一个一个设置AOP代理)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="log" class="com.gc.action.LogAop"/>
<bean id="timeBook" class="com.gc.action. timeBook "/>
//使用DefaultAdvisorAutoProxyCreator(红色代码)替代ProxyFactoryBean(绿色代码),因为绿色代码的作用是为具体的类(即所谓代理目标类)设置advice。
<bean id=”autoProxyCreator” class=”org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator”>
<bean id=”logAdvisor[U3] ” class=”org.springframework.aop.support.RegexpMetho
dPointcutAdvisor”>
    <property name=”advice”>
         <ref bean=”log”/>
    </property>
    <property name=”patterns”>
    </property>
</bean>
/*<bean id=”logProxy” class=”org.springframework.aop.framework.ProxyFactor
yBean”>
    <property name=”proxyInterfaces”>
        <value>com.gc.impl.TimeBookInterface</value>
    </property>
    <property name=”target”>
        <ref bean=”timeBook”/>
    </property>
    <property name=”interceptorNames”>
         <list>
              <value>log</value>
         </list>
    </property>
</bean>*/
</beans>
 
3、总结
实际上,DefaultAdvisorAutoProxyCreator和ProxyFactoryBean就是两种代理类,前者是自动的将Advisor和目标类联系起来,后者是通过指定的方式,将目标类和Advisor组合起来。
而advisor,对应的就是org.springframework.aop.support.RegexpMethodPointcutAdvisor,通过正则表达式来匹配类中的方法(设定Pointcut)。
(二)Spring四种通知(Advice)形式
1、Interception Around通知
       (1)负责输出日志的类
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
 
public class LogAround implements MethodInterceptor{
      private Logger logger = Logger.getLogger(this.getClass().getName());
   
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
           logger.log(Level.INFO, methodInvocation.getArguments()[0] + " 开始审核数据...."); 
        try {
          Object result = methodInvocation.proceed();
          return result;
        }
        finally {
                 logger.log(Level.INFO, methodInvocation.getArguments()[0] + " 审核数据结束....");
        }       
   }
}     
 (2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="log" class="com.gc.action.LogAop"/>
<bean id="timeBook" class="com.gc.action. timeBook "/>
<bean id=”logProxy” class=”org.springframework.aop.framework.ProxyFactor
yBean”>
    <property name=”proxyInterfaces”>
        <value>com.gc.impl.TimeBookInterface</value>
    </property>
    <property name=”target”>
        <ref bean=”timeBook”/>
    </property>
    <property name=”interceptorNames”>
         <list>
              <value>log</value>
         </list>
    </property>
</bean>
分享到:
评论
2 楼 zero鹏 2013-08-02  
1 楼 freesea 2011-05-20  
为什么我的无效呢

<!-- 定义切入逻辑(通知advice) -->
	<bean id="onsubmitBeforeAdvice" class="com.kamhoi.presentation.aop.OnSubmitBeforeAdvice" />

<bean id="nameMatchAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
		<property name="advice">
			<ref bean="onsubmitBeforeAdvice" />
		</property>
		<property name="mappedNames">
			 <list>
			 <value>onSubmit</value>			 
			 </list>
		</property>
	</bean>

<bean id="autoProxy"
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="proxyTargetClass" value="true" />
		<property name="beanNames">
			<list>
				<value>*Controller</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>nameMatchAdvisor</value>
			</list>
		</property>
	</bean>
//上面的没有效果,加入下面的还是没有效果,当执行onSubmit方法时,并没有去触发通知
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
   

相关推荐

    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的使用

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    Spring中aop编程所需要的jar包

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,并将它们模块化为可重用的切面。为了在Spring中进行AOP编程,我们需要一些特定的JAR包。以下是...

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    研究下Spring中AOP的实现?

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、安全检查等)与核心业务逻辑解耦。本篇文章将深入探讨Spring AOP的实现原理,并通过一个名...

    Spring中AOP所需jar包

    在AOP中,bean是被织入切面的对象,因此这个库是必不可少的。 3. **spring-context.jar**:提供了上下文相关的功能,如依赖注入(DI),事件传播,资源加载等。AOP的实现离不开Spring上下文的支持,因为它负责管理...

    spring-aop-jar

    在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...

    spring-aop-3.2.0.RELEASE.jar

    spring-aop-3.2.0.RELEASE.jar,一个Spring中AOP的jar包

    springboot+aspect实现springaop拦截指定方法.zip

    在Spring AOP中,切点通常用正则表达式或预定义的注解来指定,例如`@Within("com.example.service.*")`表示拦截com.example.service包下的所有类的所有方法。 4. **通知(Advice)**:通知是在切点匹配的方法执行前...

    Spring中AOP实现EHCache的整合(一)

    在本文中,我们将深入探讨如何在Spring框架中集成并使用AOP(面向切面编程)来实现对EHCache的高效管理。Spring是一个广泛使用的Java应用框架,它提供了强大的依赖注入和面向切面编程功能。而EHCache是一款流行、高...

    spring-aop-5.0.10.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.0.10.RELEASE.jar; 赠送原API文档:spring-aop-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.10.RELEASE....

    spring,spring-aop-5.3.22.jar+aop+IDEA本地包

    spring-aop-5.3.22.jar Spring AOP provides an Alliance-compliant aspect-oriented programming implementation allowing you to define method interceptors and pointcuts to cleanly decouple code that ...

    spring-aop-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.0.8.RELEASE.jar; 赠送原API文档:spring-aop-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.8.RELEASE.pom;...

    spring-boot aop

    在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越...

    【Spring】Spring中AOP的简介和基本使用,SpringBoot使用AOP.txt

    在Spring AOP中,连接点总是表示方法执行。 5. **引入(Introduction)**:允许在现有的类中添加新的接口及其实现,从而让其他对象能够像处理普通对象一样处理引入的对象。 6. **织入(Weaving)**:把切面加入到程序...

    spring-aop-5.3.12-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.3.12.jar; 赠送原API文档:spring-aop-5.3.12-javadoc.jar; 赠送源代码:spring-aop-5.3.12-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.12.pom; 包含翻译后的API文档:spring...

    spring-aop-6.0.2.jar

    spring-aop-6.0.2.jar

    Spring中Aop的使用包括xml和注解

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员将横切关注点(如日志、事务管理、权限检查等)与业务逻辑分离,从而实现代码的模块化和可维护性。这里我们将深入探讨两种在Spring中实现AOP的...

Global site tag (gtag.js) - Google Analytics