Spring4.1——AOP

AOP-4.1-Spring @Pointcut使用 在Spring中,使用@Pointcut可以用来定义切点,也就是要切哪些方法。这里容易混淆的是this和target的使用,this是在运行时去比对最终的代理对象是否和表达式定义的类型是否匹配,这个处理要等到运行时才能完成。而target是直接根据表达式定义找出类型,这个处理在编译器就能完成。 阅读详情
1、 AOP框架的分类(按修改的时机来划分)

      (1)静态AOP实现:AOP框架在编译阶段即实现对目标类的修改(增强),生成静态的AOP代理类(生成*.class文件已经被改掉了,需要使用特定的编译器)。以AspectJ为代表。

      (2)动态AOP实现:AOP框架在运行阶段动态生成AOP代理(在内存中动态地生成AOP代理类:JDK动态代理或cglib),以实现对目标对象的增强。以Spring AOP为代表。

      性能上来看: 静态AOP实现的性能好。动态AOP实现需要在运行阶段额外地执行动态生成,有了运行开销。

      方便性来看: 动态AOP更方便,因为它不需要额外的编译器。

2、 AspectJ

 AspectJ是一个基于Java语言的AOP框架

下载和安装AspectJ步骤:

①在软件所在处打开cmd窗口,使用 java -jar aspectj-1.8.0.jar指令



②进入安装界面,安装即可


成功安装了AspectJ之后,将会在AspectJ的安装路径下看到如下文件结构:
       - bin:该路径下存放了aj、aj5、ajc、ajdoc、ajbrowser等命令,其中ajc命令最常用,它的作用类似于javac,用于对普通Java类进行编译时增强。
       - docs:该路径下存放了AspectJ的使用说明、参考手册、API文档等文档。
       - lib:该路径下的4个JAR文件是AspectJ的核心类库。
       - 相关授权文件。

③将...\aspectj1.8\bin路径添加到PATH环境变量中,
         将...\aspectj1.8\lib\aspectjrt.jar和...\aspectj1.8\lib\aspectjtools.jar添加到CLASSPATH环境变量中。

3、初试——通过记事本使用AspectJ

eg:

(1)创建三个类:

TargetOne.java

package cony.aspect.service;

public class TargetOne
{
	public void info(){
	System.out.println("目标方法1");
	}
}

TargetTwo.java

package cony.aspect.service;

public class TargetTwo
{
	public void info(){
	System.out.println("目标方法2");
	}
}

Main.java

package cony.aspect.service;
public class Main
{
	public static void main(String[] args){
	TargetOne one = new TargetOne();
	one.info();

	TargetTwo two = new TargetTwo();
	two.info();
	}
}
(2)

①使用前

测试:


②使用后

增加一个类:

package cony.aspect;

public aspect AuthAspect
{
	before():execution(* cony.aspect.service.*.*(..))
	{
		System.out.println("====模拟执行权限检查====");
	}
}
测试:


此时会发现一个问题:多出了一个"====模拟执行权限检查====",这是因为执行切面的是cony.aspect.service包下面所有类的所有方法,也就是包括了Main类,所以,只要更改Main的包不与执行切面包相同即可。

更改后再次运行:


再增加一个around切面类

TxAspect.java

package cony.aspect;

public aspect TxAspect{

Object around():execution(* cony.aspect.service.*.*(..))
	{
		System.out.println("---模拟开启事务---");
		//回调目标方法
		Object rvt = proceed();
		System.out.println("---模拟关闭事务---");
		return rvt;
	}
}
测试:


