5.增强(xml配置方式)

SpringAOP的5种增强类型应用讲解 SpringAOP的5种增强类型应用讲解 一.前言 spring框架中为我们提供的增强包括针对切面的增强和针对切入点的增强,对一个方法的增强底层使用的是动态代理,所以在学习springAop增强之前大家有必要先了解一下动态代理相关内容; 本文分别采用继承接口和使用配置文件来实现增强。 二.springAOP自带的增强类型 按照增强在目标类方法中的连接点位置,可以分为5种: 1.前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只持方法的增强 阅读详情

一.配置文件方式

1.UserServiceImpl.java

package cn.qf.spring.service.impl;

import cn.qf.spring.dao.impl.UserDaoImpl;
import cn.qf.spring.pojo.User;
import cn.qf.spring.service.UserService;

public class UserServiceImpl implements UserService{
	//注入方式2:构造注入,通过构造方法给属性赋值
	public UserServiceImpl() {}
	public UserServiceImpl(UserDaoImpl udi) {
		this.udi = udi;
	}
	
	//注入方式1:设值注入
	private UserDaoImpl udi;
	public UserDaoImpl getUdi() {
		return udi;
	}
	public void setUdi(UserDaoImpl udi) {
		this.udi = udi;
	}
	
	//对应cn.qf.spring.dao.impl中的addUser(User user)方法
	public void addUser(User user) {
		//事物处理
		//异常处理
		//记录日志
		//只完成核心功能代码
		this.udi.addUser(user);
	}
	
}

2.AddUserServlet.java

package cn.qf.spring.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.qf.spring.pojo.User;
import cn.qf.spring.service.UserService;

/**
 * Servlet implementation class AddUserServlet
 */
public class AddUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddUserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		User user = new User();
		user.setUserCode(request.getParameter("uc"));
		user.setUserName(request.getParameter("un"));
		user.setPassword(request.getParameter("up"));
		//获取UserServiceImpl类的对象
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService us = (UserService)ac.getBean("UserService");
		us.addUser(user);
		PrintWriter pw = response.getWriter();
		pw.print("success");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

3.前置和后置增强
OperLog.java

package cn.qf.spring.aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;

public class OperLog {
	//记录日志的方法
	public static final Logger logger=Logger.getLogger(OperLog.class);
	
	//前置增强方法:在执行核心功能之前调用的方法
	//记录日志
	//JoinPoint 是springAOP里的对象:连接点对象
	//作用:把spring的代理对象所执行的核心方法信息都封装在此对象中:方法名,返回值,参数列表
	//jp.getTarget()  获取核心方法所在的类
	//jp.getSignature() 核心方法的名字
	//jp.getArgs() 获取核心方法的参数列表,是数组
	public void beforeLog(JoinPoint jp) {
		logger.debug("执行了"+jp.getTarget()+"类里的"+jp.getSignature()
		+"方法"+",方法的参数列表为:"+Arrays.toString(jp.getArgs()));
	}
	
	//后置增强方法:在执行核心功能之后调用的方法
	//参数1:连接点对象,封装了核心方法的信息
	//参数2:方法的执行结果,代理对象会自动传递实参给此方法
	public void afterLog(JoinPoint jp,Object result) {
		logger.debug(jp.getTarget()+"类中的"+jp.getSignature()+"方法执行结束,方法的返回值:"
				+result);
	}
}

4.==异常处理增强和最终增强
ExceptionLog.java

package cn.qf.spring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;

public class ExceptionLog {
	private static final Logger logger = Logger.getLogger(ExceptionLog.class);
	
	//异常处理增强:当核心方法发生异常后,执行的通用功能
	public void catchException(JoinPoint jp,RuntimeException ex) {
		logger.error(jp.getTarget()+"类里的"+jp.getSignature()+"方法发生异常,异常信息如下:"
				+ ex.getMessage());
	}
	
	//最终增强:当执行核心方法的finally语句块时,执行的通用功能
	public void runFinally(JoinPoint jp) {
		logger.debug(jp.getTarget()+"类里的"+jp.getSignature()+"方法执行结束");
	}
}

5.环绕增强方式(相当于以上几种增强的集合)
Arround.java

package cn.qf.spring.aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

