• 1. Spring AOP
  • 2. 2目标了解AOP 掌握理解AOP术语 理解Spring中AOP的实现 掌握通知、切入点的定义与使用 掌握ProxyFactoryBean的使用 掌握Spring自动代理的使用
  • 3. 3AOP(Aspect Oriented Programming)它是一种设计模式,用于实现一个系统中的某一个方面的应用。 AOP的应用 系统安全 事务 日志 审计AOP简介
  • 4. 4AOP的术语描述了AOP编程的各个方面: 切面(Aspect)描述的是一个应用系统的某一个方面或领域,例如:日志,事务,权限检查等。 连接点(Joinpoint)连接点是应用程序执行过程中插入切面的点,这些点可能是方法的调用,异常抛出或字段的修改等。 通知(Advise)通知它是切面的具体实现,它表示切面的行为,例如在日志的切面应用中,日志通知包含了实现日志功能的具体代码,例如向日志文件写入日志信息等。 AOP术语
  • 5. 5切入点(Pointcut) 切入点指定了通知应当应用在那些连接点上,通知可以应用到AOP框架支持的任何的连接点,例如:根据方法名来确定切入点等,它指定了那些连接点需要被通知。 引入(Introduction)引入充许你为已存在的类添加新的方法和属性。 目标对象(Target):目标对象是指被通知的对象,它是一个普通的业务对象,如果没有AOP那么它其中可能包含大量的非核心业务逻辑代码,例如日志,事务等,而如果使用了AOP则其中只有核心的业务逻辑代码。 AOP术语
  • 6. 6代理(Proxy)代理是指将通知应用到目标对象后形成的新的对象。它实现了与目标对象一样的功能,不同的是它添加了通知的应用功能例如日志,事务等,对用户而言它与目标对象是一样的。 织入(Weaving)织入是指将切面应用到目标对象从而建立一个新的代理对象的过程,切面在指定的接入点被织入目标对象中,织入一般可发生在对象的编译期,类装载期或运行期,Spring的AOP采用的是运行期织入。 AOP术语
  • 7. 7AOP术语示例现需要在执行业务方法前,执行用户的权限验证,RoleInterceptor展示如何通过AOP拦截的方式来实现通用权限验证。OrderServicesImplOrderServicesOrderProxyRoleInterceptor织入
  • 8. 8Spring AOPSpring的连接点模型是建立在方法拦截的基础之上。 Spring在方法调用的各个地方可织入通知,Spring有提供多种类型的通知,它们分别提供了不同的织入方式 通知类型接口描述aroundMethodInterceptor拦截目标方法的调用beforeBeforeAdvice调用目标方法前通知afterAfterReturningAdvice调用目标方法后通知throwsThrowsAdvice方法抛出异常时通知
  • 9. 9Spring Aop应用SpringAop的常见应用 授权认证 事务拦截 日志拦截 方法缓存 数据审计等
  • 10. 10Spring Aop的实现Spring中建立AOP应用的基本步骤 建立目标类及业务接口 Spring中注册目标类实例 建立通知类实现具体的通知接口 Spring中注册通知类实例 配置目标类的代理对象(织入通知形成代理对象) 获取代理对象,调用其中的业务方法
  • 11. 11Spring Aop的实例使用拦截实现目标实现目标方法缓存。若多次调用同一方法时,传递的参数一样时,后面的调用将直接从缓存中获取结果而不执行目标方法。目标类:MathServicesImpl主要用于实现一些复杂的数学计算。 MathServices是它的接口。 InvokeBufInterceptor是实现了MethodInterceptor接口的拦截。
  • 12. 12Spring Aop的实例示例代码展示了将InvokeBufInterceptor织入目标对象形成代理对象的过程。 invokeBufInteceptor
  • 13. 13定义切入点Spring默认情况下是在目标对象的任意方法被调用时执行通知方法。 切入点充许用户指定在特点的方法(即连接点)上执行通知。 Spring支持动态和静态切入点。 静态切入点:只是在代理对象建立时执行一次而不是立即执行。 动态切入点:动态根据调用的方法的名称及参数确定是否需要执行。 动态切入点比静态切入点性能更低,但更灵活。
  • 14. 14Spring切入点Spring有内置许多静态切入点: NameMatchMethodPointcut根据方法名确定切入点,其中的setMappedName和setMappedNames用于设置符合条件的方法名,匹配方法名的字符串可使用通配符*。 RegExpPointcut:根据正则表达式确定匹配的方法名,比NameMatchMethodPointcut使用更加灵活。 在切入点中经常使用的正则表达式符号: .:匹配任何单个字符,例如:add.表示以add开头以任意一个字符结尾的方法。 +:匹配一个字符的一次或多次,例如:add.+表示以add开头的任意方法。 *:匹配0次或多次,例如:delete.*表示delete或以delete开头的方法。
  • 15. 15Spring切入点示例Spring中提供了将切入点与通知结合在一起使用的通知Advisor。 示例代码中将LogInterceptor织入目标对象,并定义了切入点在目标对象的所有以service结尾的方法上执行。 *Service
  • 16. 16ProxyBeanFactory的使用ProxyBeanFactory用于建立目标对象的代理对象,建立代理对象时可织入多个通知对象。 ProxyBeanFactory常见属性及使用: target指定被代理的目标对象Bean的名称 proxyInterfaces指定了代理对象需要实现的接口应当与目标对象实现的接口一致,不指定时通过反射获取。 singlon指定了代理对象的形态,缺少true单实例,false为原型 proxyTargetClass在使用CGLIB产生代理对象时需要设置为true。
  • 17. 17Spring工厂类Spring中提供了FactoryBean接口用于建立工厂类 工厂类用于产生Bean的实例 示例EmpService的工厂类public class EmpServiceFactory implements FactoryBean { public Object getObject() throws Exception { return new EmpService(); } public Class getObjectType() { return EmpService.class; } public boolean isSingleton() { return false; } }
  • 18. 18配置Spring工厂类注册工厂类 从工厂类中获取Bean的实例EmpService es = (EmpService)ctx.getBean("empServiceFactory");
  • 19. 19Spring 自动代理自动代理是指在Spring建立Bean实例时自己为之建立一代理对象,并且将特定的通知织入到目标对象的过程。 Spring中有提供多个自动代理Bean的实现。 BeanNameAutoProxyCreator 匹配Bean的名称自动建立代理对象。 DefaultAdvisorAutoProxyCreator自动评估IOC容器(即Spring上下文)中的Advisor是否适应目标对象的方法,如果适应目标对象将被织入Advisor并产生代理对象,如果不适应将不被代理。
  • 20. 20BeanNameAutoProxyCreaterBeanNameAutoProxyCreater根据Bean名称自动建立代理对象,其主要属性如下: beanNames用于指定自动代理的Bean的名称,可包含通配符* interceptorNames指定被织入目标对象的通知。 proxyTargetClass如果使用CGLIB代理需要指定为true。 *Services myadvise
  • 21. 21DefaultAdvisorAutoProxyCreator DefaultAdvisorAutoProxyCreator用于自动评估Advisor产生代理对象,主要属性: interceptorNames指定被评估的Advisor,不指定容器中所有的Advisor都会被评估。 proxyTargetClass若使用CGLIB产生代理对象时,需要指定为true。
  • 22. 22总结AOP的概念 Spring产生代理对象的两种方式 Spring中通知的类型 在Spring中定义切入点 使用Spring的自动代理