Spring4-AOP通知

1.创建Maven项目,项目名称springdemo50,如图所示

2.配置Maven,修改项目中的pom.xml文件,修改内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>1.0.0</modelVersion>
  <groupId>shequ</groupId>
  <artifactId>springdemo13</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>
  	<java.version>1.7</java.version>
  	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  
  <repositories>
  	<repository>
  		<id>codelds</id>
  		<url>https://code.lds.org/nexus/content/groups/main-repo</url>
  	</repository>
  </repositories>
  
  <dependencies>
  	<dependency>
  		<groupId>javax.annotation</groupId>
  		<artifactId>jsr250-api</artifactId>
  		<version>1.0</version>
  	</dependency>
  
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-test</artifactId>
  		<version>4.1.4.RELEASE</version>
  	</dependency>
  
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.10</version>
  	</dependency>
  
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>4.1.4.RELEASE</version>
  	</dependency>
  
  	<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.1.4.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.1.4.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>
       
  </dependencies>
  <build/>
</project>

3.在src/main/java下创建实体Bean Customer,包名(com.mycompany.shequ.bean)如图所示

4.实体Bean Customer的内容如下

package com.mycompany.shequ.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("customerBean")
public class Customer {
	private String name;
	private String email;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}

	@Value("#{(‘[email protected]‘ matches ‘^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)" +
	"*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$‘) ? ‘[email protected]‘:‘不合法‘}")
	public void setEmail(String email) {
		this.email = email;
	}
}

5.在src/main/java下创建接口ICustomerDao,包名(com.mycompany.shequ.dao)如图所示

6.ICustomerDao的内容如下

package com.mycompany.shequ.dao;

public interface ICustomerDao {
	public void showMe();
}

7.在src/main/java下创建ICustomerDao的实现类CustomerDaoImpl,包名

8.ICustomerDao的实现类CustomerDaoImpl的内容如下

package com.mycompany.shequ.dao.impl;

import com.mycompany.shequ.dao.ICustomerDao;

public class CustomerDaoImpl implements ICustomerDao {

	public void showMe() {
		System.out.println("I‘m CustomerDaoImpl");
	}

}

9.在src/main/java下创建业务Bean ICustomerService接口,包名(com.mycompany.shequ.service)如图所示

10.ICustomerService接口的内容如下

package com.mycompany.shequ.service;

public interface ICustomerService {
	public void showMe();
}

11.在src/main/java下创建业务Bean ICustomerService接口的实现类CustomerServiceImpl,包名(com.mycompany.shequ.service.impl)如图所示

12.业务Bean ICustomerService接口的实现类CustomerServiceImpl的内容如下

package com.mycompany.shequ.service.impl;

import com.mycompany.shequ.dao.ICustomerDao;
import com.mycompany.shequ.service.ICustomerService;

public class CustomerServiceImpl implements ICustomerService {

	private ICustomerDao customerDao;

	public ICustomerDao getCustomerDao() {
		return customerDao;
	}

	public void setCustomerDao(ICustomerDao customerDao) {
		this.customerDao = customerDao;
	}

	public void showMe() {
		customerDao.showMe();
	}

}

13.在src/main/java下创建前置通知实现类MethodBefore,包名(com.mycompany.shequ.service.impl)如图所示

14.前置通知实现类MethodBefore的内容如下

package com.mycompany.shequ.service.impl;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

/**
 * 方法执行前通知
 * @author Administrator
 *
 */
public class MethodBefore implements MethodBeforeAdvice {

	public void before(Method arg0, Object[] arg1, Object arg2)
			throws Throwable {
		System.out.println("前置通知被执行");
	}

}

15.在src/main/java下创建后置通知实现类MethodAfter,包名(com.mycompany.shequ.service.impl)如图所示

16.后置通知实现类MethodAfter的内容如下

package com.mycompany.shequ.service.impl;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**
 * 方法执行完成后通知
 * @author Administrator
 *
 */
public class MethodAfter implements AfterReturningAdvice {

	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
			Object arg3) throws Throwable {
		System.out.println("后置通知被执行");
	}

}