public class Arround {
	private static final Logger logger = Logger.getLogger(Arround.class);
	//环绕增强,只有一个方法就行
	public Object arroundLogger(ProceedingJoinPoint jp) {
		//声明变量存放目标方法的返回值
		Object result = null;
		//1.相当于前置增强的方法
		logger.debug("环绕增强--执行了:"+jp.getTarget()+"对象里的:"+jp.getSignature()+"方法,"
				+"方法的参数是:"+Arrays.toString(jp.getArgs()));
		//相当于异常处理增强和最终增强
		try {
			//调用目标对象的方法,proceed()是代理方法
			result = jp.proceed();
			
		}  catch (Throwable e) {
			//2.异常处理增强
			logger.error("环绕增强--执行"+jp.getSignature()+"方法发生异常:异常信息如下:"+e.getMessage());
			e.printStackTrace();
		} finally {
			//3.相当于最终增强
			logger.debug("环绕增强--执行"+jp.getSignature()+"方法结束");
		}
		//4.相当于后置增强
		logger.debug("环绕增强--执行了后置增强方法");
		return result;
	}
}

6.applicationContext.xml

<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
	
	<!-- 配置UserDaoImpl类的对象 -->
	<bean id="dao" class="cn.qf.spring.dao.impl.UserDaoImpl"></bean>
	
	<!-- 配置UserServiceImpl类的对象 -->
	<bean id="UserService" class="cn.qf.spring.service.impl.UserServiceImpl">
		<!-- 1.设值注入 -->
		<!--
		<property name="udi" ref="dao"></property>
		-->
		
		<!-- 2.构造注入 -->
		<constructor-arg>
			<ref bean="dao"/>
		</constructor-arg>
	</bean>
	
	<!-- 一.配置增强方法类的对象 -->
	<bean id="theLog" class="cn.qf.spring.aop.OperLog"></bean>
	<bean id="theException" class="cn.qf.spring.aop.ExceptionLog"></bean>
	<bean id="theArround" class="cn.qf.spring.aop.Arround"></bean>
	<!-- 进行aop的配置 -->
	<aop:config>
		<!-- 二.配置切入点(执行的核心方法)
			有两种配置方式:
			1.明确核心方法的名字
			2.通过通用表达式来配置核心方法:代表一类方法
		 -->
		 <aop:pointcut expression="execution(public void addUser(cn.qf.spring.pojo.User))" 
		 			   id="addUserPoint"/>
		 		   
		 <!-- 在切面中配置增强方法   切面:所有增强方法的集合 -->
		 <aop:aspect ref="theLog">
		 	<!-- 在切面中指定哪种增强:前置,后置,异常处理,最终 -->
		 	<!-- aop:before  前置增强 -->
		 	<aop:before method="beforeLog" pointcut-ref="addUserPoint"/>
		 	<!-- aop:after-returning 后置增强 -->
		 	<aop:after-returning method="afterLog" pointcut-ref="addUserPoint" returning="result"/>
		 </aop:aspect>
		 
		 <!-- 在切面中配置异常处理增强,最终增强 -->
		 <aop:aspect ref="theException">
		 	<!-- 异常处理增强 -->
		 	<aop:after-throwing method="catchException" pointcut-ref="addUserPoint" throwing="ex"/>
		 	<!-- 最终增强 -->
		 	<aop:after method="runFinally" pointcut-ref="addUserPoint"/>
		 </aop:aspect>
		 
		 
		 <!-- 三.配置环绕增强 -->
		 <aop:aspect ref="theArround">
		 	<aop:around method="arroundLogger" pointcut-ref="addUserPoint"></aop:around>
		 </aop:aspect>
	</aop:config>
	
</beans>
SpringBoot实战教程-回顾Spring的Java配置方式 纯Java代码配置方式是Spring4.x推荐的配置方式,可以完全替代xml配置。因此注解式开发不是SpringBoot才有的,而是早已有之,只是SpringBoot带动了全注解式开发浪潮。本节追本溯源,温习一下Spring的Java配置方式。下一节正式进入SpringBoot实战技术讲解。 阅读详情

相关推荐

MyBatis 3.5.6框架详解与实践

MyBatis是Java开发中广泛使用的持久层框架,它简化了数据库编程,通过映射文件将Java对象和SQL语句进行关联。MyBatis在内部处理了JDBC编程的复杂性,同时提供接口调用方式,使得操作数据库更为直观和灵活。本章对MyBatis 3.5.6版本的新特性、性能优化和Bug修复进行了全面的介绍。通过本章的内容,读者应该能够了解升级到新版本的必要性及其带来的好处,以及如何安全地进行升级。在下一章节中,我们将深入探讨MyBatis的配置方法,包括XML配置和注解配置的详细内容和对比。

weixin_35294091的博客 1277

Spring-AOP 通过配置文件实现 环绕增强

概述 实例概述环绕增强允许在目标类方法调用前后织入横切逻辑,它综合实现了前置,后置增强两者的功能.实例下面是我们用环绕增强同时实现上面的我们的示例。步骤如下: 创建业务接口类:Waiter.java 创建业务实现类:NativeWaiter.java 创建业务增强类:GreetingInterceptor.java 创建配置文件:conf-advice.xml 创建增强测试类:Method

