spring 学习3-Spring AOP

Using @AspectJ-Style Annotations

Java代码  

  1. @Component("myDependency")   
  2. public class MyDependency {   
  3. public void foo(int intValue) {   
  4. System.out.println("foo(int): " + intValue);   
  5. }   
  6. public void bar() {   
  7. System.out.println("bar()");   
  8. }   
  9. }  

 

Java代码  

  1. @Component("myBean")   
  2. public class MyBean {   
  3. private MyDependency myDependency;   
  4. public void execute() {   
  5. myDependency.foo(100);   
  6. myDependency.foo(101);   
  7. myDependency.bar();   
  8. }   
  9. @Autowired   
  10. public void setDep(MyDependency myDependency) {   
  11. this.myDependency = myDependency;   
  12. }   
  13. }  

 

Java代码  

  1. @Component   
  2. @Aspect   
  3. public class MyAdvice {   
  4. @Pointcut("execution(* com.apress.prospring3.ch7..foo*(int)) && args(intValue)")   
  5. public void fooExecution(int intValue) {   
  6. }   
  7. @Pointcut("bean(myDependency*)")   
  8. public void inMyDependency() {   
  9. }   
  10. @Before("fooExecution(intValue) && inMyDependency()")   
  11. public void simpleBeforeAdvice(JoinPoint joinPoint, int intValue) {   
  12. // Execute only when intValue is not 100   
  13. if (intValue != 100) {   
  14. System.out.println("Executing: " +   
  15. joinPoint.getSignature().getDeclaringTypeName() + " "   
  16. + joinPoint.getSignature().getName() + " argument: " + intValue);   
  17. }   
  18. }   
  19. @Around("fooExecution(intValue) && inMyDependency()")   
  20. public Object simpleAroundAdvice(ProceedingJoinPoint pjp, int intValue) throws Throwable {   
  21. System.out.println("Before execution: " +   
  22. pjp.getSignature().getDeclaringTypeName() + " "   
  23. + pjp.getSignature().getName()   
  24. + " argument: " + intValue);   
  25. Object retVal = pjp.proceed();   
  26. System.out.println("After execution: " +   
  27. pjp.getSignature().getDeclaringTypeName() + " "   
  28. + pjp.getSignature().getName()   
  29. + " argument: " + intValue);   
  30. return retVal;   
  31. }   
  32. }  

 

Xml代码  

  1. <aop:aspectj-autoproxy/> <!--inform Spring to scan for   
  2. @AspectJ-style annotations-->  
  3. <context:component-scan base-package="com.apress.prospring3.ch7.aspectjannotation"/>   
时间: 2024-09-26 17:25:56

spring 学习3-Spring AOP的相关文章

Spring学习笔记之aop动态代理(3)

Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. PersonDao.java public interface PersonDao { public void savePerson(); } PersonDaoImpl.java public class PersonDaoImpl implements PersonDao{ public void save

spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析

CGLib动态代理基本原理 CGLib--Code Generation Library,它是一个动态字节代码生成库,基于asm.使用CGLib时需要导入asm相关的jar包.而asm又是何方神圣? asm是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称

spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析

JDK动态代理技术 动态代理最常见应用是AOP(面向切面编程).通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法.对象.入参.返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的新需求,比如日志记录等. 动态代理常见有两种方式:基于JDK的反射技术的动态代理和基于CGLib的动态代理. 使用反射技术创建动态代理 JDK创建动态代理的核心是java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类.让我们先分

spring学习笔记(8)AOP增强(advice)配置与应用

增强类型 增强(advice)主要包括如下五种类型 1. 前置增强(BeforeAdvice):在目标方法执行前实施增强 2. 后置增强(AfterReturningAdvice):在目标方法执行后实施增强 3. 环绕增强(MrthodInterceptor):在目标方法执行前后实施增强 4. 异常抛出增强(ThrowsAdvice):在目标方法抛出异常后实施增强 5. 引介增强(IntroductionIntercrptor):在目标类中添加一些新的方法和属性 前置增强和后置增强配置 下面通过

spring学习笔记(9)AOP基本概念

通过上一篇文章对AOP的一些实例讲解后,我们在这篇文章中结合一些例子来系统地了解AOP中涉及到的一些基本概念. 1. 增强 上一篇文章我们都在讲增强,但并未谈及它的概念,但通过很多实例分析,我们很容易理解,增强就是为程序执行过程的很多特定地方添加一些新的功能. 2. 连接点 程序执行过程的某个特定位置点,如增强嵌入(织入)处的方法调用前,调用后.抛出异常后等程序执行点,乃至类初始化前后.类销毁前后等,都能称为连接点,它们都带有一定的边界特性. 3. 切点 切点可以理解成"带有目的性"的

spring学习笔记(13)基于Schema配置AOP详解

基于Schema配置入门实例 除了基于@AspectJ注解的形式来实现AOP外,我们还可以在IOC容器中配置.先来看看一个常见的应用场景,在我们的web项目中,我们需要为service层配置事务,传统的做法是在每个业务逻辑方法重复下面配置中: Created with Raphaël 2.1.0程序开始1. 获取DAO层封装好的数据库查询API,如HIbernate中的SessionFactory/Session和mybatis中的xxxMapper2. 开启事务3. 根据入参查询数据库完成相应

spring学习笔记(10)@AspectJ研磨分析[1]入门、注解基本介绍

@AspectJ准备 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. 在使用AspectJ之前,我们需要导入aspectJ相应的jar包,可到我的资源页http://download.csdn.net/detail/qwe6112071/9468329 中下载,而如果使用maven则可直接在pom.xml中加入如下代码: <dependency> <groupId>o

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

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

spring学习笔记(21)编程式事务配置,service层概念引入

访问数据库事务导入 在我之前的文章<spring学习笔记(19)mysql读写分离后端AOP控制实例>中模拟数据库读写分离的例子,在访问数据库时使用的方法是: public <E> E add(Object object) { return (E) getSessionFactory().openSession().save(object); } 通过直接开启session而后保存对象.查询数据等操作,是没有事务的.而如果我们的项目规模变大,业务逻辑日益复杂,我们在一个方法中进行大

最全面的Spring学习笔记

pring致力于提供一种方法管理你的业务对象.在大量Java EE的应用中,随处可见Spring.今天我将简单的介绍一下Spring这个框架. 本文适合读者: 想学Spring的Java开发者 刚用Spring不久的人 Why 为什么要使用Spring? Spring主要两个有功能为我们的业务对象管理提供了非常便捷的方法: DI(Dependency Injection,依赖注入) AOP(Aspect Oriented Programming,面向切面编程) Java Bean 每一个类实现了