一. IOC
1.IOC概念
IOC全称Inversion of Control 翻译过来就是 “控制反转” 不是技术 而是一种设想 在Java开发中 IOC就是你把设计好的对象交给IOC这个容器控制 而不是传统的在你对象内直接控制(new)。
2.谁控制谁
传统的Java SE程序设计 直接在对象内部通过new进行创建对象 是程序主动去创建依赖对象;
IOC框架有一个专门的容器来创建对象--IOC容器 它来控制对象的创建;
IOC容器控制对象 控制的主要是外部资源的获取(获取对象、文件 等等)
3.(反转和正转)
传应用程序是由我们自己在对象中主动去直接获取依赖对象 这是正转;
而反转则是容器来帮忙创建并注入依赖对象 ;
4.为什么是反转?哪反转了?
因为容器帮我们查找并注入依赖对象 对象是被动的接受依赖对象 所以是反转;
依赖对象的获取被反转了;
5.IOC容器能做什么
(1)IOC不是一种技术 而是一种思想 一个重要的面向对象编程的法则 它知道我们如何设计出松耦合、更优良的程序。传统应用程序是由我们在类内部主动创建依赖对象 从而使类与类之间高耦合、难于测试;而有了IOC容器之后 把创建和查找依赖对象的权限交给IOC容器、由容器进行注入组合对象 所以对象与对象之间是松散耦合 这样也方便测试 利于功能复用 使程序的整体结构变得更加灵活。
(2)IOC编程带来的最大改变不是代码上 二十思想上 发生了“主从换位”的变化 本来应用程序是老大 要获取什么资源都是主动出击;但是在 IOC/DI 思想中 应用程序就变成被动的了 被动等待IOC容器来创建并注入它所要的资源了。
(3)IOC很好体现了面向对象设计法则之一 ——好莱坞法则“别找我们 我们找你”;
就是IOC找相应的依赖对象并注入 而不是由应用程序对象主动去找了。
二. DI
1.什么是DI
DI 全称 Dependency Injection,即“依赖注入” ----是组件之间依赖关系由容器在运行期决定的 即由容器动态的将某个依赖关系注入到组件中 依赖注入的目的并非为软件系统带来更多的功能而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
2.谁依赖谁
是某个容器管理对象依赖于IoC容器;
“被注入对象的对象” 依赖于 “依赖对象”
3.为什么需要依赖
容器管理对象需要IOC容器来提供对象需要的外部资源
4.谁注入谁
是IOC容器注入某个对象;
也就是注入“依赖对象”
5.注入了什么
注入某对象所需要的外部资源
(包括 对象、资源、常量数据)
6.依赖注入的三种实现方法
构造器注入,接口注入,Setter方法注入
构造器注入
Controller
public class FooController {
private final FooService fooService;
@Autowired
public FooController(FooService fooService) {
this.fooService = fooService;
}
}
接口注入 :依赖项提供了一个注入方法,该方法将把依赖项注入到传递给它的任何客户端中
public class ClassA {
private InterfaceB clzB;
public void doSomething() {
Ojbect obj=Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt()
}
}
setter注入
@Controller
public class FooController {
private FooService fooService;
@Autowired
public void setFooService(FooService fooService) {
this.fooService = fooService;
}
}
7.IOC和DI的关系
它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,依赖注入明确描述了被注入对象依赖IOC容器配置依赖对象。
AOP
1.什么是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源码的基础上,还能对源码进行前后增强。
2.解释
我们在WEB项目开发中,通常都遵守三层原则,包括控制层(Controller)->业务层(Service)->数据层(dao),那么从这个结构下来的为纵向,它具体的某一层就是我们所说的横向。我们的AOP就是可以作用于这某一个横向模块当中的所有方法。
3.切面,切点和通知
切面:拦截器类,其中会定义切点以及通知
切点:具体拦截的某个业务点。
通知:切面当中的方法,声明通知方法在目标业务层的执行位置
通知类型:
前置通知:@Before 在目标业务方法执行之前执行
后置通知:@After 在目标业务方法执行之后执行
返回通知:@AfterReturning 在目标业务方法返回结果之后执行
异常通知:@AfterThrowing 在目标业务方法抛出异常之后
环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行
4.实现原理:动态代理
1)代理模式的定义:给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
2)代理模式包含如下角色:
subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口;
RealSubject:真实主题角色,是实现抽象主题接口的类;
Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。
3)静态代理
静态代理的的代理类是我们自己定义好的,在程序运行之前就已经编译完成
4)动态代理
动态代理的代理类是在程序运行时创建的,相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
Spring框架
1.什么是Spring框架
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架
2.Spring的作用
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架
3.核心
1)IOC(Inversion of Control):控制反转,即对象创建的问题
2)AOP(Aspect Oriented Programming):面向切面编程
4.Spring的优点
……
5.创建bean的方式
(1)默认使用构造函数创建
在spring配置文件中使用bean标签 配置id和class属性后 没有其他属性和标签时 采用的是 默认构造函数创建bean对象 此时如果类中没有默认构造函数 则对象无法创建。
(2)类中的方法创建
(3)类中的静态方法创建