SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码 此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。 立即下载

接上一篇

 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP


本文采用强制的CGLB代理方式


SecurityHandler这个通知类可以换成安全性检测、日志管理等等。


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">package com.bjpowernode.spring;

import org.aspectj.lang.JoinPoint;


public class SecurityHandler {
	
	private void checkSecurity(JoinPoint joinPoint) {
		for (int i=0; i<joinPoint.getArgs().length; i++) {
			System.out.println(joinPoint.getArgs()[i]);
		}
		
		System.out.println(joinPoint.getSignature().getName());
		
		System.out.println("-------checkSecurity-------");
	}		
}
</span></span></span>


UserManager接口


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">package com.bjpowernode.spring;

public interface UserManager {

	public void addUser(String username, String password);
	
	public void delUser(int userId);
	
	public String findUserById(int userId);
	
	public void modifyUser(int userId, String username, String password);
}
</span></span></span>

UserManagerImpl接口的实现
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">package com.bjpowernode.spring;

public class UserManagerImpl implements UserManager {

	public void addUser(String username, String password) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.add()--------");
	}

	public void delUser(int userId) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.delUser()--------");
	}

	public String findUserById(int userId) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.findUserById()--------");
		return "张三";
	}

	public void modifyUser(int userId, String username, String password) {
		//checkSecurity();
		System.out.println("---------UserManagerImpl.modifyUser()--------");
	}

//	private void checkSecurity() {
//		System.out.println("-------checkSecurity-------");
//	}
}
</span></span></span>

applicationContext.xml中进行配置( <!-- 强制使用CGLIB代理 -->  )


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <!-- 强制使用CGLIB代理 -->  
    <!--      
	<aop:aspectj-autoproxy proxy-target-class="true"/>
	 -->
	 
	<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>
	<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
	
	<aop:config>
		<aop:aspect id="securityAspect" ref="securityHandler">
			<!--
			以add开头的方法 
			<aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/>
			 -->
			 <!-- 
			 com.bjpowernode.spring包下所有的类所有的方法
			<aop:pointcut id="addAddMethod" expression="execution(* com.bjpowernode.spring.*.*(..))"/>
			 --> 
			<aop:pointcut id="addAddMethod" expression="execution(* com.bjpowernode.spring.*.add*(..)) || execution(* com.bjpowernode.spring.*.del*(..))"/> 
			<aop:before method="checkSecurity" pointcut-ref="addAddMethod"/>
		</aop:aspect>
	</aop:config>
</beans>
</span></span></span>

Client客户端的调用


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">package com.bjpowernode.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {

	public static void main(String[] args) {
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		UserManagerImpl userManager = (UserManagerImpl)factory.getBean("userManager");
		userManager.addUser("张三", "123");
		
	}

}
</span></span></span>

最终效果




AOP两种代理的区别

     Jdk基于接口实现:JDK动态代理对实现了接口的类进行代理。

  • CGLIB基于继承:CGLIB代理可以对类代理,主要对指定的类生成一个子类,因为是继承,所以目标类最好不要使用final声明。
  • 如果目标对象实现了接口,默认情况下采用JDK的动态代理实现AOP,也可以强制使用CGLB生成代理实现;
  • 如果目标对象没有实现接口,那么必须引入CGLB,spring会在JDK的动态代理和CGLB代理之间切换

       通常情况下,鼓励使用jdk代理,因为业务一般都会抽象出一个接口,而且不用引入新的东西。如果是遗留的系统,以前没有实现接口,那么只能使用CGLIB。

        一般情况下优先采用JDK动态代理,虽然其效率似乎比不上CGLIB代理,但是其对象用完之后可以正常释放。但是CGLIB代理每代理一个对象,都会产生一个新类。而类一旦载入JVM,按照大部分JVM的机制,这些新类占用的内存不会释放。J2EE程序一般运行时间都很长,内存上会有一些压力。


XML和AspectJ注解方式配置优缺点对比


        用XML风格,则所有的切面、切点、通知等配置都写在一个或几个Spring配置文件里。这样的好处是,从配置文件中,就可以很清晰的看出系统中的有哪些切面,某个切面里使用那个的通知(advice)以及通知(advice)作用的切点。而在AspectJ风格中,在java程序中标识切面则显得凌乱、模糊。


在什么情况下使用注解形式的AOP?或者说使用注解来实现AOP有哪些优点呢?
   
    1. XML风格的AOP仅仅支持"singleton"切面实例模型,而采用AspectJ风格的AOP则
没有这个限制。

    2.XML风格的AOP中是不支持命名连接点的声明,而采用AspectJ风格的AOP则没有这个限制。不太理解的看下面实例代码:
  在@AspectJ风格中我们可以编写如下的内容:



