Spring IOC机制
2014-04-30 09:47
337 查看
提到spring,第一印象就是DI与IOC,虽然有概念上的解释,但是要理解这些概念还是需要动手进行试验
。如果要深入了解spring的原理,那么最先了解得就应该是spring容器。Spring提供了两种类型的IOC容
器实现:
1.beanFactory: IOC 容器的基本实现。
2.ApplicationContext: 提供了更多的高级特性,是beanFactory的子接口。
在spring的应用中,经常见到的代码就是如下典型的从容器中获取bean实例的代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
OrderService service = (OrderService)ctx.getbean("personService");
第一行代码就是创建一个IOC容器的实例。BeanFactory、ApplicationContext只是接口,在应用中
需要实例化其实现类。ApplicationContext实现类有以下三种是经常要用到的:
ClassPathXmlApplicationContext: 从 classpath 下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
XmlWebApplicationContext: 只能用于 web 应用
无论使用何种方式, 配置文件时相同的。但是由于ApplicationContext提供了更多的附加功能,比
如它提供了文本信息解析工具、载入资源的通用方法等等,所以使用的时候大部分都是用该接口。在web
应用中通常都是通过ClassPathXmlApplicationContext去类路径下加载配置文件,生成一个IOC容器并管
理配置文件中配置的bean。
Spring提供了强大的IOC容器来管理组成应用程序中的bean(组件)。要利用容器提供的服务,就必须
配置bean,让这些bean运行在Spring IOC容器中。为了让Spring IOC 容器能够对bean进行实例化,每个
bean 都应该提供一个唯一的名称和一个全限定类名。例如下面三种方式实例化bean:
1.使用类构造器实例化
<bean id="orderService" class="cn.itcast.OrderServiceBean"/>
2.使用静态工厂方法实例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-
method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用实例工厂方法实例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-
method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
第一种方法,IOC容易直接根据配置文件中的class属性通过反射创建一个实例,使用的是该类的默
认构造方法。第二种则是调用class指定的工厂类的工厂方法,来返回一个相应的bean实例,值得注意的
是工厂类的方法是静态方法,所以不用产生工厂本身的实例。而第三种则不同,它除了配置与第二种相
同外,唯一的不同就是方法不是静态的,所以创建bean的实例对象时需要先生成工厂类的实例。
实例了bean对象时,需要对其中的属性也进行赋值,这时就是经常被提及的依赖注入。对bean的每
个简单类型的属性来说,可以为其制定<value>元素。Spring会尝试将值转换为该属性的声明类型。比较
常用的有:
1.setter注入使用<property>元素,使用name属性指定bean的属性名称。优点: setter 方法可以
自动生成,简单。缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能
会因为 setter 方法的调用而被修改。
2.构造器注入在 <constructor-arg>元素里声明属性,因为构造器的参数是基于位置的, 所以
<constructor-arg>中没有name属性。优点: 解决了setter注入的缺点。缺点: 需通过参数位置来确定参
数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长。
IOC容器里可能会声明很多的bean,这些bean之间的依赖关系通常会比较复杂。使用setter注入并不
能保证属性一定会被注入。spring通过依赖检查来检查属性:
1.Spring 的依赖检查特性可以检查bean上的某些类型的所有属性是否被设置。
2.Spring 的依赖检查特性只需在<bean>的dependency-check 属性里指定依赖检查模式即可。
3.Spring 的依赖检查特性只能检查属性是否被设置,但对设置的属性值是 null 的情况则无能为力
。
4.Spring 的依赖检查特性只对属性是否通过 setter 方法设置进行检查。 所以, 即使通过构造器
注入,依然会抛出异常。
以上是通过配置文件来检查,另外一种方式就是通过@Required注解检查属性。Spring的依赖检查特
性只能检查某些类型的所有属性。不能只针对个别属性进行检查。
RequiredAnnotationbeanPostProcessor 是Spring的bean后置处理器,它检查所有具有@Required注解的
属性是否已被设置。bean后置处理器是一种特殊类型的Spring bean,它能够在每个bean实例化后执行一
些额外的工作。要激活bean后置处理器来进行属性检查,必须在Spring IOC容器里注册它。
RequiredAnnotationbeanPostProcessor只能检查属性是否被设置,但对设置的属性值是 null 的情况则
无能为力。
这篇文章让我比较深入的理解了Spring IOC的实现机制。 http://jvortex.blog.163.com/blog/static/1696189002011625111530750/?fromdm&fromSearch&isFromSearchEngine=yes
。如果要深入了解spring的原理,那么最先了解得就应该是spring容器。Spring提供了两种类型的IOC容
器实现:
1.beanFactory: IOC 容器的基本实现。
2.ApplicationContext: 提供了更多的高级特性,是beanFactory的子接口。
在spring的应用中,经常见到的代码就是如下典型的从容器中获取bean实例的代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
OrderService service = (OrderService)ctx.getbean("personService");
第一行代码就是创建一个IOC容器的实例。BeanFactory、ApplicationContext只是接口,在应用中
需要实例化其实现类。ApplicationContext实现类有以下三种是经常要用到的:
ClassPathXmlApplicationContext: 从 classpath 下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
XmlWebApplicationContext: 只能用于 web 应用
无论使用何种方式, 配置文件时相同的。但是由于ApplicationContext提供了更多的附加功能,比
如它提供了文本信息解析工具、载入资源的通用方法等等,所以使用的时候大部分都是用该接口。在web
应用中通常都是通过ClassPathXmlApplicationContext去类路径下加载配置文件,生成一个IOC容器并管
理配置文件中配置的bean。
Spring提供了强大的IOC容器来管理组成应用程序中的bean(组件)。要利用容器提供的服务,就必须
配置bean,让这些bean运行在Spring IOC容器中。为了让Spring IOC 容器能够对bean进行实例化,每个
bean 都应该提供一个唯一的名称和一个全限定类名。例如下面三种方式实例化bean:
1.使用类构造器实例化
<bean id="orderService" class="cn.itcast.OrderServiceBean"/>
2.使用静态工厂方法实例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-
method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用实例工厂方法实例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-
method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
第一种方法,IOC容易直接根据配置文件中的class属性通过反射创建一个实例,使用的是该类的默
认构造方法。第二种则是调用class指定的工厂类的工厂方法,来返回一个相应的bean实例,值得注意的
是工厂类的方法是静态方法,所以不用产生工厂本身的实例。而第三种则不同,它除了配置与第二种相
同外,唯一的不同就是方法不是静态的,所以创建bean的实例对象时需要先生成工厂类的实例。
实例了bean对象时,需要对其中的属性也进行赋值,这时就是经常被提及的依赖注入。对bean的每
个简单类型的属性来说,可以为其制定<value>元素。Spring会尝试将值转换为该属性的声明类型。比较
常用的有:
1.setter注入使用<property>元素,使用name属性指定bean的属性名称。优点: setter 方法可以
自动生成,简单。缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能
会因为 setter 方法的调用而被修改。
2.构造器注入在 <constructor-arg>元素里声明属性,因为构造器的参数是基于位置的, 所以
<constructor-arg>中没有name属性。优点: 解决了setter注入的缺点。缺点: 需通过参数位置来确定参
数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长。
IOC容器里可能会声明很多的bean,这些bean之间的依赖关系通常会比较复杂。使用setter注入并不
能保证属性一定会被注入。spring通过依赖检查来检查属性:
1.Spring 的依赖检查特性可以检查bean上的某些类型的所有属性是否被设置。
2.Spring 的依赖检查特性只需在<bean>的dependency-check 属性里指定依赖检查模式即可。
3.Spring 的依赖检查特性只能检查属性是否被设置,但对设置的属性值是 null 的情况则无能为力
。
4.Spring 的依赖检查特性只对属性是否通过 setter 方法设置进行检查。 所以, 即使通过构造器
注入,依然会抛出异常。
以上是通过配置文件来检查,另外一种方式就是通过@Required注解检查属性。Spring的依赖检查特
性只能检查某些类型的所有属性。不能只针对个别属性进行检查。
RequiredAnnotationbeanPostProcessor 是Spring的bean后置处理器,它检查所有具有@Required注解的
属性是否已被设置。bean后置处理器是一种特殊类型的Spring bean,它能够在每个bean实例化后执行一
些额外的工作。要激活bean后置处理器来进行属性检查,必须在Spring IOC容器里注册它。
RequiredAnnotationbeanPostProcessor只能检查属性是否被设置,但对设置的属性值是 null 的情况则
无能为力。
这篇文章让我比较深入的理解了Spring IOC的实现机制。 http://jvortex.blog.163.com/blog/static/1696189002011625111530750/?fromdm&fromSearch&isFromSearchEngine=yes
相关文章推荐
- spring之Ioc机制
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- spring IOC三种机制
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- Spring的IOC(控制反转)和 DI(依赖注入)机制
- SpringIoC机制的实现原理
- Spring中的IOC(四):IOC中其他接口的使用及Spring的事件处理机制(监听机制)
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 通过DefaultListableBeanFactory加载.xml配置文件学习Spring-IoC容器注册/加载bean的机制(源码走读)
- Spring AOP实现机制(二)--ProxyFactoryBean---将Spring AOP和Spring IoC容器相结合
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- Spring基础(IOC原理和反射机制+JavaBean)
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- Spring原理机制资源汇总(控制反转(IoC)与依赖注入(DI)主题)
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- spring的ioc机制
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
- Spring核心机制--IoC