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

1.前言

上一篇博客介绍了如何通过AOP来切入我们想实现的公共性的功能,这篇博客来讲一下,当我们拦截到方法后,如何来获取通知参数。这也是AOP的精髓所在,通过AOP可以实现偷梁换柱的功能。我们把原来要执行的方法的参数获取到,然后换一套参数执行。下面来跟着我看一下吧!

2.AOP的通知参数

有时我们想通过AOP拦截到我们要加入通知的切点类的参数,通俗的说就像拿到拦截的方法的参数值,然后如果不合适的话,我们可以修改一下或者做一些其他的操作。例如用户登录的功能,我们可以把验证身份的功能抽离出来,然后在AOP中拦截到登陆方法中的参数,通过判断用户名来决定做下一步的操作。那么如何来取出用户名呢。

如果需要在通知方法中获取原始方法的调用参数,需要在通知方法的第一个形参位置声明JoinPoint类型的参数,使用该参数调用getArgs()方法可以获得原始方法的调用参数列表Object[]

<span style="font-size:18px;">package com.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

//通知类
public class MyAdvice {

	public void before(JoinPoint jp,String a,int b){
		//Object[] objs = jp.getArgs();
		//System.out.println("before......"+objs[0]+","+objs[1]);
		System.out.println("before......"+a+","+b);
	}
	public void after(JoinPoint jp){
		System.out.println("after......");
	}
	public void afterReturning(JoinPoint jp,Object abc){
		System.out.println("afterReturning......"+abc);
	}
	public void afterThrowing(JoinPoint jp){
		System.out.println("afterThrowing......");
	}

	//具有公共性的功能
	public Object fn(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("aaaaaaa");
		//获取到执行的参数
		Object[] obj=	pjp.getArgs();
		for (Object lb:obj) {
			System.out.println(lb);
		}

		//进行偷梁换柱的功能
	Object ob=	pjp.proceed(new Object[]{new Integer(6),new Integer(9)});
		System.out.println("bbbbbbbbbbbbbbb");
		return ob;
	}
}
</span>

注意:所有通知都可以通过JoinPoint获得通知的参数,但是只有around类别才可以执行替代拦截方法。

 3.AOP通知返回值

1.只有afterReturning 与 around可以获取方法的返回值

        2.afterReturning:在配置中设置returning属性,值是变量名的值,与方法的形参进行对应

<aop:after-returning method="afterReturning"returning="abc"/>

publicvoid afterReturning(JoinPoint jp,Object abc){

System.out.println("afterReturning......"+abc);

}

       3.around:直接通过程序中的原始方法调用获取,该方法返回值即为原始方法的返回值

              publicObject around(ProceedingJoinPoint pjp) throws Throwable{

                     System.out.println("aroundbefore......");

                     //调用原始方法

                     Objectobj = pjp.proceed();

                     System.out.println("around after......"+obj);

                     return obj;      说明:对原始方法拦截后,最终的运行返回值取决于这里

              }

4.AOP的注解开发

注解开发也特别的简单,下面给出一个实例,与平常的XML配置类似

<span style="font-size:18px;">package cn.itcast.aop.annotation;

import org.aspectj.lang.JoinPoint;
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;

//定义切面类
@Aspect
public class BookAdvice {
	//切面
	@Pointcut("execution(* cn.itcast.aop.annotation.BookService.add(..))")
	private void pt(){}

	//切点的顺序
	@Before("BookAdvice.pt()")
	public void before(JoinPoint jp){
		System.out.println("before running......");
	}
	@After("BookAdvice.pt()")
	public void after(){
		System.out.println("after running......");
	}
	@AfterReturning(value="BookAdvice.pt()",returning="abc")
	public void afterReturning(Object abc){
		System.out.println("afterReturning running......"+abc);
	}
	@AfterThrowing(value="execution(* cn.itcast.aop.annotation.BookService.add(..))",throwing="t")
	public void afterThrowing(Throwable t){
		System.out.println(t);
		System.out.println("afterThrowing running......");
	}
	@Around("execution(* cn.itcast.aop.annotation.BookService.add(..))")
	public Object around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("around before running......");
		Object retValue = pjp.proceed();
		System.out.println("around after running......");
		return retValue;
	}
}
</span>

注意:上述的配置与XML一一对应起来的话,就会简单很多。

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

时间: 2024-12-15 16:40:31

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

spring学习笔记四:AOP

AOP(Aspect Orient Programming),面向切面编程,是对面向对象编程OOPS的一种补充 面向对象编程使用静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程 AOP底层,就是采用动态代理模式实现的.采用了两种代理:JDK的动态代理域CGLIB的动态代理 AOP编程属于: 1.切面(Aspect) 切面泛指交叉业务逻辑 2.织入(weaving) 织入是指将切面代码插入到目标对象的过程 3.切入点(Pointcut) 切入点指切面具体织入的位置 4.目标对象(

Spring学习笔记--在SpEL中筛选集合

要用到Spring的util(包括util:list等),xml文件中的beans中需要添加一些有关util的信息: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&q

Spring学习笔记四

spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义的其他Bean. 1.字面值 "字面值"一般是指可用字符串表示的值, 这些值可通过<value>元素标签进行注入. 基本数据类型及其封装类, String等类型都可以采用字面值注入的方式. 注入字面值: <bean id="car" class=&qu

spring学习笔记四:spring常用注解总结

使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.xxx" /> 1.定义Bean @Component 需要在类上面使用注解@Component,改注解的vlan属性用于指定改注解的ID的值 spring还提供三个功能基本和@Component等效的注解 @Repository 用于对DAO实现类进行注解 @Service         

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等.实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些.既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例. 续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复.下面着重加入AOP实现DAO层动态分库调用.可先看上篇文章<spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例 >

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

spring学习笔记(一) Spring概述

博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring的优势在哪里?怎么系统的学习Spring? 一.什么是Spring? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发. 那有人就会问了,Spring是如何简化开发的? 在传统开发中,一个应用是需

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)

<Spring学习笔记>:Spring.Hibernate.struts2的整合(以例子来慢慢讲解,篇幅较长) 最近在看马士兵老师的关于Spring方面的视频,讲解的挺好的,到了Spring.Hibernate.struts2整合这里,由于是以例子的形式来对Spring+Hibernate+struts2这3大框架进行整合,因此,自己还跟着写代码的过程中,发现还是遇到了很多问题,因此,就记录下. 特此说明:本篇博文完全参考于马士兵老师的<Spring视频教程>. 本篇博文均以如下这