<span style="font-size:18px;">    @Pointcut(execution(* get*()))  
                    public void propertyAccess() {}  
                      
                    @Pointcut(execution(org.xyz.Account+ *(..))  
                    public void operationReturningAnAccount() {}  
                      
                    @Pointcut(propertyAccess() && operationReturningAnAccount())  
                public void accountPropertyAccess() {}  </span>

在XML风格中,我们不能使用'&&'字符来连接命名连接点,如下:


<span style="font-size:18px;">    <aop:pointcut id="propertyAccess"  
                    expression="execution(* get*())"/>  
                      
                    <aop:pointcut id="operationReturningAnAccount"  
                expression="execution(org.xyz.Account+ *(..))"/>  
                <!-- 错误的配置  -->  
              <aop:pointcut id="accountPropertyAccess"  
                expression="propertyAccess && operationReturningAnAccount"/>  </span>

注意: XML风格AOP虽然不支命名连接点的声明,但是,可以使用如下形式处理,如下配置:


<span style="font-size:18px;">    <aop:pointcut id="propertyAccess"  
                    expression="execution(* get*())"/>  
       <aop:pointcut id="operationReturningAnAccount"  
                expression="execution(org.xyz.Account+ *(..))"/>  
        <aop:pointcut id="accountPropertyAccess"  
                expression="execution(* get*()) and execution(org.xyz.Account+ *(..))"/>  </span>


总结

       这两种方法都实现了AOP,提高了我们的程序代码复用率,很好的体现了抽象带来的好处,两者相互补充,相互借鉴,我们根据实际情况适当的选取和决策,在系统开发环境下适合开发的流程才是最重要的,

     

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练 在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模,才能一路突破围追堵截,进一步促进国产大模型产业生态繁荣。集群还提供了完善高效的软件栈工具,集成多种主流的深度学习编程框架,通过测试验证,确保了对行业领先人工智能模型的高效支持,做到开箱即用,用户可快速投入模型的开发和部署,加速了其在人工智能领域的布局和发展。方面取得了显著成效。 阅读详情

相关推荐

硬件基础(4):(6)高精度ADC设计中模拟地与数字地的划分与连接

在实际 PCB 设计中,**接地与布线**对于获得干净的参考电压和高精度 ADC 测量至关重要。下面详细阐述**如何在硬件层面减少数字噪声耦合到模拟电路、保障参考电压的稳定性**。

FCZlll的博客 2643

SSH框架的整合

最近研究了下SSH三大框架的整合,网上没有比较全的资料,现将心得写出,供大家参考。想学习的同学也可以学习下,由于三大框架的整合比较多,稍后会慢慢放出。 首先简单的介绍下三大框架:三大框架(SSH)主要用于java编程语言的Web开发,SSH全称是Struts+Spring+Hibernate,功能分别是Struts(进行数据传递),Spring(依赖注入),Hibernate(数据库管理)。

大大大禹的专栏 1969

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧)

本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。

weixin_28839549的博客 380

Spring学习笔记--AOP和IOC、SSH整合