17.在src/main/java下创建异常通知实现类ThrowException,包名(com.mycompany.shequ.service.impl)如图所示

18.异常通知实现类ThrowException的内容如下

package com.mycompany.shequ.service.impl;

import org.springframework.aop.ThrowsAdvice;

/**
 * 抛出异常后通知
 * @author Administrator
 *
 */
public class ThrowException implements ThrowsAdvice {
	public void afterThrowing(IllegalArgumentException e) throws Throwable{
		System.out.println("异常通知被执行");
	}
}

19.在src/main/java下创建环绕通知实现类AroundMethod,包名(com.mycompany.shequ.service.impl)如图所示

20.环绕通知实现类AroundMethod的内容如下

package com.mycompany.shequ.service.impl;

import java.util.Arrays;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 环绕通知
 * @author Administrator
 *
 */
public class AroundMethod implements MethodInterceptor {

	public Object invoke(MethodInvocation method) throws Throwable {
		System.out.println("环绕通知被执行");
		System.out.println("方法名称:"+method.getMethod().getName());
		System.out.println("方法参数:"+Arrays.toString(method.getArguments()));
		Object result = method.proceed();
		return result;
	}

}

21.在src/main/resource下创建核心的配置文件applicationContext.xml,如图所示

22.配置文件applicationContext.xml,如图所示

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-4.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- customer dao Bean -->
	<bean id="customerDao" class="com.mycompany.shequ.dao.impl.CustomerDaoImpl"></bean>

	<!-- customer 业务层 Bean -->
	<bean id="customerService" class="com.mycompany.shequ.service.impl.CustomerServiceImpl">
		<property name="customerDao" ref="customerDao"></property>
	</bean>

	<!-- 方法执行前通知 -->
	<bean id="methodBeforeBean" class="com.mycompany.shequ.service.impl.MethodBefore"></bean>

	<!-- 方法执行完成后通知 -->
	<bean id="methodAfterBean" class="com.mycompany.shequ.service.impl.MethodAfter"></bean>

	<!-- 抛出异常后通知 -->
	<bean id="throwExceptionBean" class="com.mycompany.shequ.service.impl.ThrowException"></bean>

	<!-- 环绕通知 -->
	<bean id="aroundMethodBean" class="com.mycompany.shequ.service.impl.AroundMethod"></bean>

	<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="customerService"></property>
		<property name="interceptorNames">
			<list>
				<!-- methodBeforeBean是前置通知Bean的名称 -->
				<value>methodBeforeBean</value>

				<!-- methodAfterBean是后置通知Bean的名称 -->
				<value>methodAfterBean</value>

				<!-- throwExceptionBean是异常通知Bean的名称 -->
				<value>throwExceptionBean</value>

				<!-- aroundMethodBean是环绕通知Bean的名称 -->
				<value>aroundMethodBean</value>
			</list>
		</property>
	</bean>

</beans>

23.在src/test/java下创建测试文件AppTest,包名(com.mycompany.shequ.test)如图所示

24.测试文件AppTest的内容如下

package com.mycompany.shequ.test;

import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mycompany.shequ.service.ICustomerService;

public class AppTest {

	@Test
	public void beanTest(){
	    ConfigurableApplicationContext context = new 
	    ClassPathXmlApplicationContext("applicationContext.xml");
		ICustomerService customerService = (ICustomerService) 
		context.getBean("customerServiceProxy");
		customerService.showMe();
	}
}

25.在测试类AppTest的beanTest方法上右键运行,输出结果如图所示

时间: 2024-11-05 12:32:57

Spring4-AOP通知的相关文章

spring4 aop annotation

package com.zrd.aop.annotation; /** * 第一步:定义一个接口 * * @author ZRD * */ public interface IMyService { int add(int i, int j); } package com.zrd.aop.annotation; import org.springframework.stereotype.Component; /** * 第二步:定义接口的实现类 * * @author ZRD * */ @Com

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

