Spring的官方网站:http://www.springsource.org/
Spring的核心功能是IoC和AOP。IoC更为核心。
IoC:Inversion of Control (控制反转)
AOP:Aspect Oriented Programming (面向方面编程)
IoC又称DI(Dependency Injection):依赖注入
Spring的IoC完成的功能:
配置文件中bean的初始化,这样就不需要我们手动的书写单粒模式、工厂模式等等。只需要根据我们的需要把一个类配置成单粒的还是多粒的。
可以把IoC看成是一个抽象工厂,可以创建出许多对象。不需要我们自己编写Singleton、Factory,都由IoC容器来创建对象、管理对象。
IoC其实很简单
以前我们写程序时,如果A类里需要调用B类方法——那A类就自己new一个B类的实例,然后再调用B类的方法。
这样做的不好就体现在:A类的代码和B类的代码以“硬编码“方式耦合了。
实现方式:
通常是采用XML配置文件、或Annotation注释管理的方式配置A和B之间的依赖关系——IoC容器就会根据配置管理,运用反射创建B类的实例,把B实例注入给A。这样A类就和B类的耦合分离开了。
Ioc是一种思想,具体的实现包括两种:依赖查找、依赖注入
依赖查找:需要调用相应的API,这样就会有依赖性,所以很少用。
IoC采用DI(Dependency Injection)技术:依赖注入
通过set()、get()、构造方法,对象new好之后,容器帮助把对象注入进来。
--------------------------------------------------------------------------------------------
AOP的全称是Aspect Oriented Programming,中文翻译成面向方面编程、面向切面编程。
AOP的缺省实现:jdk的动态代理机制。
JDK的动态代理机制。
静态代理:确实存在的。
动态代理:在运行期生成的。
JDK的动态代理机制术语:
目标对象(targetObjet):应用的业务逻辑处理对象。就是真实的实现类。
代理对象(Proxy Object):根据代理机制生成的对象,代理对象要以目标对象为基础。
横切性关注点(advice):
有一些方法,它可以独立出来。但是我们的业务逻辑执行的时候要执行这些额外的方法。
我们把这些独立出来的方法叫做横切性关注点。
这些横切性关注点可能散列在程序里,我们把它拿出来并且模块化。以后我们单独修改这些模块就可以了。
可见AOP就是面向对象的一个补充。模块化的这个类就叫切面类(Aspect)。
AOP管理的就是横切性关注点。
JDK的动态代理:
运行期生成
动态代理首先要实现一个接口:java.lang.reflect.InvocationHandler
代理对象和目标对象的接口是一致的。
切面类(Aspect)里包括:
横切性关注点(advice)的所有实现。
对横切性关注点模块化的这个类就叫做切面类。
advice分类:
before advice:加到方法之前
after advice:加到方法之后
切入点(pointcard)
有一些表达式,表示要把advice加入到目标对象的哪些方法里。
把切面应用到目标对象的方法上这个过程叫做支入(Weave)。
连接点(Joinpoint)
把切面应用到目标对象的方法上,这个方法叫做连接点。目前spring连接点只支持基于方法。
AOP的关键是发现横切性关注点,最后把这些关注点模块化成切面类。
实现AOP有多种方法:
1、采用jdk动态代理
2、使用CGLIB(字节码生成)
如果目标对象实现了接口,spring默认情况下会采用jdk的动态代理来实现AOP。
如果目标对象实现了接口,spring也可以强制使用CGLIB来实现AOP。(需要CGLIB库)
如果目标对象没有实现接口,必须使用CGLIB来实现AOP。