(四)注解实现AOP切面

一、applicationContext.xml

<?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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<bean id="personService" class="com.lovo.u34.service.impl.PersonServiceImpl" ></bean>
	<bean id="myInterceptor" class="com.lovo.u34.service.MyInterceptor"></bean>

 	<context:annotation-config></context:annotation-config>
	<context:component-scan base-package="com"></context:component-scan>
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

二、PersonServiceImpl

public class PersonServiceImpl implements PersonService{
	@Override
	public void save(String name) {

		System.out.println("我是save方法"+name);
		//throw new RuntimeException("我爱例外");
	}

	@Override
	public void update(String name, Integer personid) {

		System.out.println("我是update方法");
	}

	@Override
	public String getPersonName(Integer personid) {

		System.out.println("我是getPersonName方法");

		return "xxx";
	}
}

三、MyInterceptor

@Aspect    //切面
public class MyInterceptor {

	@Pointcut("execution (* com.lovo.u34.service.impl.PersonServiceImpl.*(..))")
	public void anyMethod (){	//声明一个切入点

	}

	@Before("anyMethod() && args(name)")   //打印传入切入点的name
	public void doAccessCheck(String name){
		System.out.println("before前置方法"+"---"+name);
	}

	@After("anyMethod()")
	public void doAfter(){
		System.out.println("after后置方法");
	}

	@AfterReturning(pointcut="anyMethod()",returning="result")  //打印返回值
	//@AfterReturning(pointcut="anyMethod()")
	public void doAfterCheck(String result){
		System.out.println("afterReturning方法正常执行完毕之后执行"+"----"+result);
	}

    @AfterThrowing(pointcut="anyMethod()",throwing="e")  //打印异常
    public void doAfterThrow(Exception e){
        System.out.println("例外通知"+"----"+e);
    }  

    @Around("anyMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("进入环绕通知");
        Object object = pjp.proceed();//执行该方法
        System.out.println("退出环绕方法");
        return object;
    }
}

方法访问控制修饰符 返回类型 包路径.类名.方法名(参数类型1,参数类型2。。。。)

1: public * com.lovo.daoimpl.UserDaoImpl.log(java.lang.String)

这句里面有一个*代表通配符,就是说这方法可以是任意的返回类型,参数里面呢,有一个String的类型,表示方法是一个带一个String类型的参数

2: * com.lovo.daoimpl.UserDaoImpl.log(java.lang.String,java.lang.String)

表示是一个任意修饰符,任意返回类型的,并且参数有两个String的方法

3: * com.lovo.daoimpl.UserDaoImpl.log(..)

表示是一个任意修饰符,任意返回类型的,并且参数也是任意个数与类型的方法。

4: * *.. UserDaoImpl.*(..)

表示任意修饰符,任意返回类型,任意包下面的所有UserDaoImpl类的所有的方法

注意,前面那个*..的两个点表示包的所有子包的意思。

5: * *..*.*(..)

表示 所有包下面的所有类的所有方法

四、Test

public class Test extends TestCase{

	public void testSave(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		PersonService ps=(PersonService) ac.getBean("personService");
		//ps.save("张三");
		ps.getPersonName(12);
	}
}

  

  

  

  

时间: 2024-11-06 07:16:04

(四)注解实现AOP切面的相关文章

SPRING学习(十九)--基于注解的AOP切面编程

上篇中介绍了基于XML配置的AOP切面编程,除了XML配置AOP切面编程外,还可以通过注解方式实现AOP切面编程,本篇通过一个小例子来介绍基于注解的AOP编程. 1.在spring中使用AOP变成,不止要导入spring-aop.jar,还需要导入spring-aspects.jar.aspectjweaver.jar和aopalliance.jar,但是aspectjweaver.jar被spring-aspects.jar依赖,aopalliance.jar被spring-aop.jar依赖

Spring AOP实现方式四之注入式AspectJ切面【附源码】

现在我们要讲的是第四种AOP实现之注入式AspectJ切面 通过简单的配置就可以实现AOP了. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator * */ public interface Love { /* * 谈恋爱方法 */ void fallInLove(); } .csharpcode, .csharpcode pre { font-size: sma

阶段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编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

1.数学计算器 ①数学计算器接口[MathCalculator]            public void add(int i,int j);     public int sub(int i,int j);     public int multi(int i,int j);     public void divide(int i,int j);    ②提供简单实现:加减乘除运算[EasyImpl]    ③在简单实现的基础上让每一个计算方法都能够打印日志[LoginImpl]    

Spring基础知识之基于注解的AOP

背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法被调用前调用通知功能. 后置通知(After):在目标方法完成后调用通知,此时不会关系方法输出什么. 返回通知(After-returning):在目标方法成功执行后调用通知. 异常通知(After-throwing):在目标方法抛出异常后调用通知. 环绕通知(Around):通知包裹了被通知的方法

Spring_Spring与AOP_AspectJ基于注解的AOP实现

一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.(百度百科) Spring又将AspectJ的对于AOP的实现引入到自己的框架中. 在Spring中使用AOP开发时,一般使用AspectJ的实现方式. 二.AspectJ的通知类型 前置通知 后置通知 环绕通知 异常通知 最终通知 三.AspectJ的切入点表达式 表达式中加[]的部分

Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.核心作用:可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的复用性和开发效率.AOP提供了取代继承和委托的一种新的方案,而且使用起来更加简洁清晰,是软件开发中的一个热点理念. 2.AOP术语 (1).通知类型:Advice

使用Spring AOP切面解决数据库读写分离

http://blog.jobbole.com/103496/ 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取.如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击. 解决读写分离的方案很多,常用的有SQL解析.动态设置数据源.SQL解析主要是通过分析sql语句是insert/select/update/delete中的哪

AOP基础知识及AOP切面编程之注释方法、xml配置方法

<span style="font-family: 微软雅黑; font-size: 10.5pt; letter-spacing: 0pt; ">AOP概念</span> Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象 joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,这些点是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器