spring讲解3–IOC容器讲解
概念
IOC 其思想是反转资源获取的方向。不是主动的创建对象,而是从spring 容器中 拿所需要的对象。 容器主动的将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式接受资源,这种行为也被称为查找的被动形式。
DI 即组价以一些预先定义好的方式(setter方法)接受来自如容器的资源注入。
从代码上面分析概念:
class A{}
classB{
private A a;
public void setA(A a){
this.a = a;
}
}
平时的代码实现为:
A a = getA();
B a = getB();
b.set(a); 此时创建关系
加入IOC容器时,此时使用容器进行对象的注入。(从容器中获取B对象,并使B对象的a属性被赋值为容器中A对象的引用)
B b = getB(); //此时容器自动将A 自动注入到B中。
ClassPathXmlApplicationContext 类分析
在代码中光标在ApplicationContext上面,使用 ctrl + t,可以出现类所有的相关类。
从上图中发现,ApplicationContext为接口,下面有两个实现类。ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。
ApplicationContext的主要实现类: (1)ClassPathXmlApplicationContext:从类路径下加载配置文件
(2)FileSystemXmlApplicationContext 从文件系统中创建文件。
ConfigurableApplicationContext 扩展于ApplicationContext,新增加两个主要方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力。
spring容器
Spring提供了两种类型的IOX容器的实现
---BeanFactory IOC容器的基本实现,面向框架本身进行编程,是spring框架的基础设施,面向spring本身。
---ApplicationContext: 是BeanFactory的子接口。面向程序开发者。
从上面看,其实分为四层。
BeanFactory ---> ConfigurableApplocationContext--->ApplicationContext --> ClassPathXmlApplicationContext
获取对象方式
Object helloWorld = (HelloWorld)als.getBean("helloWorld"); //通过类指定的id获取对象
Object helloWorld2 = als.getBean("helloWorld",HelloWorld.class); //通过类名和id两者进行指定
Object helloWorld1 = als.getBean(HelloWorld.class); //直接通过类获取对象
!!!第二种方式进行对象创建的过程中,如果配置文件中出现bean指向同一个Class的时候,此时会出现异常。如:
<bean id="helloWorld" class="com.atspring.beans.HelloWorld">
<property name="name" value="spring"></property>
</bean>
<bean id="helloWorld1" class="com.atspring.beans.HelloWorld">
<property name="name" value="spring"></property>
</bean>