肯定是为了开发方便啊,那是如何让开发变得方便的呢? Spring提供了一个javaweb开发的基本框架;如早期开发想要获取对象必须调用者自己new对象,当项目变大,组件越来越多,程序规模越来越大,这种方式会让组件之间的耦合度很高,难以维护。而spring的出现就解决了这种问题,调用者不再需要自己去创建对象,将各个组件之间解耦。
首先Spring容器,其容器不止一种,如ClasspathXmlApplicationContext,XmlWebApplicationContext等多种容器,所有这些容器的父类都是BeanFactory。比容器更适合的名字应该是工厂,因为仅仅作为容器存对象的话,ArrayList,HashSet也可以做到,但是spring的工厂内不仅仅存储对象(bean)还存储着对象的定义(beandefinition)。工厂内可以对bean进行实例化和销毁等操作,而不仅仅是储存对象。如prototype模式的bean,BeanFactory就主要表现为一个工厂了,每次请求都返回一个不同的实例。而大多数singleton模式则更像一个存储Bean的容器。
AOP(Aspect-Oriented Programming), 即面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不同的抽象软件结构的视角。 在OOP中, 我们以类(class)作为我们的基本单元, 在AOP中的基本单元是 Aspect(切面)。
SpringAOP中的动态代理主要两种方式 1.JDK动态代理 JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,JDK动态代理的核心是InvocationHandler接口和Proxy类 2.CGLIB动态代理 如果目标没有实现接口,那么SpringAOP会选择使用CGLIB来动态代理目标类,当然Spring也支持配置强制使用CGLIB动态代理 CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它无法使用CGLIB做动态代理
AspectJ就是一种实现AOP思想的技术,就是将外围业务(日志,权限,性能监测、事务控制)以一种特殊的方式自动应用到核心模块中的技术。 AspectJ采用的就是静态织入的方式。AspectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类。
Spring AOP 与ApectJ 的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring AOP 并不尝试提供完整的AOP功能(即使它完全可以实现)。 Spring AOP 更注重的是与Spring IOC容器的结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势,同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代理技术的实现原理来构建Spring AOP的内部机制(动态织入),这是与AspectJ(静态织入)最根本的区别。 在AspectJ 1.5后,引入@Aspect形式的注解风格的开发,Spring也非常快地跟进了这种方式,因此Spring 2.0后便使用了与AspectJ一样的注解。请注意,Spring 只是使用了与 AspectJ 5 一样的注解,但仍然没有使用 AspectJ 的编译器,底层依然是动态代理技术的实现,因此并不依赖于 AspectJ 的编译器。
