1、什么是Spring IOC容器?
IOC(Inversion of Control)控制反转;它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
所谓的:“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期)。
2、控制反转(IOC)有什么作用?
- 管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要程序员来维护的话,那是相当复杂。
- 解耦,由容器其维护具体的对象。
- 托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的。
3、IOC的好处有哪些?
- 它将最小化应用程序中的代码量。
- 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例。
- 或JNDI查找机制。
- 它以最小的影响和最少的侵入机制促进松耦合,
- 它支持即时的实例化和延迟加载服务。
4、Spring的IOC支持哪些功能?
- 依赖注入(最重要)------从XML的配置上说,即ref标签。对应Spring RuntimeBeanReference对象
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调某些方法(但是需要实现Spring接口,略有侵入)
对于IOC来说,最终的就是容器。容器管理着Bean的生命周期,控制着Bean的依赖注入。
5、Spring IOC的实现机制
Spring中的IOC的实现原理就是工厂模式+反射机制。例如:
interface Fruit{
public abstract void eat();
}
class Apple implements Fruit{
public void eat(){
System.out.println("Apple");
}
}
class Orange implements Fruit{
public void eat(){
System.out.println("Orange");
}
}
class Factory {
public static Fruit getInstance(String ClassName){
Fruit f = null;
try {
f = (Fruit) Class.forName(ClassName).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return f;
}
}
class Client {
public static void main(String[] a){
Fruit f=Factory.getInstance("com.xxx.xxx.Apple");
if (f!=null){
f.eat();
}
}
}
6、ApplicationContext通常的实现是什么?
(1)FileSystemXmlApplicationContext:
此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
(2)ClassPathXmlApplicationContext:
此容器从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
(3)WebXmlApplicationContext:
此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
7、什么是Spring的依赖注入?
控制反转IOC有两种实现方式:依赖注入和依赖查找
依赖注入:相对于IOC而言,依赖注入(DI)更加准确地描述了IOC的设计理念。所谓依赖注入(Dependency Injection),即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做定位查询,只提供普通的java方法让容器去决定依赖关系。
8、构造器依赖注入和setter方法注入有什么区别?
构造函数注入 | setter注入 |
没有部分注入 | 有部分注入 |
不会覆盖setter属性 | 会覆盖setter属性 |
任意修改都会创建一个新实例 | 任意修改不会创建一个新实例 |
适用于设置很多属性 | 适用于设置少量属性 |
两种依赖方式都可以使用,构造器注入和setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。