Spring 中的IoC怎么理解实例源码讲解

Spring 中的IoC怎么理解实例源码讲解,

  1. 开源框架Spring详解—IoC的深刻理解
  2. 作者:z_xiaofei168
  3.        有一段时间没有接触spring了,感觉有点陌生了,今天总结了一下关于IoC的一些知识点,虽然是学过spring了,但是如果不经常使用,知识点是连接不起来的。所以今天我特意做了这个总结。相信对大家有一定的帮助。以便我们可以共同学习,共同进步。
  4. Ioc的理解
  5.          1、依赖注入的概念
  6.          spring的两个核心概念:一个是控制反转IoC,也可以叫做依赖注入DI。还有一个是面向切面编程AOP。
  7.          控制反转:当某个java对象需要(依赖)另一个java对象时,不是自身直接创建依赖对象,而是由实现IoC的容器(如spring框架的IoC容器)来创建,并将它注入需要这个依赖对象的java对象中。
  8.          2、spring的依赖注入
  9.                    2.1、构造器注入
  10.                    <bean id=”accoutDaoImpl” class=”cn.csdn.dao.AccoutDaoImpl” scope=”singleton”/>
  11.                    <bean id=”accoutServicImpl” class=”cn.csdn.service.AccoutServicImpl” scope=””>
  12.                             <!– 构造器注入方式 –>
  13.                             <constructor-arg ref=”accoutDaoImpl”/>
  14.                    </bean>
  15.                    2.2、设值(set方法)注入
  16.                    <bean id=”accountDaoImpl” class=”cn.csdn.dao.AccoutDaoImpl”/>
  17.                    <bean id=”accoutServicImpl” class=”cn.csdn.service.AccoutServicImpl”>
  18.                             <!– 设值(set方法)注入 –>
  19.                             <property name=”accountDaoImpl” ref=”accoutDaoImpl”/>
  20.                    </bean>
  21.          3、spring的容器
  22.          spring管理的基本单元是Bean,在spring的应用中,所以的组件都是一个个的Bean,它可以是任何的java对象。spring负责创建这些Bean的实例。并管理生命周期。而spring框架是通过其内置的容器来完成Bean的管理的,Bean在spring的容器中生存着,使用时只需要通过它提供的一些方法从其中获取即可
  23.          spring的容器有两个接口:BeanFactory 和  ApplicationContext 这两个接口的实例被陈为spring的上下文。
  24.          ApplicationContext ac = new ClassFathXmlApplicationContext(“app*.xml”);
  25.          AccountService accountService = (AccountService)ac.getBean(“accountServiceImpl”);
  26.          4、使用xml装配Bean
  27.                    4.1、装配Bean
  28.                             id:指定该Bean的唯一标识。
  29.                             class:指定该Bean的全限定名。
  30.                             name:为该Bean指定一到多个别名。多个别名可以用“,”和“;”分割。
  31.                             autowire:指定该Bean的属性的装配方式。
  32.                             scope:指定该Bean的存在。
  33.                             init-method:指定该Bean的初始化方法。
  34.                             destroy-method:指定该Bean的销毁方法。
  35.                             abstract:指定该Bean是否为抽象的。如果是抽象的,则spring不为它创建实例。
  36.                             parent:指定该Bean的父类标志或别名。
  37.                    4.2、装配Bean的各种类型属性值
  38.                             1>.简单类型属性值的装配
  39.                             <bean id=”bean1″ class=”cn.csdn.domain.Bean1″>
  40.                                      <property name=”name” value=”z_xiaofei168″/>
  41.                                      <property name=”age”>
  42.                                                <value>22</value>
  43.                                      </property>
  44.                             </bean>
  45.                             2>.引用其他Bean的装配
  46.                             <bean id=”bean1″ class=”cn.csdn.domain.Bean1″>
  47.                                      …
  48.                             </bean>
  49.                             <bean id=”bean2″ class=”cn.csdn.domain.Bean2″>
  50.                                      <!– 引用自其他Bean的装配 –>
  51.                                      <property name=”bean1″ ref=”bean1″/>
  52.                             </bean>
  53.                             另外一种不常使用的配置方式是在property元素中嵌入一个bean元素来指定所引用的Bean.
  54.                             <bean id=”bean1″ class=”cn.csdn.domain.Bean1″>
  55.                                      …
  56.                             </bean>
  57.                             <bean id=”bean2″ class=”cn.csdn.domain.Bean2″>
  58.                                      <!– 引用自其他Bean的装配 –>
  59.                                      <property name=”bean1″>
  60.                                                <bean id=”bean1″ class=”cn.csdn.domain.Bean1″/>
  61.                                      </property>
  62.                             </bean>
  63.                   4.3、自动装配
  64.                             no:不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指
  65. 定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
  66.                             <bean id=”bean1″ class=”cn.csdn.service.Bean1″ scope=”singleton”>
  67.                                      <property name=”studentDaoImpl” ref=”studentDaoImpl”>
  68.                                      </property>
  69.                             </bean>
  70.                             备注:有property属性  指定ref
  71.                             byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
  72.                             <bean id=”bean1″ class=”cn.csdn.service.Bean1″ scope=”singleton” autowire=”byName”/>
  73.                             备注:没有property属性
  74.                             byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check=”objects”让Spring抛出异常。
  75. 备注:spring3.0以上不抛异常。
  76.                             <bean id=”bean1″ class=”cn.csdn.service.Bean1″ scope=”singleton” autowire=”byType”/>
  77.                             备注:没有property属性
  78.                             Constructor:与byType的方式类似,不同之处在于它应用于构造器参数。如果
  79. 在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
  80.                             <bean id=”bean1″ class=”cn.csdn.service.Bean1″ scope=”singleton” autowire=”constructor”/>
  81.                             备注:没有property属性
  82.                             autodetect:通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
  83.                             <bean id=”bean1″ class=”cn.csdn.service.Bean1″ scope=”singleton” autowire=”autodetect”/>
  84.                   4.4、指定Bean的存在范围
  85.                             singleton:在每个Spring IoC容器中一个bean定义对应一个对象实例。这是默认值
  86.                             prototype:每次对Bean请求时都会创建一个Bean定义对应一个实例。一个Bean定义多个实例。
  87.                             request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  88.                             session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  89.                             global_session:在一个全局的HTTP Session中,一个bean定义对应一个实例。
  90. 典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  91.                    4.5、指定Bean的初始化和销毁
  92.                             Spring可以管理Bean实例在实例化结束之后和被销毁之前的行为。通过property的init-method属性可以指定某个方法应该在Bean全部依赖关系设置结束后自动执行;通过property的destroy-method属性可以指定某个方法应该在Bean被销毁之前自动执行。
  93.                             public class Bean{
  94.                             public String name;
  95.                             public Bean(){
  96.                             system.out.println(“调用默认构造方法”);
  97. }
  98. public void setName(){
  99.          system.out.println(“执行setName()方法”);
  100.          this.name=name;
  101. }
  102. public String getName(){
  103.          return name;
  104. }
  105. public void init(){
  106.          system.out.println(“执行初始化方法”);
  107. }
  108. public void destroy(){
  109.          system.out.println(“执行销毁方法”);
  110. }
  111. }
  112. 配置文件
  113. <bean id=”bean1” class=”cn.csdn.service.Bean1” scope=”singleton” init-method=”init” destroy-method=”destroy”>
  114.          <property name=”name” value=”z_xiaofei168/>”
  115. </bean>
  116. 执行结果:
  117. 调用默认构造方法
  118. 执行setName()方法
  119. 执行初始化方法
  120.                    4.6、装配Bean的继承
  121.                             如果两个Bean的属性装配信息很相似,那么可以利用继承来减少重复的配置工作。
  122.                             <!– 装配Bean的继承
  123. 父类作为模板,不需要实例化,设置abstract=”true”–>
  124.          `                 <bean id=”parent” class=”cn.csdn.service.Parent” abstract=”true”>
  125.                             <property name=”name” value=”z_xiaofei168”/>
  126. <property name=”pass” value=”z_xiaofei168”/>
  127. </bean>
  128. <!– 装配Bean的继承
  129. 子类中用parent属性指定父类标识或别名
  130. 子类可以覆盖父类的属性装配,也可以新增自己的属性装配–>
  131.          `                 <bean id=”child” class=”cn.csdn.service.Chlid” parent=”parent”>
  132.                             <property name=”pass” value=”123123”/>
  133. <property name=”age” value=”22”/>
  134. </bean>
本文链接地址: Spring 中的IoC怎么理解实例源码讲解