基础知识:
Before是在所拦截方法执行之前执行一段逻辑。
After 是在所拦截方法执行之后执行一段逻辑。
Around是可以同时在所拦截方法的前后执行一段逻辑。
after returning advice 在方法执行后返回一个结果后执行。
after throwing advice 在方法执行过程中抛出异常的时候执行。
下面是实例:
1,一定切面(Aspect)类(用来增强目标函数)
package com.supan.aspect;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class FourAdviceTest {
public void authority(JoinPoint jp){
System.out.println("@Before增强,模拟执行权限检查");
System.out.println("@Before增强,被植入增强处理的目标方法是:" +
jp.getSignature().getName());
System.out.println("@Before增强:目标方法的参数是:"+
Arrays.toString(jp.getArgs()));
}
public void log(JoinPoint jp){
System.out.println("@After增强,写日志");
System.out.println("@After增强,被植入增强处理的目标方法是:" +
jp.getSignature().getName());
System.out.println("@After增强:目标方法的参数是:"+
Arrays.toString(jp.getArgs()));
}
public void processTx(ProceedingJoinPoint jp) throws java.lang.Throwable{
System.out.println("Around增强:执行目标方法之前,模拟开启事务。。。。。。");
//获取执行目标函数的参数
// Object[] args = jp.getArgs();
Object rvt = jp.proceed();
System.out.println("Around增强:目标方法已经执行,模拟结束事务");
}
public void afterReturnning(JoinPoint jp, Object rvt) throws java.lang.Throwable{
System.out.println("AfterReturning增强:获取目标方法返回值:" + rvt);
System.out.println("AfterReturning增强:模拟记录日志功能");
System.out.println("AfterReturning增强:被植入的增强方法为:" + jp.getSignature().getName());
System.out.println("AfterReturning增强:访问目标方法的参数为:" + jp.getArgs());
}
}
2,定义Service类;
package com.supan.service;
public interface PersonService {
public void addPerson();
public int deletePerson();
}
package com.supan.serviceimp;
import com.supan.service.PersonService;
public class PersonServiceImp implements PersonService {
public void addPerson() {
System.out.println("开始添加人员");
System.out.println("添加人员结束");
}
public int deletePerson() {
return 0;
}
}
3,定义Action类
package com.supan.action;
import com.opensymphony.xwork2.ActionSupport;
import com.supan.service.PersonService;
public class PersonAction extends ActionSupport {
private PersonService ps;
private String name;
private int age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public PersonService getPs() {
return ps;
}
public void setPs(PersonService ps) {
this.ps = ps;
}
public String addPerson(){
ps.addPerson();
System.out.println("----------------------");
ps.deletePerson();
return null;
}
}
4,配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="default" namespace="/" extends="json-default">
<action name="addPerson" class="personAction" method="addPerson">
<result name="success">/person/personResult.jsp</result>
</action>
</package>
</struts>
5,配置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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="personAction" class="com.supan.action.PersonAction">
<property name="ps" ref="personService"></property>
</bean>
<bean id="personService" class="com.supan.serviceimp.PersonServiceImp"></bean>
<!--定义一个切面类,该类是pojo的java类,该类中的方法用来增强目标函数 -->
<bean id="fourAdviceBean" class="com.supan.aspect.FourAdviceTest"></bean>
<!-- aop的配置用来进行切面编程 -->
<aop:config>
<!-- 定义aspect切面类 -->
<aop:aspect id="fourAdviceAspect" ref="fourAdviceBean">
<aop:before pointcut="execution(* com.supan.serviceimp.*.add*(..))" method="authority"/>
<aop:after pointcut="execution(* com.supan.serviceimp.*.add*(..))" method="log"/>
<aop:around pointcut="execution(* com.supan.serviceimp.*.add*(..))" method="processTx"/>
<!-- 注意如果目标函数有返回值,则一定要配置returning的参数,否则会报错 -->
<aop:after-returning pointcut="execution(* com.supan.serviceimp.*.delete*(..))" returning="rvt" method="afterReturnning"/>
</aop:aspect>
</aop:config>
</beans>
6,请求的jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="addPerson">
<s:textfield label="姓名" name="name"></s:textfield>
<s:textfield label="年龄" name="age"></s:textfield>
<s:textfield label="地址" name="address"></s:textfield>
<s:submit name="添加"></s:submit>
</s:form>
</body>
</html>
7,点击submit后的后台输出:
@Before增强,模拟执行权限检查
@Before增强,被植入增强处理的目标方法是:addPerson
@Before增强:目标方法的参数是:[]
Around增强:执行目标方法之前,模拟开启事务。。。。。。
开始添加人员
添加人员结束
@After增强,写日志
@After增强,被植入增强处理的目标方法是:addPerson
@After增强:目标方法的参数是:[]
Around增强:目标方法已经执行,模拟结束事务
----------------------
AfterReturning增强:获取目标方法返回值:0
AfterReturning增强:模拟记录日志功能
AfterReturning增强:被植入的增强方法为:deletePerson
AfterReturning增强:访问目标方法的参数为:[Ljava.lang.Object;@153d14f
分享到:
相关推荐
**Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...
### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
**Spring AOP XML配置**是Spring框架中一种重要的面向切面编程(Aspect-Oriented Programming,简称AOP)实现方式,允许开发者定义“横切关注点”,如日志、事务管理等,这些关注点可以独立于业务代码进行,提高代码...
Spring AOP主要通过两种方式实现:XML配置和注解。本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时...
在"Spring AOP管理XML版"中,我们主要关注的是通过XML配置来管理AOP。以下是一些关键的XML配置元素: - `<aop:config>`:这是AOP配置的根元素,包含所有其他的AOP配置。 - `<aop:aspect>`:定义一个切面,内部可以...
在Spring的XML配置文件中,我们可以创建一个`<aop:config>`元素,并在其内部定义`<aop:advisor>`来创建Advisor。Advisor的`advice-ref`属性用于指定通知bean的ID,`pointcut-ref`属性用于指定切点bean的ID。 2. ...
本篇文章主要讲解如何通过XML配置来实现Spring AOP的开发。 首先,了解AOP的基本概念。AOP通过“切面”(Aspect)来封装横切关注点,切面由“通知”(Advice)和“连接点”(Join Point)组成。通知是在特定连接点...
在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...
在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
Spring AOP通过XML配置文件提供了灵活的方式来定义和管理切面、切入点和通知,使得我们可以轻松地在应用程序中实现横切关注点的解耦。了解和掌握Spring AOP的配置实现,有助于提升我们构建松散耦合、易于维护的系统...
XML配置是Spring AOP早期常用的一种配置方式,虽然在Spring 4.3之后推荐使用注解式AOP,但理解XML配置对于深入学习AOP仍然很有帮助。下面我们将详细讨论如何通过XML配置实现Spring AOP。 首先,我们需要在Spring...
在基于XML的配置方式下,我们将通过这些概念来理解Spring 2.0的AOP实现。 1. **切面(Aspect)**:一个关注点的模块化,例如日志记录、事务管理等。在Spring中,切面可以由一个或多个通知以及定义它们何时何地触发...
本篇文章将重点讲解如何通过XML配置方式在Spring中实现AOP。 首先,了解AOP的基本概念是必要的。AOP的核心是切面(Aspect),它封装了多个相关操作,形成了一个关注点。切点(Pointcut)定义了这些操作应用到何处,...
### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...
**Spring.NET AOP 通过配置文件配置** Spring.NET 是一个开源的 .NET 框架,它提供了依赖注入(DI)和面向切面编程(AOP)的能力。在本篇内容中,我们将深入探讨如何使用配置文件来设置 Spring.NET 的 AOP 功能。 ...
Spring 2.5 AOP(面向切面编程)...综上所述,Spring 2.5 AOP例子展示了如何利用类扫描和XML配置实现面向切面编程。通过理解这些概念和实践,我们可以更高效地管理和维护我们的应用程序,使其更具可扩展性和可维护性。
在Spring框架中,注解和XML配置是两种主要的方式来实现面向切面编程(Aspect-Oriented Programming,简称AOP)。AOP是一种编程范式,它允许程序员定义“切面”,这些切面封装了关注点,如日志、事务管理、性能监控等...
Spring的XML配置文件(如applicationContext.xml)用于声明bean及其依赖。通过@Autowired注解或XML配置,Spring可以自动装配bean,实现依赖注入。同时,Spring还提供了AOP(面向切面编程)支持,用于添加如日志、...
首先,我们需要引入Spring AOP和AspectJ的依赖,这通常在pom.xml或build.gradle文件中完成。然后,我们可以定义一个切面(Aspect),它包含通知(Advice)——即在特定连接点执行的代码。通知可以是前置通知(Before...