在对《Spring技术内幕》通读之后,终于对Spring IoC及AOP有了一点理解,以下为个人理解,如有不妥,欢迎大家指正,谢谢!
一、Spring IoC也称控制反转或依赖注入
理解:将对象的创建交给IoC容器进行管理(IoC容器也就是我们俗称的BeanFactory或者是ApplicationContext),由IoC容器负责引用对象的创建
传统的方法:
由于Demo类中包含User类(就是IoC中所称的依赖),如果Demo类的话就需要使用User类的话,必须由Demo类自己创建User类的一个实例来引用,User创建的由Demo进行控制,这个时候就产生了高度耦合。
缺陷:
1).如果后期修改了User的构造方法,那每个依赖User的类型可能都需要进行修改,这样就形成了代码的高度耦合了。
2).每new一个对象时需要消耗一定内存的,像具有几十或者几百个Bean时会对应用产生一定的压力。
代码示例:
package com.jeng.mvc.model;
import java.io.Serializable;
public class Demo implements Serializable {
private static final long serialVersionUID = -792765360926635161L;
private Long id;
private String name;
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Demo() {
super();
}
}
采用了Spring IoC技术:
IoC容器管理对象之间的依赖关系(对象的创建),由于Demo中提供User的set方法,IoC容器通过set方法将创建好的User对象注入到Demo中,此时Demo就可以通过getUser()获得User的引用,
代码示例:
package com.jeng.mvc.model;
import java.io.Serializable;
public class Demo implements Serializable {
private static final long serialVersionUID = -792765360926635161L;
private Long id;
private String name;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Demo() {
super();
}
}
优点:
1).IoC容器提供给依赖对象的接口setUser()和getUser()方法,由IoC容器负责依赖对象的创建,Demo只负责调用getUser()即可,不必关系对象的实例化,实现了松耦合
2).IoC容器还可对Bean做特殊的处理,比如定义Bean的单例模式等
总结:
A类包含B类(或A类依赖B类)
依赖注入就是由IoC容器负责A类的依赖关系中B类的实例化,并由IoC注入到B类中。
控制反转就是将原本属于A类实例化B类的控制,交给IoC容器进行实例化控制。