小工匠 2万+

Unity VR射击水果游戏开发全流程:从手柄交互到打包发布

VR开发中,手柄输入映射与物理碰撞检测是构建沉浸式交互的基础。通过射线发射与连续碰撞检测,可实现精准的射击命中反馈;结合对象池技术,能有效避免频繁实例化导致的GC卡顿,保障90fps流畅体验。这些技术广泛应用于VR游戏、模拟训练等场景。本文以Unity VR射击水果项目为例,详解XR Interaction Toolkit配置、URP渲染管线选型、子弹穿透与手柄输入等常见问题的解决方案,助你快速完成从场景搭建到exe打包的完整闭环。

weixin_34133829的博客 351

Spring基于XML文件配置AOP

一、概述 除了使用AspectJ声明切面,Spring也支持通过Bean配置文件中声明切面。 基于注解声明切面,通过AspecJ注解,切面可以与AspectJ兼容,而基于XML文件的配置是Spring专有的,所以通常基于注解的方式要优于基于XML文件方式。 二、基于XML方声明切面 导入aop命名空间。 在Bean的配置文件中,配置切面的Bean,必须要有id属性,供&amp;amp;lt;aop:a...

halftwo的博客 845

Spring5框架学习笔记

Spring 5是Java开发的一个轻量级的应用程序框架,用于构建企业级Java应用程序。

weixin_62400598的博客 122

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec参数(附完整调试过程)

本文详细解析了Shopee商品详情页反爬机制中的x-sap-Ri和x-sap-Sec参数逆向过程。通过JS逆向技术,从环境数据采集到多层哈希运算,完整拆解了这两个关键参数的生成逻辑,并提供了实战技巧和Node.js实现方案,帮助开发者应对Shopee的动态加密挑战。

weixin_33701251的博客 1596

Spring学习之Aop的各种增强方法

  AspectJ允许使用注解用于定义切面、切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理。Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的编译器或者织入器,底层依然使用SpringAOP来实现,依然是在运行时动态生成AOP代理,因此不需要增加额外的编译,也不需要AspectJ的织入器支持。而AspectJ采用编译时增强,所以Aspe...

weixin_30848775的博客 176

激光甲烷传感器DIY指南:从DFB激光器选型到Herriott池光路搭建

本文详细介绍了如何DIY激光甲烷传感器,从DFB激光器选型到Herriott池光路搭建的全过程。通过TDLAS技术实现ppm级甲烷检测,适用于家用燃气泄漏监测和农业沼气监测等场景。文章包含核心器件选型、光路搭建技巧、信号调理方案及系统集成优化,为创客提供实用指南。

f9g0h的博客 594

spring24:Aspectj实现最终通知@After

package com.atChina.Test5; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning...

m0_37564426的博客 449

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3991

从VBA到Python:探索CODE V API在MTF数据分析中的跨语言实践

本文详细介绍了如何从VBA转向Python,利用CODE V API实现MTF数据分析的高效工作流。通过Python的科学计算库和现代API设计,光学工程师可以大幅提升数据处理和可视化效率,实现自动化报告生成和性能优化。

weixin_29239661的博客 441

Spring XML配置Bean标签详解

前段时间回顾Spring的一些技术和信息,自己去试着配置框架进行练习,这里就分享一下Spring bean配置的各种标签方便自己去配置信息, Spring官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/#mvc-controller 比较好的xml配置文档:http://book.51cto....

码小呆的博客 2万+

【UML】-- 期末试题题库含答案(各章题目、选择题、填空题、简答题、画图题)

每章都有对应的题目和答案,选择题,填空简答,大题,答案已标红,方便大家观看

个人博客 1万+

Spring基于Schema配置切面的例子

       如果项目不能使用JDK1.5以上,无法使用@AspectJ进行注解,Spring提供了基于Schema配置的方法,代替基于@AspectJ注解要面的方式。   1.XML配置   使用&lt;aop:advisor&gt;或&lt;aop:aspect&gt;进行配置 &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;...

iteye_17677的博客 200

机器视觉工程师如何进行高速运动物体捕获

硬件方面使用高帧率相机(如工业相机、高速摄像机)确保充足的光照条件使用高性能计算平台减少处理延迟软件方面背景减除技术快速分离运动物体卡尔曼滤波预测物体轨迹ROI技术减少计算量多线程处理提高实时性实际应用中的关键考量针对特定场景调整参数(如阈值、滤波器参数等)平衡计算资源与实时性要求结合特定领域知识优化算法(如物体运动特性)上述示例代码实现了一个基础的高速物体跟踪系统,通过背景减除和卡尔曼滤波实现对高速物体的检测和跟踪。

