众所周知,Spring的精髓是什么?没错,就是IOC(DI)和AOP。
AOP在之前已有记载,点击传送 Spring双生武魂之AOP
什么是IOC?
小白肯定不知道什么是IOC或者说DI,这里就直接白话,方便小白理解
IOC(Inversion of Control):控制反转
控制反转,我们需要知道的是反转的是资源获取方向的控制。这样理解,平时我们在写好一个类时,在实例化时需要new,那就是向容器发起资源请求,容器是收到请求后才被动的给我们资源。而应用IOC后,则变为容器主动来推送资源。
DI(Dependency Injection):依赖注入
通俗理解为我们准备了一些方式来接受容器给我们推过来的资源,例如我们常用的setter方法。
而Spring框架所做的事就是用IOC来管理bean,并且为程序直接提供bean实例。
以下从三个问题进入正题
怎样将我们的bean纳入IOC容器的管理?
首先准备一个类作为实例
public class HelloWorld {
private String name;
private int age;
public HelloWorld(){
System.out.println("正在调用HelloWorld的构造函数");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后将该bean在配置文件中“声明"(纳入IOC管理)
其中id就是该bean的名字,理解成给bean起名字就可以,class就是类的路径
property标签中做的就是依赖注入(注入属性),理解成给bean的属性赋值即可
怎样创建IOC容器?
Spring提供了两种方式实现,这里我们主要讲第二种
BeanFactory: IOC 容器的基本实现
ApplicationContext: 提供了更多的高级特性,是 BeanFactory 的子接口
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。(默认 spirng 容器中 的 bean 都是单例对象)
怎么从IOC容器中获取bean?
使用getbean()方法获取bean,其中的参数:
String:根据配置文件中的 ID 属性来获取 bean
Class:根据对象的类型来获取 bean
完整实例
public static void main(String[] args) {
//创建IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//getBean方法从容器中获取Bean
HelloWorld helloWorld =(HelloWorld) ioc.getBean("hello");
//调用方法测试
String name = helloWorld.getName();
System.out.println(name);
System.out.println(helloWorld.getAge());
}
结果:
可以看到容器确实给了我们一个bean的实例,而且该实例的属性也是通过依赖注入的方式进去的。因为在其中还有作者其他配置好的bean,同时也佐证了上文提到的在ApplicationContext初始化时,所有IOC管理的bean都进行了实例化!(而且默认是单例)
依赖注入(DI)
不要把依赖想得很复杂,初学阶段就理解为给bean中实例的属性赋值
注入的方式有三种,分别是:
1.通过属性注入
2.通过构造方法注入
3.通过工厂方法注入
通过属性
通俗来说就是在配置文件中写好,然后运行时程序就会注入,类似于上文的
通过构造方法
通俗来说就是,调用有参的构造方法进行注入,例如