Spring基于注解@AspectJ的AOP

Spring除了支持XML方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。

但是用注解方式需要在XML启用对@AspectJ的支持<aop:aspectj-autoproxy/>,将在Spring上下文创建一个AnnotationAwareAspectJAutoProxyCreator类,它会自动代理一些Bean,这些Bean的方法需要与使用@Aspect注解的Bena中所定义的切点相匹配,而这些切点又是使用@Pointcut注解定义出来的,下面来看下例子(PS:我的例子都没有携带参数):

前置通知:使用org.aspectj.lang.annotation
包下的@Before注解声明;

@Before(value = "切入点表达式或命名切入点", argNames = "参数列表参数名")

后置返回通知:使用org.aspectj.lang.annotation 包下的@AfterReturning注解声明;

@AfterReturning(

value="切入点表达式或命名切入点",

pointcut="切入点表达式或命名切入点",

argNames="参数列表参数名",

returning="返回值对应参数名")

后置最终通知:使用org.aspectj.lang.annotation
包下的@After注解声明;

@After (

value="切入点表达式或命名切入点",

argNames="参数列表参数名")

package cn.com.ztz.spring.service;  

public interface ShowService {
    public void show();
} 
package cn.com.ztz.spring.service;  

public class ShowServiceImpl implements ShowService{
    @Override
    public void show() {
        showBefore();
        //showError();//异常测试
        showEnd();
    }
    public void showBefore(){
        System.out.println("showBefore============");
    }
    public void showError(){
        System.out.println("showError============");
        throw new RuntimeException();
    }
    public void showEnd(){
        System.out.println("showEnd===============");
    }
}
package cn.com.ztz.spring.service;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AudienceAspect {
	//定义切点
	@Pointcut("execution(* cn.com.ztz.spring.service.ShowServiceImpl.show(..))")
	public void performance(){
		//该方法的内容不重要,该方法的本身只是个标识,供@Pointcut注解依附
	}
	//前置通知
	@Before("performance()")
	public void taskSeats(){
        System.out.println("等候节目开始===");
    }
	//后置通知
	@After("performance()")
    public void applaud(){
        System.out.println("鼓掌=========");
    }
	//后置异常通知
	@AfterThrowing("performance()")
    public void demandRefund(){
        System.out.println("退钱离场======");
    }
}
<!-- 启用@AspectJ支持 -->
	<aop:aspectj-autoproxy/>
	<bean id="show" class="cn.com.ztz.spring.service.ShowServiceImpl"/>
	<bean id="audienceAspect" class="cn.com.ztz.spring.service.AudienceAspect"/>
public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        ShowService hs = ctx.getBean("show", ShowService.class);
        System.out.println("======================================");
        hs.show();
        System.out.println("======================================");
	}

运行测试方法控制台输出:

======================================

等候节目开始===

showBefore============

showEnd===============

鼓掌=========

======================================

注解环绕通知

像Spring基于XML的AOP一样,@AspectJ注解的使用不仅只限定与定义前置和后置通知类型。我们还可以创建环绕通知,使用环绕通知需要使用@Around。

@Around (

value="切入点表达式或命名切入点",

argNames="参数列表参数名")

public interface ShowService {
    public void show(String param);
}
@Override
    public void show(String param) {
    	System.out.println("around==========="+param);
    } 
@Aspect
public class AudienceAspect {
	//定义切点
	@Pointcut("execution(* cn.com.ztz.spring.service.ShowServiceImpl.show(..))")
	public void performance(){
		//该方法的内容不重要,该方法的本身只是个标识,供@Pointcut注解依附
	}
	@Around("performance()")
	public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice===========");
        Object retVal = pjp.proceed(new Object[] {"around"});
        System.out.println("around after advice===========");
        return retVal;
    }
}

运行测试方法控制台输出:

======================================

around before advice===========

around===========around

around after advice===========

======================================

引入

@AspectJ风格的引入声明在切面中使用org.aspectj.lang.annotation包下的@DeclareParents声明

@DeclareParents(

value="AspectJ语法类型表达式",

defaultImpl="引入接口的默认实现类")

