`
lazyzhong
  • 浏览: 7675 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring——AOP

阅读更多

1、概念术语  

 

  在开始之前,需要理解Spring aop 的一些基本的概念术语(总结的个人理解,并非Spring官方定义):

 

  切面(aspect):用来切插业务方法的类。

 

  连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。

 

  通知(advice):在切面类中,声明对业务方法做额外处理的方法。

 

  切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。

 

  目标对象(target object):被代理对象。

 

  AOP代理(aop proxy):代理对象。

 

  通知:

 

  前置通知(before advice):在切入点之前执行。

 

  后置通知(after returning advice):在切入点执行完成后,执行通知。

 

  环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。

 

  异常通知(after throwing advice):在切入点抛出异常后,执行通知。

 

Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术

 

 

2、AOP接口实现方式

利用Spring AOP接口实现AOP,主要是为了指定自定义通知来供spring AOP机制识别。主要接口:前置通知 MethodBeforeAdvice ,后置通知:AfterReturningAdvice,环绕通知:MethodInterceptor,异常通知:ThrowsAdvice 。

a、业务接口

package org.lazyzhong.dao;

public interface BossSpeak {
	
	public void speak();
	
}

 b、业务实现类

package org.lazyzhong.daoimpl;

import org.lazyzhong.dao.BossSpeak;

public class BossSpeakImpl implements BossSpeak{

	@Override
	public void speak() {
		System.out.println("老板——————大家工作辛苦啦。。。我决定给大家发奖金1毛。。。");
	}

}

 c、前置通知

package org.lazyzhong.util;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class BeforeInter implements MethodBeforeAdvice {

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2)
			throws Throwable {
		System.out.println("今天是个好日子啊。。。看到上个月的销售额,老板感到很开心。。。于是召集大家开会。。。");
	}

}

 d、后置通知

package org.lazyzhong.util;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class AfterInter implements AfterReturningAdvice{

	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
			Object arg3) throws Throwable {
		System.out.println("会议结束。。。大家各回各的位置继续工作。。。");
	}

}

 e、环绕通知

package org.lazyzhong.util;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class AroundInter implements MethodInterceptor{

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		//speak()方法开始。。。进入环绕方法
		System.out.println("老板要开始讲话了。。。各位员工找个位置坐好。。。");
		arg0.proceed();
		//speak()方法结束。。。进入环绕方法
		System.out.println("听到这个消息。。各位员工感到灰常开心。。。于是。。啪啪啪的声音响起。。");
		return null;
	}

}

f、切点

package org.lazyzhong.util;

import java.lang.reflect.Method;

import org.springframework.aop.support.NameMatchMethodPointcut;

public class Pointcut extends NameMatchMethodPointcut {

	@Override
	public boolean matches(Method arg0, Class arg1) {
		//配置单个方法
		this.setMappedName("speak");
//		配置多个方法
//		String[] methods = { "xxx", "yyy" };
//		this.setMappedNames(methods);
		return super.matches(arg0, arg1);
	}
	
}

 

g、配置

	
	<bean id="beforeAdvice" class="org.lazyzhong.util.BeforeInter" />
	<bean id="afterAdvice" class="org.lazyzhong.util.AfterInter" />
	<bean id="aroundAdvice" class="org.lazyzhong.util.AroundInter" />
	<bean id="bossSpeak" class="org.lazyzhong.daoimpl.BossSpeakImpl" />
	
 	<bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut">
   		<property name="mappedNames"> 
   			<list> 
     			<value>speak</value> 
      		</list> 
   		</property> 
	</bean>
	
	<!--  指定切点匹配类 -->
	<bean id="pointcut" class="org.lazyzhong.util.Pointcut" />
	
	<bean id="matchBeforeAdvice" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="pointcut">
            <ref bean="pointcut" /> <!-- 也可以替换成pointcutBean -->
        </property>
        <property name="advice">
            <ref bean="beforeAdvice" />
        </property>
    </bean>
    
	<bean id="bossProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="proxyInterfaces">
			<value>org.lazyzhong.dao.BossSpeak</value>
		</property>
		<property name="target">
			<ref bean="bossSpeak"/>
		</property>
		<property name="interceptorNames">
			<list>
				<value>matchBeforeAdvice</value>
				<value>afterAdvice</value>
				<value>aroundAdvice</value>
			</list>
		</property>
	</bean>
	

 h、测试类

package org.lazyzhong.test;
import org.lazyzhong.dao.BossSpeak;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest1 {

	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
		BossSpeak boss=(BossSpeak)context.getBean("bossProxy");
		boss.speak();
	}

}

 i、输出:

今天是个好日子啊。。。看到上个月的销售额,老板感到很开心。。。于是召集大家开会。。。
老板要开始讲话了。。。各位员工找个位置坐好。。。
老板——————大家工作辛苦啦。。。我决定给大家发奖金1毛。。。
听到这个消息。。各位员工感到灰常开心。。。于是。。啪啪啪的声音响起。。
会议结束。。。大家各回各的位置继续工作。。。

 

 

 

3、方式二——schema方式

a、业务类

package org.lazyzhong.dao;

public class EmployeeSpeak {
	
	public void speak(){
		System.out.println("员工——老板真抠门");
	}
}

 b、切面类:切面类中包含所有通知

package org.lazyzhong.util;

import org.aspectj.lang.JoinPoint;

public class AspectAdvice {
	
	public void doBefore(JoinPoint jp) {
		System.out.println("员工们有话要讲。。。。");
	}
	
   public void doAfter(JoinPoint jp) {
	   System.out.println("员工们被炒鱿鱼了。。。");
   }

}

 c、配置

    <bean id="employee" class="org.lazyzhong.dao.EmployeeSpeak" />
    <!-- 声明通知类 -->
    <bean id="aspectAdvice" class="org.lazyzhong.util.AspectAdvice" />
   	<aop:config>  
       <aop:aspect id="TestAspect" ref="aspectAdvice">    
           <aop:pointcut id="point_cut"    
               expression="execution(* org.lazyzhong.dao.*.*(..))" />    
           <aop:before pointcut-ref="point_cut" method="doBefore"/>    
           <aop:after pointcut-ref="point_cut" method="doAfter"/>    
       </aop:aspect>    
   	</aop:config>    

d、测试类

package org.lazyzhong.test;
import org.lazyzhong.dao.EmployeeSpeak;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest2 {

	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
		EmployeeSpeak employee=(EmployeeSpeak)context.getBean("employee");
		employee.speak();
	}

}

 

e、输出

员工们有话要讲。。。。
员工——老板真抠门
员工们被炒鱿鱼了。。。

 

 

切入点表达式:

 

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 

 

 

 

modifiers-pattern:方法的操作权限

 

ret-type-pattern:返回值

 

declaring-type-pattern:方法所在的包

 

name-pattern:方法名

 

parm-pattern:参数名

 

throws-pattern:异常

其中,除ret-type-pattern和name-pattern之外,其他都是可选的。

 

Spring中的切入点分为两类:静态和动态。因为静态切入点的性能要优于动态切入点,所以优先考虑使用。Spring 为我们提供创建静态切入点很实用的类NameMatchMethodPointcut。在这个类中,我们只需要关心setMappedName和 setMappedNames方法。你可以使用具体的类名,也可以使用通配符。如:设置mappedName属性为set* 则匹配所有的set方法。Spring还提供了另通过正则表达式来创建静态切入点的实用类RegexpMethodPointcut。通过使用Perl样 式的正则表达式来定义你感兴趣的方法。当切入点需要运行时参数值来执行通知时,这时就需要使用动态切入点。静态切入点只限定于给定的方法和目标类,而不考虑方法的参数。

 

 

分享到:
评论

相关推荐

    Spring——aop

    **Spring AOP 知识详解** 在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、...

    Spring 入门案例——AOP

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在...

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    五、Spring源码分析——Spring Aop

    《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...

    Spring注解驱动开发第33讲——AOP原理总结

    Spring注解驱动开发第33讲——AOP原理总结

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

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

    spring-aop.jar

    《深入解析Spring AOP框架——以spring-aop.jar为例》 Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    java课件-14-Spring-AOP

    Spring容器简介——AOP AOP核心概念 Spring AOP的使用 Spring AOP常见用法 示例代码

    spring-aop-3.0.xsd spring-beans-3.0 spring-context-3.0.xsd spring-mvc-3.1.xsd

    总的来说,Spring 框架的这些核心组件——AOP、Beans、Context 和 MVC,通过 XML 配置文件实现了高度的灵活性和可扩展性,是现代企业级 Java 应用程序开发的基石。理解并熟练使用这些配置文件,是成为 Spring 开发者...

    spring aop依赖jar包

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

    Spring3.1AOP简单例子

    4. **代理(Proxy)**:Spring提供了两种类型的代理——JDK动态代理和CGLIB代理。前者适用于接口实现类,后者用于没有接口或需要代理的目标类。Spring会自动选择合适的代理方式,但也可以通过配置强制使用某一种。 ...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    ProSpring——Spring专业开发指南

    《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...

    spring-aop-4.3.9.RELEASE-sources.jar

    jar包分享系列——spring-aop-4.3.3.RELEASE-sources.jar——下载。请放心下载。

    spring-aop

    标题“spring-aop”指的是Spring框架中的一个关键模块——面向切面编程(AOP)。Spring AOP是Spring框架的一部分,它允许开发人员实现横切关注点,如日志、事务管理、性能监控等,这些关注点通常在多个业务逻辑点交叉...

    spring2.5 api 离线版

    Spring2.5-Reference_zh_CN.chm Spring2.5-中文参考手册.chm spring——AOP,IOC.doc Spring框架快速入门之简介.doc spring配置全书.doc Spring中的IOC与AOP详解.ppt

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    spring——第十四节素材.rar

    标题中的“spring——第十四节素材.rar”表明这是一个关于Spring框架的教程材料,可能是课程的第14节内容。Spring是Java开发中最广泛使用的轻量级框架,它提供了丰富的功能来简化企业级应用的开发,包括依赖注入、...

Global site tag (gtag.js) - Google Analytics