将Spring AOP应用一例改为对Acton的代理

Spring in Acton 4读书笔记之使用AOP为类动态添加方法 我计划完成50到100篇有关Spring的文章,这是第十三篇。本文对应Spring in Action(Spring实战)第四版第四章中(4.3.4 Annotating introductions)的内容,将讲解如何使用标签为类动态添加方法。 一些像Ruby和Groovy这样的语言,有开放类(open classes)的概念,可以在不改变类和对象的定义的情况下,增加新的方法。不幸的是,Java没有那么动态,一旦一个类编译好之后,很难再为这个类增加功能了。 但是仔细想想,使用AOP的时候,难道不是在动态增加 阅读详情

本例是以用户登陆为例,有一个VO、一个Manager、一个DAO、一个Action和一个Form等,像DAO、Manager、VO这些我不想多说,并登陆的业务逻辑也不想多说,我只说我的ApplicationContext.xml和struts-config.xml是如何设置的,下面是ApplicationContext.xml(也就是上例里面的bean.xml,项目中多用的是ApplicationContext.xml)的配置:

<bean name="MyAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames">
<value>/login</value>
</property>
<property name="interceptorNames">
<list>
<value>myPointcutAdvisor2</value>
</list>
</property>
</bean>


在原文中的:

<bean id="myCheckClass" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.testspring.demo.CheckInterface</value>
</property>
<property name="target">
<ref local="checkInterface" />
</property>
<property name="interceptorNames">
<value>myPointcutAdvisor2</value>
</property>
</bean>

是定义了这个虚拟的bean,然后在测试类SpringTestCase2中用ApplicationContext.getBean("myCheckClass");来获得这个bean,然后调用execute方法(这里我把上例中的excute方法改成了execute,因为Action中自动执行的是execute,这样我可以直接用那个myPointcutAdvisor2正则匹配的拦截器应用到Action上,记得把ExcuteClass里的相应方法名也随之修改,SpringTestCase2测试类中的相应调用也改)。
    MyAutoProxy这个bean是对login这个Action的自动代理,他是自动运行的,beanNames指定是哪个Action(也可以是普通java类),如果要指定多个Action(或java类),则

<property name="beanNames">
<list>
<value>/login</value>
<value>/xxx</value>
<list>
</property>

这样配置。interceptorNames配置的是拦截器的beanid,同样如果想配多个拦截器,也可以写多个value。
    在ApplicationContext.xml中还需要把Action做为bean来配,上面代码中的/login就是在xml中配置的bean,其余的如manager和dao也需要配置:

<bean name="/login" class="com.testspring.action.LoginAction">
<property name="userManager">
<ref bean="userManager" />
</property>
</bean>

<bean id="userManager" parent="txProxyTemplate">
<property name="target">
<bean
class="com.testspring.manager.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDAO" />
</property>
</bean>
</property>
</bean>


本例是用Hibernate来做持久化层的,这里的txProxyTemplate是事务处理的bean,userDAO也是要配的,其它的代码如下: 

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/com/testspring/dao/model</value>
</list>
</property>
</bean> 

<bean id="transactionManager" 
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="dao" 
  class="com.testspring.dao.hibernate.BaseDaoHibernate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> 

<bean id="userDAO" 
  class="com.testspring.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> 

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="query*">PROPAGATION_REQUIRED</prop>
<prop key="reduce*">PROPAGATION_REQUIRED</prop>
<prop key="set*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

这里的事务处理的意思是,如果以add、delete、update、query、reduce和set开头的函数都要进行事务处理。
    在struts-config.xml还得配置Action:

 

<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy" input="index.jsp" validate="true" name="loginForm">
<forward name="success" path="/WEB-INF/pages/success.jsp" />
<forward name="failure" path="/WEB-INF/pages/failed.jsp" />
</action>

其它的都没怎么改,就这样,在页面上登陆,看后台就能看出来已经先走的拦截器。

Spring in Acton 4读书笔记之使用AOP监听函数的参数 在上一篇文章Spring in Action 4 读书笔记之使用标签创建 AOP中讲解了如何使用标签定义aspect,本文继续进行这部分内容。如前所述,Spring的AOP都是作用在方法级别,有时候,需要监听函数的参数,本文讲解如何根据不同的参数值,执行不同的行为。比如下面的代码,记录不同参数执行的次数。 定义aspect package soundsystem; import java.util.HashMap; import java.util.Map; import org.aspectj.lang. 阅读详情

相关推荐

Js逆向抖音a_bogus --/* V 1.0.1.19-fix.01 */补环境

需要在addEventListener中补一个鼠标移动事件,不补这个环境,生成的值是假值,你拿去请求,响应200,但是没有数据,这个算是dy的最难发现的一个难点。dy这个,没有原形链检测,我只是习惯了这样补,对XMLHttpRequest进行重写,导出a_bogus.发现可以响应状态码200,而且可以获取数据,接着注释params中的a_bogus。在n.apply的下面插入上述代码,对a_bogus进行全局导出。如果没有,就多放几次断点,因为每个人的游览器不一样。必须触发至少一次鼠标事件,不触发不给过。

