|
JavaEE
Servlet —— Smart Tomcat,以及一些访问出错可能的原因
Servlet —— Servlet API
目录
- Spring
- IoC (理解控制反转)
- 传统代码
- ioc代码
- DI
Spring
Spring 通常指的是 Spring Farmework (Spring 框架), 它是一个开源框架
用一句话来概括: Spring 是一个包含了众多工具方法的 Ioc 容器.
容器: 就是用来容纳某种物品的装置.
List /Map 是数据存储容器
Tomcat 是 web 容器
IoC: Inversion of Control
(控制反转). 也就是说 Spring 是一个 “控制反转” 的容器.
Spring
是一个 IoC
(控制反转) 容器, 他具备两个最基础的功能:
- 将对象存到容器(Spring) 中
- 从容器(Spring) 中取出对象
IoC (理解控制反转)
IoC: Inversion of Control (控制反转).
假如我们要构造一只 “鸟
” 的程序, 我们的思路是这样的:
传统代码
#
Bird.java
package old;
public class Bird {
private Feather feather;
public Bird() {
feather = new Feather();
}
public void init() {
System.out.println("执行了 bird init() 方法");
// 依赖羽毛
feather.init();
}
}
#
Feather.java
public class Feather {
private Body body;
public Feather() {
body = new Body();
}
public void init() {
System.out.println("执行了 feather init() 方法");
// 依赖身体
body.init();
}
}
#
Body.java
package old;
public class Body {
private Claws claws;
public Body() {
claws = new Claws();
}
public void init() {
System.out.println("执行了 body init() 方法");
// 依赖爪子
claws.init();
}
}
#
Claws.java
package old;
public class Claws {
public void init() {
System.out.println("执行了 claws init() 方法");
}
}
#
测试代码
package old;
public class App {
public static void main(String[] args) {
Bird bird = new Bird();
bird.init();
}
}
#
运行结果展示
#
此时如果我们想给爪子加一个颜色属性 , 我们更改了 Claws.java
中的代码, Body.java 中的代码也会报错. 我们就需要修改 Body.java , 然后更改 Feather.java…
我们可以看到, 传统代码, 存在耦合性问题.
ioc代码
#
Bird.java
package ioc;
public class Bird {
private Feather feather;
public Bird(Feather feather) {
this.feather = feather;
}
public void init() {
System.out.println("执行了 bird init() 方法");
// 依赖羽毛
feather.init();
}
}
#
Feather.java
package ioc;
public class Feather {
private Body body;
public Feather(Body body) {
this.body = body;
}
public void init() {
System.out.println("执行了 feather init() 方法");
// 依赖身体
body.init();
}
}
#
Body.java
package ioc;
public class Body {
private Claws claws;
public Body(Claws claws) {
this.claws = claws;
}
public void init() {
System.out.println("执行了 body init() 方法");
// 依赖爪子
claws.init();
}
}
#
Claws.java
package ioc;
public class Claws {
public Claws() {
}
public void init() {
System.out.println("执行了 claws init() 方法");
}
}
#
测试代码
package ioc;
public class App {
public static void main(String[] args) {
Claws claws = new Claws();
Body body = new Body(claws);
Feather feather = new Feather(body);
Bird bird = new Bird(feather);
bird.init();
}
}
#
运行结果展示
#
此时如果我们想给爪子加一个颜色属性 , 我们只需更改 Claws.java
中的代码
package ioc;
public class Claws {
private String color;
public Claws(String color) {
this.color = color;
}
public void init() {
System.out.println("执行了 claws init() 方法, color : " + color);
}
}
之后在测试代码中传入参数.
就可以成功添加属性. 降低了代码的耦合性.
对比
传统代码中对象的创建顺序是: Bird -> Feather -> Body -> Claws
控制反转之后对象的创建顺序是: Claws -> Body -> Feather -> Bird
下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC
的实现思想。
DI
DI : Denpendency Injection 的缩写, 翻译过来是 “依赖注入” 的意思. 在程序运行期间, 动态的将某个对象引入到当前的 行为机制.
IoC 和 DI 的关系
-
从广义上来说:
IoC = DI
, 是从不同的维度来描述同一个问题. -
从严格意义上来讲:
IoC
是一种设计思想, 最终还是要有可行的方案.DI
是具体的实现技术.
|
以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!