spring-aop

疑问???

  • 面向过程,面向对象,面向切面编程?
  • aop的出现要解决什么问题?
  • aop和aspectj的区别?
  • 静态代理和动态代理的区别?
  • aop除了方法切面以外,有什么高级特性?
  • 什么是面向切面编程?
  • aop源码有什么可改造点和设计亮点?
  • cglib是什么东西?有什么用?
  • 如何记住aop相关知识点?

面向过程,面向对象,面向切面编程?

软件开发追求的到底是什么?简单,可复用,可扩展? 面向过程的软件开发:思考的是整个软件有哪些过程。过程都是怎样? 面向对象的软件开发:思考的是有哪些东西可以抽象成对象。 面向切面的软件开发:哪些功能可以以切面方式植入。 面向对象是面向过程的抽象,而面向切面是面向对象的抽象。

aop的出现要解决什么问题?它是怎么实现的?

功能需求之外的服务,比如日志,错误异常处理,监控,事务处理等,aop能将这些服务与业务功能进行减耦。同时能够复用相同服务代码。

静态代理和动态代理

静态代理中,会为每个被代理的类写一个代理类,在代理类里面再调用被代理类。缺点是复用性差 动态代理是jdk1.3以后,使用运行时字节码生成技术生成代理类,利用反射将原始类和方法当作参数传递给InvokationHandller 所有被代理的方法统一交给ih的invoke方法处理。

JDK动态代理和CGLIB动态代理

  • JDK: 基于反射机制进行字节码生成,优点:生成代理速度快,缺点:基于接口,非接口不能用JDK动态代理,使用反射,程序执行效率比较低。
  • CGLIB:采用继承的方式,对生成后的字节码文件进行了优化,程序性能更好。

AOP源码跟踪

AopNamespaceHandler AspectJAutoProxyBeanDefinitionParser

  • DefaultAopProxyFactory
	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        // 如果配置optimize和target-class,或者要代理的bean没有实现接口的话,
        // 采用cglib代理,否则使用JDK动态代理
		if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
			Class<?> targetClass = config.getTargetClass();
            //这里主要防止获取不到类对象,比如final标示的对象
			if (targetClass == null) {
				throw new AopConfigException("TargetSource cannot determine target class: " +
						"Either an interface or a target is required for proxy creation.");
			}
            //如果目标是个接口的化,还是采用JDK动态代理方式
			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
				return new JdkDynamicAopProxy(config);
			}
			return new ObjenesisCglibAopProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

SpringAOP介绍

@Aspect、@Pointcut、@Before、@After 等注解都是来自于 AspectJ,但是功能的实现是纯 Spring AOP 自己实现的。

JOINPOINT

指的就是方法调用(构造方法,set,get,正常方法) SpringAOP仅支持方法级别的JOINPOINT

POINTCUT

要匹配的joinpint,通过相应的表达式进行匹配

ADVISE

具体切面代码都在这里,包括before,throw,after,invoke

ASPECT

它代表容器,包含多个pointcut和advise

织入

ProxyFactory

##OOP与AOP 用oop,想要实现日志记录和监控等功能,首先想到可能是继承,或者组合,比如售后部分系统业务类继承DebugService,JMQService等,为了进行日志记录,但是这样违背了oop的设计理念。于是aop诞生了。。。 aop最初采用静态代理方式,为每个符合pointcut的类生成相应的代理类。但是这样会导致,joinpoint相同,目标对象类型不一样,会建立很多的代理对象。于是动态代理诞生了。。。 动态代理分为 JDK提供的动态代理和cglib动态代理,二者互补,jdk只能代理实现接口的类,cglib只能代理非final类型的类,spring默认采用jdk动态代理(大概是jdk性能更好一些)

spring aop 开发完joinpoint 开发完advise 配置pointcut, 动态代理生成代理类, 在运行时期: