Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。
首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.
然后我们写一个接口
- package com.bird.service;
- public interface PersonServer {
- public void save(String name);
- public void update(String name, Integer id);
- public String getPersonName(Integer id);
- }
和一个接口实现类
- package com.bird.service.impl;
- import com.bird.service.PersonServer;
- public class PersonServiceBean implements PersonServer{
- @Override
- public void save(String name) {
- System.out.println("我是save方法");
- // throw new RuntimeException();
- }
- @Override
- public void update(String name, Integer id) {
- System.out.println("我是update()方法");
- }
- @Override
- public String getPersonName(Integer id) {
- System.out.println("我是getPersonName()方法");
- return "xxx";
- }
- }
下面使用Spring注解方式对这个Bean进行方法拦截
- package com.bird.service;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- /**
- * 切面
- * @author Bird
- *
- */
- @Aspect
- public class MyInterceptor {
- @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")
- private void anyMethod(){}//定义一个切入点
- @Before("anyMethod() && args(name)")
- public void doAccessCheck(String name){
- System.out.println(name);
- 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 pjp) throws Throwable{
- System.out.println("进入环绕通知");
- Object object = pjp.proceed();//执行该方法
- System.out.println("退出方法");
- return object;
- }
- }
execution表达式
- execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
modifiers-pattern:方法的操作权限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:参数名
throws-pattern:异常
其中,除ret-type-pattern和name-pattern之外,其他都是可选的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值为任意类型;方法名任意;参数不作限制的所有方法。
- @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")
这句话是方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代
表各种方法.
然后下面的注解就比较简单了,就是在使用方法前和中,还有环绕拦截/
然后在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:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
- <aop:aspectj-autoproxy/>
- <bean id="personServiceBean" class="com.bird.service.impl.PersonServiceBean"/>
- <bean id="myInterceptor" class="com.bird.service.MyInterceptor"/>
- </beans>
然后建立一个Junit测试
- package junit.test;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.bird.service.PersonServer;
- public class SpringAOPTest {
- @Test
- public void inteceptorTest(){
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beanAop.xml");
- PersonServer bean = (PersonServer)ctx.getBean("personServiceBean");
- bean.save(null);
- }
- }
测试结果为
- 2012-3-12 18:08:39 org.springframework.context.support.AbstractApplicationContext prepareRefresh
- 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6: display name [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]; startup date [Mon Mar 12 18:08:39 CST 2012]; root of context hierarchy
- 2012-3-12 18:08:40 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
- 信息: Loading XML bean definitions from class path resource [beanAop.xml]
- 2012-3-12 18:08:40 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
- 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]: org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7
- 2012-3-12 18:08:40 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
- 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7: defining beans [org.springframework.aop.config.internalAutoProxyCreator,personServiceBean,myInterceptor]; root of factory hierarchy
- null
- 前置通知
- 进入环绕通知
- 我是save方法
- 后置通知
- 退出方法
- 最终通知
相关推荐
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
使用Spring AOP和自定义注解进行参数检查 了解使用Spring AOP和自定义注解进行参数检查的技术细节。通过自定义注解和spring AOP,我们可以实现参数的校验,提高代码的可读性和可维护性。 自定义注解 在本篇文章中...
SpringAOP中的注解配置详解 ...SpringAOP中的注解配置详解是实现AOP功能的重要技术之一,它提供了一种灵活、可扩展的方式来拦截和扩展业务逻辑。通过使用注解和XML配置,开发者可以轻松地实现对业务逻辑的拦截和扩展。
**Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...
### Spring AOP 详解 #### 5.1 AOP 基本思想 **5.1.1 认识 AOP** AOP (Aspect Oriented Programming) 面向切面编程,是一种软件开发思想,它允许开发者将那些分散在整个应用各处的“切面”(如日志记录、安全控制...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
Spring AOP支持多种方式来定义切入点,包括但不限于方法名、类名、注解等。 5. **引入(Introduction)**:允许向被通知对象添加新的接口实现或者新的方法。例如,可以使用引入让任何对象实现`IsModified`接口,...
**Spring AOP 依赖 Jar 包详解** 在 Spring 框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以封装跨多个对象的行为或责任。Spring AOP 提供了在运行时实现切面的功能,...
**Spring AOP 知识点详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在程序运行时动态插入代码的能力,以实现跨切面的关注点,如日志、事务管理、权限...
2. **基于注解的AOP**:Spring 2.5开始支持注解驱动的AOP,通过在方法上使用`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around`等注解来定义通知。 3. **基于XML配置的AOP**:在Spring的配置...
**Spring AOP 实例详解** 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心...
### Spring AOP 概念与实践 #### 一、AOP 概述 ...Spring AOP 提供了灵活的机制来实现这一目标,无论是通过 AspectJ 注解还是 XML 配置,开发者都可以根据项目的需求选择最适合的方式来实现 AOP。
**Spring AOP 实现详解** 在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务...
Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...
**Spring AOP 知识详解** 在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、...
**Spring AOP详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在程序运行期间通过代理方式实现横切关注点(如日志、事务管理等)的技术。相较于...
**Spring AOP 管理XML版详解** 在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的设计模式,它扩展了传统的面向对象编程(OOP),使得我们可以将关注点分离,特别是那些横切关注...
### Spring AOP 文档知识点详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个关键模块,它为开发者提供了在应用程序中实现横切关注点(Cross-cutting Concerns)的能力。横切关注点...