/*spring框架的作用和优点:提高系统结构的灵活性,降低组件的耦合度 spring框架容器:在容器中管理应用程序的各个组件,建立组件关联 1、容器特性:工厂特性,IOC和AOP的实现 BeanFactory ClassPathApplicationContext FileSystemApplicationContext 2、对bean组件的管理 id|name 用于指定组件的标识

yansuoo的博客 813

Unity WebGL项目如何实现画布透明,完美融入网页背景(附.jslib文件与完整配置)

本文详细解析了Unity WebGL项目实现画布透明化的技术原理与实战步骤,从.jslib文件配置到前端框架集成,帮助开发者解决默认背景色问题,实现3D内容与网页设计的无缝融合。重点介绍了透明化核心机制、常见误区及React/Vue等现代框架中的最佳实践方案。

weixin_31896061的博客 299

IEEE 754浮点数与十六进制转换:从原理到实战避坑指南

在计算机系统中,数据的二进制表示与内存布局是底层开发的核心基础。IEEE 754标准定义了浮点数在内存中的精确格式,包括符号位、指数位和尾数位的分工,以及零、无穷大和NaN等特殊值的编码。理解这一原理对于处理原始字节流至关重要,尤其是在涉及跨平台或跨设备通信时。其技术价值在于,它能帮助开发者从根本上解决数据解析错误、通信协议不一致以及程序调试中的“灵异”问题。在嵌入式开发、网络通信(如Modbus协议)和固件解析等应用场景中,浮点数与十六进制的转换是高频操作。然而,字节序(大端/小端)是转换过程中最常见的“

weixin_33835103的博客 430

基础XML配置的AOP与基于注解实现的AOP详细对比

aop思想通过动态代理,一定程度上实现了代码的解耦。我们可以将日志模块,权限校验,事物等模块,与核心的业务代码相隔离,让程序员在写代码的时候,能够更加专注于业务。 基于注解实现AOP步骤: ①将目标类与切面类都加入到ioc容器中。 目标类该用啥注解用啥,切面类通常用@Component即可。另外,记得在applicationContext.xml文件中配置包扫描。 ②为切面类标注@Aspect...

Rosen's 1793

AutoDock Vina 对接计算(大批量)

AutoDock Vina是一种用于计算生物分子之间相互作用的计算工具,主要用于蛋白质和小分子(通常是潜在药物分子)之间的对接研究。它可以用于虚拟筛选、药物设计和生物分子结合位点的预测等多个应用领域。

MurphyStar的博客 1万+

SSH框架系列:Spring AOP应用记录日志Demo

1.简介 Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。以下是Spring AOP的小例子 源代码:https://github.com/nuptboyzhb/SpringAOPDemo 2.例子简介 2.1切面aspect:Logging.java /* * $fi

郑海波(莫川)的优快云博客 4712

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 470

SSH与SSM学习之SSH整合09——Spring的aop事务

SSH与SSM学习之SSH整合09Spring的aop事务 一AOP事务 二Spring配置文件中配置HibernateTransactionManager 三xml配置aop事务 1 UserServiceImpl 2 配置通知 3 配置织入 4 完整的 Spring配置文件 5 测试以及结果 四注解配置aop事务 1开启注解事务 2 完整的 Spring配置文件 3 Service类中使用注解

qiwenmingshiwo的专栏 720

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 210

SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对照注解方式的优缺点)...

接上一篇  SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文採用强制的CGLB代理方式 SecurityHandler这个通知类能够换成安全性检測、日志管理等等。 &lt;span style="font-size:18px;"&gt;&lt;span s...

weixin_34159110的博客 103

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。     总结如下:     Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制 SSH内容很多,先从宏观把控,在项目中历练……多多总结、思路清晰;为了提高系统的灵活性与降低维护成本,提高效率

2587

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring学习笔记IOC与AOP实例,Spring框架2核心

Spring学习笔记IOC与AOP实例 Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象。在以XML语言描述的配置文件中,声明web系统中哪个组件需要哪一种服务时,不是在程序中让对象和服务直接连接,具体负责连接工作的是Web容器,Spring中就是Ioc容器。 IoC的...

JavaSpringS的博客 535

【Java学习笔记(四十五)】之AOP,基于XML的AOP,基于注解的AOP

本文章由公号【开发小鸽】发布!欢迎关注!!! 老规矩–妹妹镇楼: 一. AOP (一) 概述        Aspect Oriented Programming,面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。动态代理的优点是不改变源码,进而增强代码的功能,它具有松耦合的优点。因此AOP可以对业务逻辑的各个部分进行松耦合,提高代码的可重用性。 (二) AOP的作用       &nb

开发小鸽 665

SpringMVC框架配置

配置SpringMVC架构,环境eclipse,tomcat 7,jdk 1.8,构建javaweb项目,架构包包含spring框架,Hibernate框架以及junit测试单元和其他一些依赖项。

J.Anson的博客 978

解决AOP切面在嵌套方法调用时不生效问题

解决AOP切面在嵌套方法调用时不生效问题

蓝带的博客 2967

解决Spring AOP (注解方式) Controller 不生效

很久没写文章了,一来是工作比较乏味,基本上没遇到什么比较有意思的问题,基本上很多问题,网上都能解决~ 二来。。懒了~,最近在职业道路上又遇到了坎,所以提起“笔”,对于平复心情也是一种好的方式~ 好吧,进入今天的主题,Spring AOP 不生效 是怎样一个情况呢?接触SSH也很久了,从仰望到觉得,其实也挺烦恼的~ 自己比较倾向于“零配置”的开发,也许本身对配置觉得无爱吧~ 所...

杰╃PhoeNix 2856

Idea@代码和配置无误,spring项目aspect不能执行

Spring整合JDBC、AOP实现JDBC缓存。

全局安装vue-cli之后,命令行执行vue -V,提示:“vue”不是内部或外部命令,也不是可执行的程序或批处理文件 494

声明式事务管理

大多数Spring用户选择声明式事务管理。这是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念。 Spring的声明式事务管理是通过Spring AOP实现的,因为事务方面的代码与Spring绑定并以一种样板式风格使用,不过尽管如此,你一般并不需要理解AOP概念就可以有效地使用Spirng的声明式事务管理。 从考虑EJB CMT和Spring声明式事务管理的相似以...

功夫熊猫 245

SSH模式下spring aop事务管理无法生效的可能原因

SSH模式下spring aop事务管理无法生效的可能原因 @Repository("baseDao") public class BaseHibernateDAO { @Autowired private SessionFactory sessionFactory; public Session getSession() { return sessionFactory.openSession(); } } 不能使用openSession()方法,而必须

qq_43734511的博客 294

SSH Web Demo Spring 配置 AOP

最近闲来没事 最近封装了一下SSH框架 的一些配置 但具体原来还在理解当中 包括横切面 点切 事物管理的配置 bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> property name="driverClass" value="com.

baidu_24598621的博客 380
上一篇: SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP
下一篇: Xdoclet + Ant自动生成Hibernate配置文件
IT架构体系
IT架构体系 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄15年 1870粉丝 232原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值