`

Spring使用注解方式实现AOP

阅读更多

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。

首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.

1、实体bean

public class Person {

	private Long id;
	private String name;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 2、接口类

public interface PersonService {
	public void save(Person person);
	
	public void update(Person person); 
	
	public Person getByIdPerson(Long id);
	
	public void delete(Long id);
}

 3、实现类

 

public class PersonServiceImpl implements PersonService{

	Map<Long, Person> maps = new HashMap<Long, Person>();
	
	@Override  
    public void save(Person person) {
        System.out.println("***执行save方法***");
        maps.put(person.getId(), person);
    }  
  
    @Override  
    public void update(Person person) {  
        System.out.println("***执行update()方法***");
        maps.remove(person.getId());
        maps.put(person.getId(), person);
    }  
  
    @Override  
    public Person getByIdPerson(Long id) {  
        System.out.println("***执行getByIdPerson()方法***");  
        return maps.get(id);
    }  
    
    @Override
    public void delete(Long id) {
    	System.out.println("***执行delete()方法***");  
    	maps.remove(id);
    }
}

 4、使用Spring注解方式对这个Bean进行方法拦截

@Aspect  
public class MyInterceptor {

	@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")
	private void anyMethod(){}//定义切点  
	
	@Before("anyMethod() && args(person)")  
	public void doAccessCheck(Person person){  
		System.out.println(person.getName());  
		System.out.println("前置通知");  
	}  
	
	@AfterReturning("anyMethod()")  
	public void doAfter(){  
		System.out.println("后置通知");  
	}  
	
	@After("anyMethod()")  
	public void after(){  
		System.out.println("最终通知");  
	}  
	
	@AfterThrowing("anyMethod()")  
	public void doAfterThrow(){  
		System.out.println("异常通知");  
	}  
	
	@Around("anyMethod()")  
	public Object doBasicProfiling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{  
		System.out.println("进入环绕通知");  
		Object object = proceedingJoinPoint.proceed();//执行该方法  
		System.out.println("退出方法");  
		return object;  
	}  
}  

 

@Pointcut("execution(* cn.tzz.aop.annotation.service.impl..*.*(..))")

上述是定义方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包,(..)代表各种方法.

 

5、在Spring的配置文件中配置Bean,需要打开AOP命名空间

<?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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	
    <context:annotation-config />
	<context:component-scan base-package="cn.tzz.aop.annotation" />
	
    <aop:aspectj-autoproxy proxy-target-class="true" />
	<bean id="personService" class="cn.tzz.aop.annotation.service.impl.PersonServiceImpl"></bean>
	<bean id="myInterceptor" class="cn.tzz.aop.annotation.MyInterceptor"></bean>
    
</beans>

 6、测试

public class TestAop {

	private static ApplicationContext ctx = null;
	private static PersonService personService = null;
	
	static{
	 ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	 personService = (PersonService)ctx.getBean("personService");
	}
	
	public void testSave(){
		Person person = new Person();
		person.setId(1L);
		person.setName("abc");
		personService.save(person);
	}
	
	public void testGetByIdPerson(){
		Person p = personService.getByIdPerson(1L);
		System.out.println(p.getId()+"---"+p.getName());
	}
	
	public void testUpdate(){
		Person person = new Person();
		person.setId(1L);
		person.setName("abc_1");
		personService.update(person);
	}
	
	public void testDelete(){
		personService.delete(1L);
	}
	
	@Test  
    public void testInteceptor(){  
		testSave();
//		testGetByIdPerson();
//		testUpdate();
//		testGetByIdPerson();
//		testDelete();
//		testGetByIdPerson();
    }  
}

 7、测试结果

abc
前置通知
进入环绕通知
***执行save方法***
后置通知
退出方法
最终通知

 

 

分享到:
评论

相关推荐

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

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    使用Spring的注解方式实现AOP

    本篇文章将深入探讨如何通过注解方式在Spring中实现AOP。 首先,我们需要了解AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”,这些切面包含了一组相关操作,可以在多个对象或方法上统一实施。Spring ...

    基于注解实现SpringAop

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

    Spring 基于注解方式实现AOP

    下面我们将深入探讨如何使用注解来实现Spring AOP。 首先,我们需要了解AOP的基本概念。AOP是一种编程范式,旨在将横切关注点(如日志、事务管理、安全性等)从核心业务逻辑中分离出来。在Spring中,切面由通知...

    使用Spring的注解方式实现AOP入门

    本教程将引导您入门Spring的注解式AOP实现。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注点,如日志记录。切点(Pointcut)定义了在何时应用这些关注点,通常是一个方法调用...

    spring注解方式实现aop

    通过以上步骤,我们可以使用Spring注解方式实现AOP,将关注点如日志、缓存等与业务逻辑分离,提高代码的可读性和可维护性。在实际项目中,可以灵活运用这些知识来优化代码结构,降低复杂性。希望本教程对理解和应用...

    Spring注解方式实现AOP demo

    本篇将通过注解方式探讨如何在Spring中实现AOP,基于提供的资源,我们可以看到一个实际的Demo项目结构。 首先,我们来看项目的基本结构: 1. `bin`目录:编译后的Java类文件会放在这里。 2. `.settings`目录:包含...

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    通过以上讲解,我们已经掌握了如何使用Spring的注解方式实现AOP的基本步骤。实际开发中,可以根据需要定制各种通知类型,灵活地应用在业务逻辑中,提高代码的可读性和可维护性。同时,Spring的AOP功能也可以与Spring...

    使用Spring的注解方式实现AOP实例

    使用Spring的注解方式实现AOP实例 使用Spring的注解方式实现AOP实例是指通过使用Spring框架提供的注解方式来实现Aspect-Oriented Programming(面向方面编程)的功能。AOP是面向对象编程的一种补充,能够将跨越多个...

    Spring基于注解实现AOP

    本篇文章将深入探讨如何在Spring中通过注解实现AOP。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,这些切面包含了跨越多个对象的行为或责任。切点是这些行为插入到主业务逻辑...

    注解方式实现AOP编程

    在Spring框架中,AOP的实现有两种主要方式:一种是基于XML配置,另一种是基于注解。本篇将主要讨论如何通过注解方式来实现AOP编程。 首先,我们需要了解Spring中的核心注解。`@Aspect`是定义一个切面的注解,通常会...

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

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

    以注解方式模拟Spring IoC AOP

    Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...

    使用Spring配置文件实现AOP

    这种方式虽然相比注解方式略显繁琐,但对于大型项目或者需要精细控制AOP配置的情况,仍然是一个很好的选择。通过深入理解和实践,我们可以更好地利用Spring AOP来优化我们的应用程序,提高代码的可读性和可维护性。

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...

    Spring mvc mybatis plus 实现AOP 切面日志系统

    本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志记录框架,能够自动追踪和记录应用程序的关键操作,同时支持数据持久化到数据库中,方便后期分析和问题排查。下面将详细介绍这些技术...

    Spring通过注解实现AOP

    在Spring中,AOP主要通过两种方式实现:一种是基于XML配置,另一种是基于注解。这里我们重点讲解基于注解的方式。Spring支持的注解包括`@Aspect`、`@Before`、`@After`、`@Around`、`@Pointcut`等。 1. **@Aspect**...

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

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

    Spring实现AOP的4种方式

    每种实现方式都有其适用场景和优缺点。基于代理的方式简单易懂,但受限于目标对象是否需要实现接口;AspectJ注解方式简化了代码,提高了可读性;XML配置提供了清晰的结构,适合大型项目;Java配置则结合了灵活性和可...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

Global site tag (gtag.js) - Google Analytics