2302_76420666的博客 4202

《Spring in Acton》第四版读书笔记之如何装配Bean

Spring中装配的主要方式 XML显式配置 Java显式配置 使用Java隐式扫描bean并自动装配 三种方式各有好处,作者认为选哪种只是口味问题,但强烈建议使用第三种(使用Java隐式扫描bean并自动装配),并且建议即使要用显式配置,也尽量使用Java配置,因为Java更好用(powerful),具有类型安全检查,并且更好重构。只有在XML有命名空间可以很方便使用,而JavaConfig...

谈谈IT 159

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 540

sybase数据库tempdb日志滿了

 开发数据库服务器遇到这样的一个问题,使用了一段时间之的后,突然之间数据库就用不了了,现象是新连接连接不上,已经连接的执行sql时,报出tempdb日志满了,无法进行操作的错误,而且控制台无法连接上服务器,所有操作都无法正常进行。经过上网查询,得知是tempdb日志满了,缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、

溪居 6205

Unity URP炫彩干涉效果:从薄膜干涉原理到Shader Graph实现

薄膜干涉是一种常见的光学现象,指光在透明薄膜上下表面反射后产生干涉,形成彩虹色条纹。其原理基于光程差导致的相长与相消干涉,不同波长的光被选择性增强或削弱。在计算机图形学中,这一物理现象被抽象为高效的数学模型,通过Shader编程实现动态色彩变化,为游戏和实时渲染带来独特的视觉表现力。技术实现上,常采用正弦函数结合噪声纹理来模拟色彩循环,利用法线与视角点积作为基础变量,加入噪声扰动模拟厚度不均,实现随视角变化的虹彩效果。在Unity URP渲染管线中,可通过Shader Graph可视化工具或手写HLSL代码

weixin_34026997的博客 295

西门子PLC1200与CB1241模块的Modbus RTU从站配置全流程(附串口调试技巧)

本文详细介绍了西门子S7-1200 PLC与CB1241通信模块实现Modbus RTU从站配置的全流程,包括硬件接线规范、TIA Portal工程组态、通信指令编程及串口调试技巧。通过实战案例和常见错误处理方案,帮助工程师快速搭建稳定的工业通信系统,提升自动化设备的互联互通能力。

weixin_29165725的博客 325

用ant打的war包含中文文件名乱码问题

     如果使用Ant脚本来打war,如果工程中包含中文文件名的文件,则打出来的war中这些文件的文件名就会变成乱码,使用MyEclipse部署到tomcat采用压缩成war方式也会存在相同的问题。    到网上查了好久,终于找到了解决方案,在ant脚本的war标签加入 encoding="GBK"这个参数,再跑一遍脚本,果然好用,没有出现乱码了。    示例脚本: xxxx   

溪居 3863

备战数学建模38-粒子群算法pso番外篇1(攻坚战2)

粒子群算法最初是根据鸟类群体行为得到的启发,对鸟群行为进行仿真的算法,是一种启发式算法,也就是智能优化算法,利用信息共享,通过中间信息进行改进搜索,从而获得问题的可行解。我们简单从下图去体会一下粒子群算法,就是有多个鸟,每个鸟相当于一个粒子,每只鸟的位置受自己认知的历史最佳位置和当前距离食物最近的鸟的位置的影响。我们进一步分析这个图,可以得到两个公式,第一个是速度公式,即每只鸟的当前速度受上一步的速度惯性,自我认知和社会认知三部分影响,第二个是位置公式,即每只鸟的位置受上一位置和上一位置的速度的影响。

nuist_NJUPT的博客 1665

解决tomcat启动Exception creating UserDatabase异常。

    一位同事重新配置一套开发环境时,启动tomcat出现这样一个异常: 2008-6-30 10:24:45 org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans 严重: Exception creating UserDatabase MBeans for UserDatabase java

溪居 3599

Android系统修改驱动固定USB摄像头节点绑定前后置摄像头

Android系统中usb摄像头节点会因为摄像头所接的usb口不同或者usb设备识别顺序不一样而出现每次开机生成的video节点不一样的问题。由于客户app调用摄像头时,需要固定摄像头的节点。因此需要针对前面的情况做处理。

Android系统开发笔记 2250

Android一个APP里面最少有几个线程

Android应用启动时,默认会创建一个进程,该进程中最少包含负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应用无响应)。当对象重写了finalize()方法时,该线程负责将这些对象放入队列并调用其finalize()方法,完成资源释放后再由GC回收。监控的执行效率。如果finalize()方法执行超时(默认10秒),此线程会触发虚拟机退出以防止应用长时间阻塞。

编程进化论 613

Sybase数据库乱码问题

    搭建测试数据库服务器时,遇到了乱码问题,之前没有遇到是因为开发数据库服务器是早就安装好并设置好字符集的,因此些问题在部署测试环境时才出现,当时已经将数据库配置完毕,并且所有的初始化脚本都已经执行完毕,工程也已经成功部署在WebLogic上,打开IE,运行程序,却发现所有从数据库中读取出来的都是乱码,经过上网搜索的相关资料,需要设置字符集,但刚开始查找到的资料基本是都是支言片语,没有一个系统