Spring AOP通知实例 – Advice

Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能. 在Spring AOP中,有 4 种类型通知(advices)的支持: 通知(Advice)之前 - 该方法执行前运行 通知(Advice)返回之后 – 运行后,该方法返回一个结果 通知(Advice)抛出之后 – 运行方法抛出异常后, 环绕通知 – 环绕方法执行运行,结合以上这三

关于Spring Aop 通知类型

1. 前置通知 * 在目标类的方法执行之前执行. * 配置文件信息:<aop:after method="before" pointcut-ref="myPointcut3"/> * 应用:可以对方法的参数来做校验 2. 最终通知 * 在目标类的方法执行之后执行,如果程序出现了异常,最终通知也会执行. * 在配置文件中编写具体的配置:<aop:after method="after" pointcut-ref="myP

Spring AOP 通知顺序

如果有多个通知在同一连接点执行,那执行顺序如何确定呢? 总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. 1.同一切面中通知执行顺序 1)前置通知/环绕通知proceed方法之前部分 2)被通知方法 3)后置通知/环绕通知proceed方法之后部分 annotation方式的顺序:环绕通知proceed方法之前部分---->前置通知---->被通知方法---->后置通知---->环绕通知proceed方法之后部分(多次测试结果显示如此,不知道具体原因) XML配置

spring学习 注解AOP 通知传递参数

我们在对切点进行增强时,不建议对切点进行任何修改,因此不加以使用@PointCut注解打在切点上,尽量只在Advice上打注解(Before,After等),如果要在通知中接受切点的参数,可以使用JoinPoint或者ProceedingJoinPoint 在Spring AOP中可以通过两种方式传递参数给Advice(通知) (1)通过接受JoinPoint(非环绕通知)或ProceedingJoinPoint(环绕通知)参数,其实ProceedingJoinPoint是JointPoint的

浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring框架的,这就说明你有权选择是否要用AOP来完成一些业务. AOP面向切面编程,通过另一种思考的方式,来弥补面向对象编程OOP当中的不足,OOP当中最重要的单元是类,所以万物皆对象,万物皆是 对象类.而在AOP的模块单元中,最基础的单元是切面,切面对切点进行模块化的管理. 最后再提一句:Spring当

Spring AOP 之 通知、连接点、切点、切面。

1:知识背景 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 2:面向切面的基本原理 什么是面向切面编程 横切关注点:影响应用多处的功能(安全.事务.日志) 切面: 横切关注点被模块化为特殊的类,这些类称为切面 优点: 每个关注点现在都集中于一处,而不是分散到多处代码中 服务模块更简洁,服务模块只需关注核心代码. AOP 术语 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了

Spring 2.0 的AOP介绍及其通知类型

Spring 2.0的AOP 在Spring 2.0中最激动人心的增强之一是关于Spring AOP,它变得更加便于使用而且更加强大,主要是通过复杂而成熟的AspectJ语言的支持功能来实现,而同时保留纯的基于代理的Java运行时.Spring 2.0的AOP提供给我们一种新的思考程序结构的方法,能够解决很多纯OOP无法解决的问题--让我们能够在一个模块中实现某些需求,而不是以发散的方式实现.Spring 2.0允许用户选择使用基于模式或@AspectJ注解的方式来自定义切面.这两种风格都支持所

Spring学习笔记四(AOP中的通知参数和注解开发)

1.前言 上一篇博客介绍了如何通过AOP来切入我们想实现的公共性的功能,这篇博客来讲一下,当我们拦截到方法后,如何来获取通知参数.这也是AOP的精髓所在,通过AOP可以实现偷梁换柱的功能.我们把原来要执行的方法的参数获取到,然后换一套参数执行.下面来跟着我看一下吧! 2.AOP的通知参数 有时我们想通过AOP拦截到我们要加入通知的切点类的参数,通俗的说就像拿到拦截的方法的参数值,然后如果不合适的话,我们可以修改一下或者做一些其他的操作.例如用户登录的功能,我们可以把验证身份的功能抽离出来,然后在