4、AOP相关概念

    ① 切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,所以常常也称为横切关注点。

    ② 连接点(Joinpoint):程序执行过程中明确的点。如方法的调用,或者异常的抛出。Spring AOP中,连接点总是方法的调用。

    ③ 增强处理(Advice):AOP框架在特定的切入点执行的增强动作。处理有“around”、“before”和“after”等类型。

    ④ 切入点(Pointcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

    ⑤ 引入(Introduction):为被修改的类添加方法或成员变量。Spring允许引入新的接口到任何被处理的对象。

    ⑥ 目标对象:被AOP框架进行增强处理的对象,也被称为被增强的对象。

    ⑦ AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强。
             Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理。
             前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。

    ⑧  织入(Weaving):将增强处理添加到目标对象中、并创建一个被增强的对象(AOP代理)的过程就是织入。
            织入有两种实现方式:编译时增强(例如AspectJ)和运行时增强(例如CGLIB)。
            Spring和其他纯Java AOP框架一样,在运行时完成织入。

5、AOP编程

(1)在eclipse中使用AOP和aspect需要先导包


(2)步骤:
① 需要有目标方法

Dog.java

public class Dog {
	public void printDog(){
		System.out.println("======我是金毛犬======");
	}
}

User.java

public class User {
	public void printUser(){
		System.out.println("=======我是小米========");
	}
}

② 需要Advice

        i.定义Aspect类。为了把一个类变成aspect,有3种方式。
          A、注解   B、XML配置    C、将class改成aspect     
       ii.在Aspect类定义方法,并将该方法专程Advice,有3种方式。
          A、注解   B、XML配置    C、将方法签名改成特殊语法

③ 把advice放到目标方法的指定位置。
          通过pointcut或pointcut-ref属性来指定。

      用注解时要注意:
      a、需要添加<aop:aspectj-autoproxy/>元素。
      b、强制Spring去处理@AspectJ的注解。

eg1——使用xml配置:

aspect类:

public class AspectTest1 {

	public void beforeAdv(){
		System.out.println("---模拟开启事务---");
	}
}
Spring配置文件(需要导入aop命名空间):


测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = (User) appContext.getBean("user");
		Dog dog = (Dog) appContext.getBean("dog");
		user.printUser();
		dog.printDog();

eg2——使用注解配置:

aspect类:

@Aspect
public class AspectTest1 {
	//execution(* cony.domain.*.*(..))表示执行返回类型不限、cony.domain包下的任意类的任意方法形参不限
	@Before(value = "execution(* cony.domain.*.*(..))")
	public void beforeAdv(){
		System.out.println("---模拟开启事务---");
	}
}
Spring配置文件(需要导入context命名空间):


eg3——使用将class改成aspect:

参考:3、初试——通过记事本使用AspectJ例子

6、Advice

  Advice一共分成5种:Before、AfterReturning、AfterThrowing、After、Around
     不管配置哪种Advice,都需要指定2个属性:
     - method:指定将哪个方法转换成Advice。如果用注解就不需要该属性,因此注解放在方法上。
     - pointcut或pointcut-ref:pointcut直接指定切入点表达式;pointcut-ref引用已有的切入点表达式。

(1)Before——在目标执行之前织入的advice。

(2)AfterReturning——在目标方法成功完成之后织入的advice。    
         可额外指定一个returning属性,该属性值有2个作用:
         - Advice方法可通过该属性指定的值来访问目标方法的返回值。
         - Advice方法声明该返回值类型时,限制目标方法的返回值必须是指定的类型。否则该Advice不会织入。
           如果不想对目标方法的返回值进行限制,可将该返回值声明为Object

eg:

 ①修改5中Dog类为:

public class Dog {
	public int printDog(){
		System.out.println("======我是金毛犬======");
		return 1;
	}
}
②新增一个aspect类

public class AspectTest2 {
	public void afterReturn(int rvt){
		System.out.println("---模拟记录日志---,返回值为"+rvt);
	}
}
③Spring配置文件

<bean id="user" class="cony.domain.User"/>
<bean id="dog" class="cony.domain.Dog"/>
<bean id="aspect1" class="cony.aspect.AspectTest1"/>
<bean id="aspect2" class="cony.aspect.AspectTest2"/>

<aop:config>
	<aop:pointcut expression="execution(* cony.domain.*.*(..))" id="myPc"/>
	
	<aop:aspect ref="aspect1">
		<aop:before method="beforeAdv" pointcut-ref="myPc"/>
	</aop:aspect>
	
	<aop:aspect ref="aspect2">
		<aop:after-returning method="afterReturn"
			pointcut-ref="myPc" returning="rvt"/>	
	</aop:aspect>
</aop:config>
④测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = (User) appContext.getBean("user");
		Dog dog = (Dog) appContext.getBean("dog");
		user.printUser();
		dog.printDog();

注意:

(3)AfterThrowing——在目标方法出现异常时织入的advice。
         这种Advice类似于catch块。
      
         可额外指定一个throwing属性,该属性值有2个作用:
         - Advice方法可通过该属性指定的值来访问目标方法抛出的异常。
         - Advice方法声明该返回值类型时,限制目标方法的抛出的异常必须是指定的类型。否则该Advice不会织入。
           如果不想对目标方法抛出的异常进行限制,可将该异常声明为Exception或Throwable
eg:

①修改5中User类为:

public class User {

	public void printUser(){
		System.out.println("=======我是小米========");
	}

	public void deleteUser(Integer id){
		if(id < 0){
			throw new IllegalArgumentException("删除用户id不能小于0");
		}
		System.out.println("模拟删除用户:"+id);
	}
}
②新增一个aspect类
public class AspectTest3 {
	public void repair(Throwable e){
		System.out.println("~~~模拟对异常的修复,异常为:"+e);
	}
}
③Spring配置文件新增:
<bean id="aspect3" class="cony.aspect.AspectTest3"/>
<aop:config>
	<aop:pointcut expression="execution(* cony.domain.*.*(..))" id="myPc"/>
	<aop:aspect ref="aspect3">
		<aop:after-throwing method="repair" 
		pointcut-ref="myPc" throwing="e"/>
	</aop:aspect>
	
</aop:config>
④测试:

        ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) appContext.getBean("user");
        Dog dog = (Dog) appContext.getBean("dog");
        dog.printDog();
        user.printUser();
        user.deleteUser(-2);

