IOC、Spring的IOC

来源:互联网 发布:mac软件删不掉 编辑:程序博客网 时间:2024/04/29 23:43
一:概念:
IoC就是Inversion of Control,控制反转也叫依赖注入(Dependency Injection)。
1.IOC 概念定义: 类之间的依赖关系,不再由类自己去负责,而是由容器根据配置文件去创建实例并维护各个实例之间的依赖关系。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
2.优点:
(1):避免了代码的纠缠,(业务逻辑和业务逻辑无关的代码纠缠到一块)代码更容易被维护
(2):模块的耦合性降低
(3):易测试

 二:Spring中实现IOC的方式:

  1:Spring中依赖注入的两种方式:

 (1):通过 setter 方法注入: 

          <property name=“ ” ></property>

    其中,name属性的取值依setter方法名而定,要求这个类里面这个对应的属性必须有setter方法

 (2):通过构造方法注入: 

          <constructor-arg index=””></ constructor-arg>

     其中,index表示构造方法中的参数索引(第一个参数索引为0)

     要求这个类里面必须有想对应的构造方法

(3):实现接口

注:使用注解---是面向接口的,但是不能说成是Spring的IOC实现的方式,Spring的IOC实现依赖注入的方式只有上面的三种。

2:三者使用区别:
        constructor : 可以在构建对象的同时,把依赖关系也构建好。对象创建好就准备好的所有的资源。安全性高。 

        setter : 建立的对象关系(参数)很多。创建完对象之后再同过set()方法进行设定。 

        Spring 鼓励使用setter的方式注入。
接口因为历史悠久,在很多容器中都已经得到了应用,但由于其在灵活性,易用性上不如其他两种方式,索引在IOC使用上并不被看好。
三:容器对bean属性的装配 

   1. 基本类型和字符串类型属性的装配(value): 

     <property name="owner">

          <value>张三</value>

     </property> 

    2. 引用类型属性的装配 


     <property>

       <ref bean="otherBean" />

     </property>


  (1)ref: local 只在当前配置文件中找
  (2)ref:bean 在所有的配置文件中
  (3)直接把另外一个bean的定义,定义在一个bean里面。

   相当于定义了个内部类,但是客户端就不可见内部定义的bean 

    3. 集合类型属性的装配

  (1)list:可以混合存放各种类型,支持泛型,存放的数据是有序的,可以有重复,
  (2)set:可以混合存放各种类型,支持泛型,存放的数据是无序的,不可以重复
  (3)map:支持泛型,存放键值对。
  (4)props:本质上也是一个map,但是键值都是字符串类型的。

     例子: 

             <property name="listProperty">

            <list>

                <value>zhangsan</value>

                <value>zhangsan</value>

                <value>zhangsan</value>

            </list>

        </property>
        <property name="setProperty">

            <set>

                <value>str</value>

                <value>str</value>

                <value>str1</value>

            </set>

        </property>

        <property name="mapProperty">

            <map>

                <entry key="key1">

                    <value>value1</value>

                </entry>

                <entry key="key2">

                    <value>value2</value>

                </entry>

            </map>

        </property>
        <property name="proProperty">

            <props>

            <prop key="key1">value1</prop>

            <prop key="key2">value2</prop>

            <prop key="key3">value3</prop>

            </props>

        </property>

四:bean 的其他属性介绍 

   1. 自动装配 (bean标签的autowire属性):

作用:不明确配置,自动将某个bean 注入到另一个bean的属性当中

分类:

     (1)byname:通过id 的名字来进行匹配,

     (2)byType:通过类型来进行匹配

     (3)constructor:根据java 源程序中定义的构造方法,再根据类型进行匹配。

     (4)autodetect:完全交给spring管理,    spring 则再根据constructor à byType的顺序进行匹配。
注:

       自动装配的优先级低于手动装配

       自动装配一般应用于快速开发中,但是不推荐使用,代码简单,但是一方面容易出错,另一方面也不方便后期的维护 
五:bean实例的生命周期及范围 

   1. Bean的生命周期:
(1)实例化(必须的)构造函数构造对象

  (2)装配(可选的)为属性赋值

  (3)回调(可选的)(容器-控制类和组件-回调类)

  (4)初始化(init-method=" ")

  (5)就绪

  (6)销毁(destroy-method=" ")

    2. bean的范围

Bean:默认情况下,容器是按照单例的方式去创建的bean,如果不想使用那么用(scope=" ")定义bean的使用范围 

          Bean的范围有(经常使用的是前两种):

  (1)Singleton:默认的

  (2)Prototype:每次取出的都是新的对象

  (3)Request:bean的生命周期和一个http请求一直

  (4)session:在一个会话周期中有效

六:IOC中其他接口的使用 

  1. Beanpostprocessor:(后处理bean)在对象实例化后,进行方法调用前进行特殊处理

  2. BeanFactoryPostProcessor:在实例化对象前,对配置文件进行特殊处理

  3. PropertyeditorSupport :属性编辑器类

可以根据定义的规则,将字符串类型自动编辑成一个对象类型来进行属性注入。

  4. PropertyPlaceholderConfigurer:

方便分散配置的一个类,可以读取配置文件,以${key}获得对应的value值

  5. CustomEditorConfigurer:配置用户自定义的属性编辑器 

   例:
     <bean

       class="org.springframework.beans.factory.config

                .PropertyPlaceholderConfigurer">

       <property name="location">

          <value>ioc\\info.properties</value>

       </property>

     </bean>

<bean id="customEditorConfigurer" 

       class="org.springframework.beans.factory.config

                .CustomEditorConfigurer">

       <property name="customEditors">

         <map>

           <entry key="ioc9.Address">

             <bean id="myEditor"class="ioc9.AddressEditor">

             </bean>

           </entry>

         </map>

       </property>

     </bean>

七:Spring的事件处理机制:(监听机制)

1. 自定义一个事件,需要实现接口ApplicationEvent


   2. 定义一个监听器,需要实现接口ApplicationListener


   3. bean调用容器的方法,发布事件,需要实接口ApplicationContextAware,来获得对容器的引用
0 0