`

Spring AOP 注解实现

 
阅读更多
使用aspectj注解实现的AOP需要引入aspectj的lib
<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.8.0</version>
		</dependency>
	    <dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.0</version>
		</dependency>


1. 首先启用 Spring 对 @AspectJ 切面配置的支持
<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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">

	<!-- scan all beans and inject dependence -->
	<context:component-scan base-package="com.myproject"/>
	<aop:aspectj-autoproxy/>
</beans>





2.定义切面 Bean
@Component
@Aspect 
public class LogInterceptor {

	@Pointcut("execution (!void com.myproject.example.service..*(..))")  
	private void anyUnvoid(){}  
	
	@Pointcut("within(com.myproject.example.service..*)")  
	private void anyService(){}  
	
	@Pointcut("anyUnvoid() && anyService()")  
	private void anyUnvoidService(){}  
	
	@Before("anyUnvoidService() && args(username, password)")
	public void doBefore(String username, String password){
		System.out.println("doBefore: "+username);
	} 
	
	/**
	 * 第二种访问目标参数的方法。<br>
	 * 将第一个参数定义为 JoinPoint 类型,当该增强处理方法被调用时,
	 * 该 JoinPoint 参数就代表了织入增强处理的连接点。
	 */
	@Before("anyUnvoidService()")
	public void doBefore2(JoinPoint jp){
		Object[] args = jp.getArgs();
		System.out.println("doBefore2: " +args[0]);
	} 
	
	@AfterReturning(pointcut="anyUnvoidService()", returning="result")
	public void doAfterRunning(String result){
		System.out.println("doAfterReturning:" +result);
	}

	@AfterReturning(pointcut="execution(* com.myproject.example.service.AccountService.Login(..))", returning="result")	
public void doAfterLogin(JoinPoint jp, Account result){
		if(result!=null)
			System.out.println(result.getUsername() +" login success.");
		else
			System.out.println(jp.getArgs()[0] +" login fail.");
	}
	
	@AfterThrowing(pointcut="anyUnvoidService()", throwing="ex")
	public void doAfterThrowing(Throwable ex){
		System.out.print("doAfterThrowing: "+ex.getMessage());
	}
	  
	@After("anyUnvoidService()")  
	public void doAfter(){  
		System.out.println("doAfter");
	}  
	
	/**
	 * Around 增强处理可替代所有其它增强处理。
	 * 它可改变执行目标方法的参数值,也可改变目标方法之后的返回值。 
	 */
	@Around("anyUnvoidService()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
		Object[] args = pjp.getArgs(); //obtain arguements
		System.out.println("enter method: "+args[0]);
		Object result = pjp.proceed();
		System.out.println("exit method");
		return result;
	}

}



3. 目标Bean
@Service
public class AccountService {
	
	@Resource
	private AccountDao accountDao;
	
	public Account Login(String username, String password){
		System.out.println(username + " want  to login.");
		return null;
	}
	

}



4 测试
	@Test
	public void test(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
		AccountService accountService =(AccountService)ac.getBean("accountService");
		accountService.Login("Peter", "wetwe");
	}




测试结果:
enter method: Peter
doBefore: Peter
doBefore2: Peter
Peter want  to login.
exit method
doAfter
doAfterReturning:null
分享到:
评论

相关推荐

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    spring AOP注解的应用1

    在Spring框架中,AOP(面向切面编程)是一...Spring AOP注解的应用使得切面编程更加简单直观,大大简化了对横切关注点的管理。在实际开发中,结合Spring提供的其他特性,如事务管理,可以构建出高效、健壮的后端系统。

    spring aop 注解例子

    本例子就是一个使用 Spring AOP 注解实现的项目,旨在展示如何在简单的环境中应用这一特性。 1. **AOP 基础概念** - **切面(Aspect)**: 包含一组相关功能的模块,这些功能在多个对象中都可能被用到,比如日志、...

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在Spring AOP中,我们通常使用@Aspect注解来定义切面类。切面类中可以包含多个通知(Advice),包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知...

    spring aop jar 包

    这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    spring aop注解方式、xml方式示例

    Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    此外,Spring AOP还提供了一套强大的切点表达式和注解,使得切点和通知的定义更加简洁直观。 总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    一个简单的spring AOP的实现

    1. 注解驱动的AOP:这是最常用的实现方式,通过在方法上添加注解(如`@Before`, `@After`, `@Around`, `@AfterReturning`, `@AfterThrowing`)来定义通知,并使用`@Aspect`注解定义切面。 2. XML配置驱动的AOP:...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

    Spring AOP + 注解实现统一注解功能

    "Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

Global site tag (gtag.js) - Google Analytics