(4)After——不管目标方法是成功完成,还是异常结束,该Advice都会织入
         这种Advice类似于finally块。

①新增一个aspect类

public class ReleaseAspect {
	public void release(){
		System.out.println("---模拟对资源的释放---");
	}
}
②Spring配置文件新增:

<bean id="aspect4" class="cony.aspect.ReleaseAspect"/>

<aop:config>
	<aop:aspect ref="aspect4">
		<aop:after method="release" pointcut-ref="myPc"/>
	</aop:aspect>
</aop:config>
③测试:

正常情况下测试:

        ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) appContext.getBean("user");
        Dog dog = (Dog) appContext.getBean("dog");
        dog.printDog();
        
        user.printUser();
        user.deleteUser(1);

异常情况下测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = (User) appContext.getBean("user");
		Dog dog = (Dog) appContext.getBean("dog");
		dog.printDog();
		
		user.printUser();
		user.deleteUser(-1);

(5)Around
         这种Advice功能最强大,它既可访问、修改目标方法调用参数,也可访问、修改目标方法的返回值。
         它甚至可以完全阻止目标方法的执行。
         它既可以在目标方法之前织入,也可以在目标方法之后织入。
         弱点:它是线程不安全,能用其他Advice的,就不要用Around advice

         Around advice方法必须满足如下3点:
         a. 必须声明返回值类型。
         b. 必须声明一个类型为ProceedingJoinPoint类型的形参。
         c. 必须调用ProceedingJoinPoint形参的proceed()方法,这就是回调目标方法。如果没有这一行,目标方法不会执行。
eg:

①删除除了before的advice类,新增一个aspect类

public class TxAspect {

	/**
	 * 环绕通知使用 @Around 注解来声明。
	 * 通知的第一个参数必须是 ProceedingJoinPoint 类型。 
	 * 在通知体内,调用 ProceedingJoinPoint 的 proceed() 方法将会导致潜在的连接点方法执行。
	 */
	public Object aroundAdv(ProceedingJoinPoint jp) throws Throwable{
		System.out.println("###模拟开启事务###");
    	/**
    	 * ProceedingJoinPoint继承了JoinPoint,JoinPoint包含了如下方法
    	 * getArgs:获取目标方法调用参数
    	 * getKind:获取连接点的类型。
    	 * getSignature:获取目标方法的方法签名
    	 * getTarget:获取目标对象
    	 * getThis:获取AOP代理
    	 */
		Object[] args = jp.getArgs();
		// 如果调用参数至少有1个,且第一个参数为String类型
		if(args!=null && args.length>0 && args[0] instanceof String){
			args[0] = "前缀:"+args[0];
		}
		//---------- 以上在目标方法之前织入---------------
		Object rvt = jp.proceed(args); // 回调原来的目标方法,如果去掉此行,目标方法就不会执行
		//---------- 以下在目标方法之后织入---------------
		System.out.println("###模拟结束事务###");
		if(rvt!=null  && rvt instanceof Integer){
			return (Integer)rvt * (Integer)rvt;
		}
		return rvt;
	}
}
②

修改User类

public class User {

	public void addUser(String name){
		System.out.println("=======我是 "+name+"========");
	}