zhangzhechun_02的博客 625

谁还攥着旧的类加载器:Metaspace OOM 的元数据记账、类卸载条件与泄漏定位解析

MetaSpace区是JVM内存管理中的关键部分,负责存储类元数据。随着Java 8的推出,MetaSpace取代了PermGen区,但其灵活性也带来了新的挑战,尤其是在动态类加载和频繁类更新的场景下,容易导致MetaSpace内存溢出(OOM)问题。本文探讨了MetaSpace OOM的根本原因,包括类加载器泄漏、内存管理不当和GC效率低下等,并提供了一系列调优策略和解决方案,帮助开发者有效排查和防止此类问题的发生,确保应用程序的稳定性和高可用性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

注解与XML

只是在Spring早期的1.x版本中,由于当时的JDK并不能支持注解,因此只能使用XML。而很快随着JDK升级到JDK5,它加入了注解的新特性,这样注解就被广泛地使用起来,于是Spring的内部也分为了两派,一派是使用XML的赞同派,一派是使用注解的赞同派。为了简化开发,在Spring 2.x之后的版本也引入了注解,不过只是少量的注解,如@Component、@Service等,但是功能还不够强大,因此对于Spring的开发,绝大部分的情况下还是以使用XML为主,注解为辅。 到了Spring 3.0后,引入

鸭梨的博客 294

社会网络仿真软件:NetLogo_(14).社会网络数据导入与导出

在NetLogo中,社会网络的仿真不仅依赖于模型的内部逻辑,还需要能够灵活地导入和导出数据。这使得用户可以利用外部数据来初始化模型,或者将模型的运行结果导出以便进一步分析。本节将详细介绍如何在NetLogo中实现社会网络数据的导入和导出,包括常见的数据格式和具体的代码示例。

kkchenjj的博客 600

一文讲清楚SpringBoot六种读取配置方式

本文梳理了SpringBoot六种读取配置方式,大家在项目中可以进行灵活组合和应用,希望本文对大家有所帮助。

lt_xiaodou的博客 184

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

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深入分析JavaWeb Item54 -- Spring中的AOP面向切面编程2_在@aspectj风格的aop中,下列哪项正确地声明了一个切入点,以将通知应用到名为c

AfterReturning:目标方法为:com.abc.service.AdviceManager.manyAdvices。@Before:被织入的目标对象为:com.abc.service.AdviceManager@1dfc617e。@Before:目标方法为:com.abc.service.AdviceManager.manyAdvices。@After:目标方法为:com.abc.service.AdviceManager.manyAdvices。

2401_87613110的博客 946

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Spring】Spring 3.x企业应用开发实战(12)----基于Schema配置切面

基于Schema配置切面   如果项目不能使用JDK 5.0,那么就无法使用基于@AspectJ注解的切面了。 一个简单的切面配置   &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!-- 引用Spring的多个Schema空间的格式 --&gt; &lt;beans xmlns="http://www.springframewo...

李查德的专栏 1967

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

使用 MyBatis 原生功能——注解、分页

我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能。

weixin_54371142的博客 1751

MyBatis 创建查询,分页,登录功能

我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能。

m0_73704714的博客 1234

使用 MyBatis 原生功能

我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能。

2301_80449758的博客 1799

J2EE架构与程序设计---实验报告2

XML 分页是 MyBatis-Flex 在 v1.5.5 开始提供的一个 XML 分页解决方案,方便用户在使用 XML 时,对数据进行分页查询。我们使用 MyBatis-Flex 作为 MyBatis 的增强框架进行代码开发,并不会影响原有的 MyBatis 的任何功能。等注解也是一样的,也就是说,原有的 MyBatis 功能如何使用,在 MyBatis-Flex 就如何使用。在开始使用 xml 之前,我们需要添加如下配置,告知 mybatis 的 xml 存放路径。MyBatis 提供了。

2402_84866223的博客 1306

Spring 2.5:Spring MVC中的新特性

数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目中(例如CXF)。 Spring 2.5推出了一整套注解,作为基于XML的配置的替换方案。注解可用于Spring管理对象的自动发现、依赖注入、生命周期方法、Web层配置和单元/集成测试。 探索Spring 2.5中引入的注解技术系列文章由三部分组成,本文是其中的第

Java 是用来喝的 108
上一篇: 4.面向切面编程AOP(简化面向对象编程)
下一篇: 6.AOP+IoC/DI(注解方式)---简单
cuichen97
博客等级 码龄7年 34粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值