AOP的自动代理

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类中加注释

1public class AspectJMixAspect { 2 3 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=""中的参数顺序一样, } }

配置文件

1<?xml version="1.0" encoding="UTF-8"?> 2 3<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>
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

AOP系列

AOP(AspectOrientProgramming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以SpringAOP为代表。本文