	public void deleteUser(Integer id){
		if(id < 0){
			throw new IllegalArgumentException();
		}
		System.out.println("模拟删除用户:"+id);
	}
}

修改Dog类

public class Dog {
	public Integer printDog(Integer id){
		System.out.println("======我是金毛犬======"+id);
		return 3;
	}
}

③Spring配置文件新增:

<bean id="txAspect" class="cony.aspect.TxAspect"/>

<aop:config>
	<aop:pointcut expression="execution(* cony.domain.*.*(..))" id="myPc"/>
	
        <aop:aspect ref="txAspect">
		<aop:around method="aroundAdv" pointcut-ref="myPc"/>
	</aop:aspect>
	
</aop:config>
④测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = (User) appContext.getBean("user");
		Dog dog = (Dog) appContext.getBean("dog");
		System.out.println(dog.printDog(2));
		System.out.println();
		user.addUser("coco");;
		user.deleteUser(1);

7、 访问目标方法的调用参数

(1)通过为Advice方法增加一个JoinPoint类型的形参。
           JoinPoint有个getArgs()即可获取所有形参。


(2)通过args切入点指示符。
            args(a,..)  —— 它还会对目标方法的形参类型进行限制。

eg:

①aspect类

public class AspectTest1 {
	// 如果你在args(a,..)指定什么参数,此处就可通过它们来访问目标方法调用参数
	public void beforeAdv(String a,String b){
		System.out.println("---模拟开启事务---,第一个参数为"+a+";第二个参数为"+b);
	
	}
}
②Spring配置文件
<bean id="user" class="cony.domain.User"/>
<bean id="dog" class="cony.domain.Dog"/>
<bean id="aspect1" class="cony.aspect.AspectTest1"/>

<aop:config>
	<aop:pointcut expression="execution(* cony.domain.*.*(..)) and args(a,b,..)" id="myPc"/>
	
	<aop:aspect ref="aspect1">
		<aop:before method="beforeAdv" pointcut-ref="myPc"/>
	</aop:aspect>
	
</aop:config>
③

User.java

public class User {

	public void addUser(String name,String pass){
		System.out.println("=======添加用户========"+name);
	}

	public void deleteUser(Integer id){
		System.out.println("模拟删除用户:"+id);
	}
}
Dog.java

public class Dog {
	public int printDog(){
		System.out.println("======我是金毛犬======");
		return 1;
	}
}
④测试

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		Dog dog = (Dog) appContext.getBean("dog");
		dog.printDog();
		
		User user = (User) appContext.getBean("user");
		user.addUser("小米","123");
		user.deleteUser(1);

由结果可以看到只有addUser方法被织入了,因为在aspect类中规定两个参数都是String类型,而且在Spring配置文件中规定参数为两个及以上。

8、 AOP的切入点指示符

格式:execution([访问权限] 返回值类型 包.类.方法(形参) [throws 异常])

默认情况下,都可用*作为通配符。形参列表支持2个通配符, ..代表任意个任意类型的参数; *代表一个任意类型的参数。

eg:

(*,java.lang.String) 2个形参,且第二个形参必须是String
(..,java.lang.String) 1~N个形参,最后一个形参必须是String
(*, ..) 1~N个任意类型的形参。
(..) 0~N个任意类型的形参。

target(类型) ——要求目标对象必须是指定类型。


this(类型) —— 要求AOP代理对象必须是指定类型。
args(a,b) —— 要求目标方法必须有匹配的形参。
bean(beanid) ——  只为特定Bean的所有方法织入增强处理。原生AspectJ并不支持,只有用Spring才支持。


切入点表达式还支持 and、or、not这3个逻辑运算符。

Python | KS检验以及其余非参数检验的实现 Python | KS检验以及其余非参数检验的实现1 什么是KS检验2 KS检验分类?3 KS检验的Python实现3.1 检验指定的数列是否服从正态分布3.2 检验指定的两个数列是否服从相同分布4 其余的非参数检验4.1 Wilcoxon符号秩检验(t检验的非参数版本)4.2 Kruskal-Wallis H检验(方差分析的非参数版本)4.3 Mann-Whitney秩检验5 参考 1 什么是KS检验 定义:检验一个分布f(x)与理论分布g(x)【比如正态分布】是否一致,或两个观测值分布是否有显著差异的检 阅读详情

相关推荐

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 331

