AOP的自动代理

Wesley13
• 阅读 615

Spring的aop机制提供两类方式实现类代理。一种是单个代理,一种是自动代理。

单个代理通过ProxyFactoryBean来实现(就如上面的配置)。

自动代理:自动代理能够让切面定义来决定那个bean需要代理,不需要我们为特定的bean明确的创建代理从而提供一个更完整的aop实现 通过BeanNameAutoProxyCreator或者 DefaultAdvisorAutoProxyCreator实现。

◆采用单个代理方式 (费时费力,配置复杂臃肿)

下面就采用自动代理

实现代理bean的两种方式:

1,“基于Spring上下文的里声明的通知者bean的基本自动代理”:通知者的切点表达式用于决定哪个bean和那些方法需要被代理

2,”基于@AspectJ注释驱动切面的自动代理”:切面里包含的通知里指定的切点将用于选择哪个bean和哪个方法要被代理

第一种:<!——自动代理增加此行,容器会自动根据通知要匹配的切入点,为包含切入点的类创建 代理。注意这个bean没有id,因为永远都不会直接引用它——>

feedom.net   

第二种 自动代理@AspectJ切面

然而aspectJ提供可一种基于jdk1.5注解技术的方式,使得配置文件更少,更方便。能够把POJO类注释为切面这通常称为

@AspectJ.我们利用@AspectJ注释,我们不需要声明任何额外的类或Bean就可以把POJO转换成一个切面例如:

@Aspect 定义切面不再是普通的POJO了 在POJO类中加注释

public class AspectJMixAspect {    

    private Log logger = LogFactory.getLog(AspectJMixAspect.class); @Pointcut("execution(* *..HelloIF.*(..)) || execution(* *..TestBeanIF.*(..))")定义切入点那些类的那些方法添加 public void allMethods() { } @Pointcut("execution(* *..TestBeanIF.toDate(..)) && args(dateStr)") public void toDate(String dateStr) { } @Around("allMethods()") 环绕通知 public Object timing(ProceedingJoinPoint pjp) throws Throwable { long begin = System.currentTimeMillis(); Object ret = pjp.proceed(); long end = System.currentTimeMillis(); String methodName = pjp.getSignature().getName(); String targetClass = pjp.getTarget().getClass().getName(); logger.info("Around advice: It took " + (end - begin) + "ms to call " + methodName + " on " + targetClass); return ret; } @Before("allMethods()") public void logBefore(JoinPoint jp) { logger.info("Before advice: " + jp.getSignature().toLongString()); } @AfterReturning(value="toDate(dateStr)", returning = "date", argNames = "date, dateStr") public void afterReturning(Date date, String dateStr) { logger.info("call method toDate(" + dateStr + ") and return " + date); } @AfterThrowing(value="toDate(dateStr)", throwing="ex", argNames="dateStr, ex") public void afterThrowing(String dateStr, ParseException ex){方法名任意但参数要和argNames=""中的参数顺序一样, } } 

配置文件

<?xml version="1.0" encoding="UTF-8"?>

<p:beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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 "> <!-- target --> <p:bean id="hello" class="com.kettas.spring.ioc.day1.HelloIFImpl"> <p:property name="cal"> <p:bean class="java.util.GregorianCalendar"></p:bean> </p:property> <p:property name="user" value="world"></p:property> </p:bean> <p:bean id="testBean" class="com.kettas.spring.aop.day5.TestBean"> <p:property name="pattern" value="yyyy-MM-dd"></p:property> </p:bean> <!-- apsect bean --> <p:bean id="aspectJAspect" class="com.kettas.spring.aop.day5.AspectJMixAspect"></p:bean> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 声明自动代理bean需要命名空间:aop="http://www.springframework.org/schema/aop" </p:beans>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
AOP系列
AOP(AspectOrientProgramming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以SpringAOP为代表。本文
Easter79 Easter79
3年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
AOP相关概念
1.AOP(面向切面编程)在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,在软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型.利用AOP
Stella981 Stella981
3年前
Spring AOP 实现
AOP(AspectOrientProgramming),我们一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务、日志、缓存、分布式锁等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以SpringAOP为代表。Spr
Stella981 Stella981
3年前
SpringAOP动态代理技术自动生成代理类原理演示
//如下是自动生成代理类的逻辑演示:为了解耦合将类的方法单纯在代理类里调用;额外功能都在代理类里实现代理类的存在的问题就是开发代码量大代码冗余.为了解决这类问题使用AOP动态代理自动生成代理类publicinterfaceMan{publicvoidalive();//提供一个接口}public
Easter79 Easter79
3年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_