package cn.com.ztz.spring.service;

public interface DeclareService {
    public void declare();
}
package cn.com.ztz.spring.service;
public class DeclareServiceImpl implements DeclareService {
    @Override
    public void declare() {
        System.out.println("declare=====================");
    }
} 
package cn.com.ztz.spring.service;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

@Aspect
public class AudienceAspect {
	@DeclareParents(value="cn.com.ztz.spring.service.ShowServiceImpl+",
			defaultImpl=cn.com.ztz.spring.service.DeclareServiceImpl.class)
	private DeclareService declareService;}
public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		DeclareService hs = ctx.getBean("show", DeclareService.class);
        System.out.println("======================================");
        hs.declare();
        System.out.println("======================================");
	}

运行测试方法输出结果:

======================================

declare=====================

======================================

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 12:52:25

Spring基于注解@AspectJ的AOP的相关文章

阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置这里就可以删除了 配置注解 使用@Service注解 开始AOP配置 把通知类交给Spring来管理 在Logger上加注解.之类注意,@Service和@Repository都不合适.因为logger属于三层 所以这里用@Component这个注解来配置 写完上面的@Component的注解后.b

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

首先在Eclipse中新建一个普通的Java Project,名称为springAOP.为了使用Spring的注解方式进行面向切面编程,需要在springAOP项目中加入与AOP相关的jar包,spring aop需要额外的jar包有: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.2.5.RELEASE.jar sprin

Spring的注解方式实现AOP

Spring对AOP的实现提供了很好的支持.下面我们就使用Spring的注解来完成AOP做一个例子. 首先,为了使用Spring的AOP注解功能,必须导入如下几个包.aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar. 然后我们写一个接口 [java] view plain copy print? package com.bird.service; public interface PersonServer { public void save(Str

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

前面我们已经入门使用Spring的注解方式实现AOP了,现在我们再来学习使用Spring的注解方式实现AOP的一些细节.本文是建立在使用Spring的注解方式实现AOP入门的案例的基础之上的. 本文是来讲解使用Spring的注解方式实现AOP的一些细节,其实说白了就是学习如何使用各种通知而已,例如前置通知.后置通知.异常通知.最终通知.环绕通知等,之前我们已经学习了前置通知,现在就来学习剩余的通知. 我们先来看后置通知,此时须将MyInterceptor类的代码修改为: /** * 切面 * @

结合项目(Spring+(基于注解的)SpringMVC和Mybatis+uploadify文件上传)--poi解析Excel文件

poi解析Excel文件 1.上传文件至服务器 2.解析Excel文件并返回数据集合 3.将数据保存到服务器 框架======Spring+(基于注解的)SpringMVC和Mybatis===== 第一步: 前台: jsp文件采用的是uploadify <div id="fileQueue"></div> <input type="file" id="brandFile"> js: <script ty

spring基于注解的IOC(2)

spring第二天:spring基于注解的IOC以及IoC的案例1.spring中ioc的常用注解 用于创建对象的:Component.Controller.Service.Repository 用于注入数据的:Autowired.Qualifier.Resource.Value 用于改变作用范围的:Scope . 和生命周期相关:PreDestroy .PostConstruct 2.案例使用xml方式和注解方式实现单表的CRUD操作 持久层技术选择:dbutils3.改造基于注解的ioc案例

(spring-第4回)spring基于注解的配置

基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样一样的. 一.举个栗子: 1 package com.mesopotamia.annotation; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Car { 7 private

在Spring中使用AspectJ实现AOP

在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1.在项目中添加包spring-aspects.jar(spring自带).aspectjweaver.jar(需要自己下载添加). 2.新建包user,包下新建类User 1 public class User{ 2 public void addUser(){ 3 System.out.printl

Spring基于注解TestContext 测试框架使用详解

概述 Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点: 1.基于注解的 IoC 功能:  2.基于注解驱动的 Spring MVC 功能:  3.基于注解的 TestContext 测试框架. Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细的讲述. 低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若干个测试基类.而 Spring 2.5