CC2340项目从导入到编译:避开FreeRTOS路径和TI Clang编译的那些坑

本文详细解析了CC2340项目开发中常见的FreeRTOS路径问题和TI Clang编译错误,提供了从工程导入到编译的实用解决方案。通过Workspace配置、环境变量设置和编译器优化等技巧,帮助开发者高效避开开发陷阱,提升CC2340项目的开发效率。

weixin_30721077的博客 470

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

m0_61961937的博客 1万+

Spring4.X后配置AOP

面向切面拦截,主要分为基于注解的拦截与基于方法规则的拦截。一:添加Spring和AOP相关的依赖 &lt;properties&gt; &lt;java.version&gt;1.7&lt;/java.version&gt; &lt;spring-framework.version&gt;4.1.5.RELEASE&lt;/spring-framework.version&gt; &lt...

flysun的博客 1142

fast-lio运行步骤(使用velodyne数据)

使用fast-lio运行velodyne数据

ericdowney 4769

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2466

Spring4.1 AOP AspectJ支持包下载

Spring4.1 AOP AspectJ支持包下载 发表于 2015 年 3 月 2 日 使用Spring4.1框架进行面向切面编程时,所需要的AspectJ支持包来源于Eclipse下面的一下子项目AspectJ,可到此项目的官方地址下载AspectJ支持包。同时也要下载aopalliance包并添加到项目中。 AspectJ项目地址为:http://www.ecli

大树叶 技术专栏 7264

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 253

Spring(4.1)Spring aop 动态代理----代理对象的产生和执行流程

动态代理模式(spring默认JDK动态代理模式) jdk动态代理模式(有接口的目标对象) 如何产生代理对象 Object proxy = Proxy.newProxyInstance(classloader,interfaces,InvocationHandler); classloader —作用是加载jdk帮我们写出来的代理类的字节码 interfaces — 目标类的接口数组 Inv...

Miaoshuowen的博客 3520

PCL 欧式聚类分割【2026最新版】

PCL中欧式聚类提取算法原理详解、代码实现以及一个大自然场景地物分割提取并保存分割结果到本地文件夹的应用案例。

点云侠的博客 40万+

152:vue+leaflet 判断一个点是否在一个电子围栏内

本文介绍了一个基于Vue+Leaflet的示例,演示如何判断点是否在电子围栏内。作者大剑师兰特(优快云知名博主)展示了使用polygon.getBounds().contains(latlng)方法检测点与多边形边界的关系。代码仅需80行,通过点击地图触发判断逻辑,结果显示提示信息。该技术可广泛应用于地理围栏、位置服务等场景,需要安装turf依赖。文章提供了完整源码和配置说明,适合GIS开发者学习参考。

大剑师兰特的GIS世界 756

Spring Boot 学习之路——4.1 AOP注解方式实现打印日志 详解

以下内容转自:https://www.cnblogs.com/lixiang1993/p/7447853.html1.声明一个切面类,并把这个切面类加入到IOC容器中@Component@Aspectpublic class LogAspect{    @Pointcut(value="execution(* *.*(..))")    public void showLog(){}    @Be...

只是一只程序媛 688

22、光无线通信调制技术详解

本文详细介绍了光无线通信中的多种调制技术,包括开关键控(OOK)、脉冲位置调制(PPM)、数字脉冲间隔调制(DPIM)、副载波强度调制(SCM)、相移键控(PSK)、正交幅度调制(QAM)以及多载波调制(MCM)如OFDM和MSIM。文章分析了各类调制技术在带宽需求、功率效率、传输容量、传输速率和PAPR等方面的性能差异,并通过Matlab仿真展示了其在AWGN信道下的误码率表现。同时,对比了不同技术的适用场景,提出了调制选择流程,并结合室内光通信与自由空间光通信的应用案例,展望了未来调制技术向高频谱效率、

net55的博客 116

4.1spring AOP基础

