`

Spring AOP 概念与例子

阅读更多

先了解AOP的相关术语:

1.通知(Advice):
通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。
2.连接点(Joinpoint):
程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
3.切入点(Pointcut)
通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中允许我们方便的用正则表达式来指定
4.切面(Aspect)
通知和切入点共同组成了切面:时间、地点和要发生的“故事”
5.引入(Introduction)
引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)
6.目标(Target)
即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事(AOP让他做爱做的事)
7.代理(proxy)
应用通知的对象,详细内容参见设计模式里面的代理模式
8.织入(Weaving)
把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
(1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器
(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码
(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

Spring提供了4种实现AOP的方式:
1.经典的基于代理的AOP
2.@AspectJ注解驱动的切面
3.纯POJO切面
4.注入式AspectJ切面

首先看经典的基于代理的AOP:
Spring支持五种类型的通知:
Before(前)  org.apringframework.aop.MethodBeforeAdvice
After-returning(返回后) org.springframework.aop.AfterReturningAdvice
After-throwing(抛出后) org.springframework.aop.ThrowsAdvice
Arround(周围) org.aopaliance.intercept.MethodInterceptor
Introduction(引入) org.springframework.aop.IntroductionInterceptor

 

 

aop要怎么玩?就几个步骤而已!

1.创建通知:实现这几个接口,把其中的方法实现了
2.定义切点和通知者:在Spring配制文件中配置这些信息
3.使用ProxyFactoryBean来生成代理

 

@Aspect
@Component
public class WebLogAspect {
	private Logger logger = LoggerFactory.getLogger(getClass());

	@Pointcut("execution(public * com.oys.controller..*.*(..))")
	public void printLog() {
	}

	@Before("printLog()")
	public void doBefore(JoinPoint joinPoint) throws Throwable {
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		logger.info("URL : " + request.getRequestURL().toString()+",HTTP_METHOD : " + request.getMethod()+",IP : " + request.getRemoteAddr()+",QueryString : " + request.getQueryString());
		Enumeration<String> enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String name = (String) enu.nextElement();
			logger.info("name:{},value:{}", name, request.getParameter(name));
		}
	}

	@AfterReturning(returning = "ret", pointcut = "printLog()")
	public void doAfterReturning(Object ret) throws Throwable { 
		logger.info("RESPONSE : " + ret);
	}
 
	@Around("printLog()")
	public void around(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("begin"); 
		joinPoint.proceed(); 
		System.out.println("commit");
	}
}

//<aop:aspectj-autoproxy />
//<aop:config>
//	<aop:pointcut expression="execution(* com.oys.service.*.*.*(..))" id="pt" />
//	<aop:aspect ref = "transactionDemo">
//	<aop:before method="startTransaction" pointcut-ref="pt" />
//	<aop:after-returning method="commitTransaction" pointcut-ref="pt"/>
//	</aop:aspect>
//</aop:config>


//<aop:config>
//    <aop:aspect ref="log">
//        <aop:pointcut expression="(execution(* com.oys.service.*.*.*(..)))" id="pt" />
//        <aop:before method="washOven" pointcut-ref="pt" />
//        <aop:before method="prepare" pointcut-ref="pt" />
//        <aop:after method="after" pointcut-ref="pt" />
//    </aop:aspect>
//</aop:config>

 

 

public   class  BeforeAdvice  implements  MethodBeforeAdvice {
    public   void  before(Method method,Object[] args, Object target) throws  Throwable {
        System.out.println( " 这是BeforeAdvice类的before方法. " );
    } 
}

public class AfterAdvice implements AfterReturningAdvice{
    public void afterReturning(Object returnValue ,Method method,Object[] args,Object target) throws Throwable{
        System.out.println("这是AfterAdvice类的afterReturning方法.");
    }
}

public class AroundInterceptor implements MethodInterceptor{
    public Object invoke(MethodInvocation invocation) throws Throwable{
        Object result = null;
        String id= invocation.getArguments()[0].toString();
        if ( id.equals("1")){
            result= invocation.proceed();
        } else{
            System.out.println("不是第一条");
        }
        return result;
    }
}



<bean id="before" class="com.oys.aop.BeforeAdvice"></bean>
<bean id="after" class="com.oys.aop.AfterAdvice"></bean>
<bean id="around" class="com.oys.aop.AroundInterceptor"></bean>
<bean id="targetUser" class="com.oys.service.UserImpl"></bean>

<bean id="upb" class="org.springframework.aop.framework.ProxyFactoryBean">
	<property name="proxyInterfaces">
		<value>com.oys.service.IUser</value>
	</property>
	<property name="interceptorNames">
		<list>
			<value>before</value>
			<value>after</value>
			<value>around</value>  
		</list>
	</property>
	<property name="target">
		<ref bean="targetUser"/>
	</property>
</bean>

 

分享到:
评论

相关推荐

    SPRING_AOP_概念解析以及例子示范.docx

    SPRING_AOP_概念解析以及例子示范

    SPRING AOP 概念解析以及例子示范

    NULL 博文链接:https://zhangyulong.iteye.com/blog/857431

    SPRING AOP 概念解析以及例子示范.pdf

    SPRING AOP 概念解析以及例子示范.docx

    aop的详细总结(包含例子)

    一、AOP 概念 二、AOP 种类 三、Spring AOP 代理原理 四、Spring AOP 通知类型 五、Spring AOP Pointcut 六、Spring AOP 中的Advisor其实就是Aspect 七、AOP ProxyFactory 八、自动代理

    springboot的aop使用

    介绍了aop的概念,并且统计了aop的多种实现方式,以及包含其对应的相关例子代码描述

    Spring从入门到精通 源码

     全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、Spring和Hibernate、Spring和Ant、Spring和Junit。本书适用于...

    Spring+3.x企业应用开发实战光盘源码(全)

     第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。  第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架...

    spring.doc

    SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理...

    Spring从入门到精通(珍藏版)

     全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、S pring和Hibernate、Spring和Ant、Spring和Junit。本书适用于初、中级软件开发人员...

    Spring 2.0 开发参考手册

    6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2....

    spring.net中文手册在线版

    Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第...

    spring chm文档

    6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入...

    Spring中文帮助文档

    6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入...

    Spring API

    6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入...

    SpringFramework中的面向方面编程(AOP),第二部分

    火龙果软件工程技术中心 在本系列的第一部分,我介绍了如何实现面向方面领域的“HelloWorld”:跟踪和记录方面。利用Spring框架所提供的面向...本文将描述around通知的每个特性,以便您可以在自己的SpringAOP应用程

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。  第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring...

    Spring.3.x企业应用开发实战(完整版).part2

    10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过...

Global site tag (gtag.js) - Google Analytics