溪居 2616

javafx结合Scene Builder自定义fxml实现漂亮的登录界面、自定义最小化、关闭按钮

本节主要介绍了如何结合Scene Builder工具来制作一个好看又漂亮的登录界面,以及介绍了如何在程序中调用生成界面文件fxml文件,如何获取到fxml文件中的组件等,并演示登录、最小化和关闭等功能。

c1007857613的专栏 5222

JFreeChart技术总结(一)

 一、简介JFreeChart也许对大家来说很陌生,它是一款开源的、功能强大的统计图生成工具,可以直接生成PNG、JPG等各式的文件为我们java项目的开发增加了一部利器。它实现了动态数据图形的完美结合,它是纯java的一个开发包,jfreechart不仅能够实现饼图,柱状图,堆栈拄状图,线图等常规图形,而且能实现阶梯图,面积图,散列图,蜡烛图形,各种组合图,多坐标图等多种复杂图形,J

溪居 2508

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Tiles技术总结

一、           说明Tiles使得struts在页面的处理方面多了一种选择。并且更容易实现代码的重用。Tiles增加了layout的概念,其实就是把一个页面划分为几块,这有点像柜架,但柜架是不同页面分开控制,如拉动右侧滚动条,上面柜架不动,只有下面柜架页面在动,而tiles是不同页面组合成一个页面统一控制,拉动右侧滚动条时,整个页面都会跟着动。通常的来说一个页面大概可以划分为如下

溪居 1799

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

字符转义技术

    在项目测试阶段,测试人员会输入一些特殊字符,比如:、、&及空格,原因是用java代码直接取的并没有对特殊字符做转义。     因为Html中的,&有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用它们的转义序列。   & 的转义序列为 & amp 或 & #38;      > 的转义序列为 & gt; & #62;  前者为字符转义序列,后者

溪居 1590

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

当SUN的JText遇到微软智能ABC

     Swing开发出来的Application或者Applet,如果包含JText控件,在运行程序时,使用微软的智能ABC输入法在JText控件上连续输入15个字母以上时(注意是随便输入),程序就会崩溃,如果是applet,IE就会崩溃,连进程中的JVM也会被杀死。     后来在网上查了一下,智能ABC还有个极其危险的BUG,就是可以杀死任意进程,在任何程序下(注意是任何程序,甚至在微

溪居 1562

浅淡自学方法

今天终于开了第二次技术会议,组长早就分配下来让,两三个人研究一个方向,我和另外二个小女生,加上我三个小女生一起研究Spring,刚开始的两周,由于我的自学方式有问题,刚开始看Spring的教程,简直太抽象了,就卡到看不懂的地方就进行不下去了,两周后的第一次会议时,让每个人都讲一下自己学习的内容,学习Hibernate的那两个组员先讲,他们每个人都能讲出点东西来,到跟我一起研究的那个小女生讲的时候,

溪居 1115

Sybase12.5.2与12.5.1的不同

    网上已经有好多文章在讲sybase各个版本的不同之处,比如:http://www.pcxy.net/Article/Database/qita/Article_14694.html,我这里就不一一讲了,这里我想说的是我们在实际部署环境时,将原开发环境和现场运行环境都为12.5.2,而要移植到12.5.1集成测试环境中时遇到的问题。    代码及数据库脚本都是一样的,放到集成测试环境中有

溪居 1049

log4j的配置与说明

说明:本文分为三部分,第一部分讲解如何配置log4j,第二部分为对log4j.properties配置文件中的各个属性的讲解,第三部分为对log4j的详细讲解,如果只想配置上log4j,那么只需要看前两个部分就可以,如果想对log4j深入了解,则还需看第三部分。一、Log4j配置第一步:加入log4j-1.2.8.jar到lib下。第二步:在CLASSPATH下建立log4j.prop

溪居 999

同一个applet类在不同浏览器的同步

 如果想要两个窗口内同步显示两支证券,那就得让两个浏览器之间能够通信,或者应该说两个applet之间能够通信,java.applet包的AppletContext类提供了getApplet和getApplets方法以获得其它applet的引用,使用这两个方法,Applet能够寻找到其他的Applet并调用它们的方法。不过这是以满足如下安全条件为前提的:    所有Applet位于同一服

溪居 997

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地

无状态,所以任何实例都能处理任何请求,扩容不再需要粘性会话;显式句柄,所以跨调用状态是可审计、可过期的,而不是藏在进程内存里;幂等重放,所以交互式中断在分布式环境下也可恢复,代价是你要自己保证副作用可对账;头部路由,所以网关能在不解析 body 的前提下做治理,而校验 header/body 一致性成了新的安全底线。这些没有一个是在发明新概念。它们是分布式系统里被验证过二十年的老手艺:无状态、显式上下文、幂等、网关治理、fail-fast、可观测。

qq_36021478的博客 151
上一篇: Spring AOP实际应用一例
下一篇: JFreeChart技术总结(一)
潭溪Debby
博客等级 码龄21年 32粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值