1.AOP的应用解读 面向方面编程(AOP):也可称为面向切面编程,是一种编程范式, 提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP) 在进行OOP开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP最大问题就是无法解耦组件进行开发,比如我们上边举例,而AOP就是为了克服这个问题而出现的,它来进行这种耦合的分离。 AOP为开发者提供一种进行横切关注点(比如日志关注点横切了支付关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。

weixin_48377011的博客 253

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

4.1 Spring AOP

两种方式实现AOP 基于XML配置开发AspectJ package aspectj.xml; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class MyAspect { /** * 切面类,在此类中编写各种类型通知 */ public void before(JoinPoint jp) { System.out.print("前置通知:模拟权限控制");.

优快云xufucheng的博客 123

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SPRING-了解4-AOP1

面向切面编程 oop的延续,对业务进行隔离,降低耦合度,目标是不改变原来的代码在主干中增加新功能比如已经写好登录功能,现在需要加入权限,那么应该额外写权限模块,之后配置即可。

rapid2011的专栏 349

4种实例 advice aop_25.1 Spring AOP

图25.1OOP和AOP的关系从图25.1可以看出,通过Aspect,分别向Parent1和Parent2、Child1和Child2以及Grandchild1和Grandchild2加入了日志、事务和其他需要横向重用的功能。25.1.2AOP术语简介为了更好地理解AOP,就需要对AOP的相关术语有一些了解。下面就解释一下AOP的一些术语的含义。q方面(Aspect):方面相当于OOP中的类,就是...

weixin_39787397的博客 162

1.4-Spring 框架的 AOP

面向方面的编程(AOP) maven配置: &lt;properties&gt; &lt;spring-version&gt;4.3.17.RELEASE&lt;/spring-version&gt; &lt;/properties&gt; &lt;!--spring核心依赖 --&gt; &lt;!-- spring-context --&gt...

boolean的博客 229

1.4 浅谈Spring-Spring AOP的谎言

前言 最近又开始看源码了,虽然Spring AOP早就看过了,但是有的时候还是记得不熟,虽然Spring AOP已经被人分析了千万遍了,但仍然无法逃出我的魔爪... 这里我个人觉得有一个有歧义的点,这就像标题的那样,Spring AOP的谎言——AOP其实是一套解决方案,意思就是说它只是一个概念上的东西。实际在Spring处理的过程中,关于Spring对AOP的处理其实 就是DI(依赖注入)...

weixin_30436891的博客 78

Spring1.4——AOP和AOP的事务处理的实现

Javaweb框架学习文章索引点这里 AOP介绍: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分...

smallhc的博客 1939

Spring2.5学习4.1_AOP

Java的动态代理 Spring的面向切面编程(AOP)底层实现原理是动态代理,因此在学习面向切面编程之前必须先了解动态代理。Java中动态代理应用非常广泛,动态代理 是23中设计模式中非常常用的经典设计模式之一。动态代理的原理是,当要调用一个目标对象或者其方法时,系统并不是直接返回目标对象,而是返 回一个代理对象,通过这个代理对象去访问目标对象或者目标对象的方法。例如:用户在某网...

dgz41976的博客 159

【spring】spring reference doc 4.3.1 研读<三> Spring aop

1. Spring 的 AOP        1.1 介绍                 面向切面编程(Aspect Oriented Programming) ,是对面向对象编程(OOP)的补充。 OOP 是 面向 类 , AOP 是面向 切面。               AOP 在 Spring 中的作用 : 提供 声明式的企业服务 ,尤其是 替代 EJB 的声明式服务 。最重要的...

lihuapiao的专栏 1702

25-Spring源码解析之AOP(4)——创建AOP代理(1)

Spring版本:<version>5.2.1.RELEASE</version> 上一篇:24-Spring源码解析之AOP(3)——解析@Aspect获取增强器 上一篇我们讲完了解析@Aspect注解并获取增强器的时机和如何获取增强器。在获取增强器后,就是开始对创建的Bean进行分析看其是否需要创建对应的AOP代理。 那么本篇文章就开始讲解切面类(LogAspect...

想当厨子的程序媛 1099

09点睛Spring4.1-AOP

汪云飞记录本 119

spring 学习(1.4) 入门基础- AOP教程

 原先以为自己已经了解了AOP,昨天又看了看,发现还是有些地方没有弄明白,再记录一篇文章以便理解转自:http://spring.jactiongroup.net/viewtopic.php?t=478这是在网上发现的一篇关于Spring AOP编程的教程,读完这篇文章后,Spring AOP不再难以理解,因此我把它译成中文,推荐给Spring AOP的初学者。这是译文的链接。 AOP正在

牧场_SZ_Shepherd... 710
上一篇: Spring3.3——Spring注解配置、Spring+Struts2整合、s2sh整合
下一篇: Spring4.2—— Spring的事务控制
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值