首页 > 其他 > 详细

IOC容器和Bean的配置

时间:2020-05-17 11:34:31      阅读:45      评论:0      收藏:0      [点我收藏+]
1、IOC和DI
1) IOC(Inversion of Control):反转控制
  在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
  反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
2) DI(Dependency Injection):依赖注入
  IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
总结: IOC 就是一种反转控制的思想, 而DI是对IOC的一种具体实现。
 
2、IOC容器在Spring中的实现
前提:  Spring中有IOC思想,  IOC思想必须基于 IOC容器来完成, 而IOC容器在最底层实质上就是一个对象工厂.
1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。
2)Spring提供了IOC容器的两种实现方式
① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
② ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。
 
ApplicationContext的主要实现类
  1) ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件
  2) FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件
  3) 在初始化时就创建单例的bean,也可以通过配置的方式指定创建的Bean是多实例的。
ConfigurableApplicationContext
  1) 是ApplicationContext的子接口,包含一些扩展方法
  2) refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。
WebApplicationContext
  1) 专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。
技术分享图片

3、通过类型获取bean

1) 从IOC容器中获取bean时,除了通过id值获取,还可以通过bean的类型获取。但如果同一个类型的bean在XML文件中配置了多个,则获取时会抛出异常,所以同一个类型的bean在容器中必须是唯一的。
HelloWorld helloWorld = cxt.getBean(HelloWorld. class);
2)  或者可以使用另外一个重载的方法,同时指定bean的id值和类型(推荐使用)
HelloWorld helloWorld = cxt.getBean(“helloWorld”,HelloWorld. class); 

 

4、给bean的属性赋值
1) 依赖注入的方式:通过bean的setXxx()方法赋值
       Hello World中使用的就是这种方式,注意属性名称,实际是通过set方法,所以属性名称在SET方法中首字母要大写。
技术分享图片

2). 通过bean的构造器赋值Spring自动匹配合适的构造器

-1)通过bean的构造器赋值

 

<bean id="book" class="com.atguigu.spring.bean.Book" >
           <constructor-arg value= "10010"/>
           <constructor-arg value= "Book01"/>
           <constructor-arg value= "Author01"/>
           <constructor-arg value= "20.2"/>
     </bean >

-2)通过索引值指定参数位置

<bean id="book" class="com.atguigu.spring.bean.Book" >
           <constructor-arg value= "10010" index ="0"/>
           <constructor-arg value= "Book01" index ="1"/>
           <constructor-arg value= "Author01" index ="2"/>
           <constructor-arg value= "20.2" index ="3"/>
     </bean >

-3)通过类型不同区分重载的构造器

<bean id="book" class="com.atguigu.spring.bean.Book" >
      <constructor-arg value= "10010" index ="0" type="java.lang.Integer" />
      <constructor-arg value= "Book01" index ="1" type="java.lang.String" />
      <constructor-arg value= "Author01" index ="2" type="java.lang.String" />
      <constructor-arg value= "20.2" index ="3" type="java.lang.Double" />
</bean >

3)、p名称空间

为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring 从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean 的属性使用p命名空间后,基于XML的配置方式将进一步简化。

<bean 
    id="studentSuper" 
    class="com.atguigu.helloworld.bean.Student"
    p:studentId="2002" p:stuName="Jerry2016" p:age="18" />

 

5、可以使用的值
1) 字面量      
  1) 可以使用字符串表示的值,可以通过value属性或value子节点的方式指定
  2) 基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
  3) 若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来

2)null值

<bean class="com.atguigu.spring.bean.Book" id="bookNull" >
           <property name= "bookId" value ="2000"/>
           <property name= "bookName">
               <null/>
           </property>
           <property name= "author" value ="nullAuthor"/>
           <property name= "price" value ="50"/>
     </bean >

3)给bean的级联属性赋值

<bean id="action" class="com.atguigu.spring.ref.Action">
          <property name="service" ref="service"/>
          <!-- 设置级联属性(了解) -->
          <property name="service.dao.dataSource" value="DBCP"/>
     </bean>

4)外部已声明的bean、引用其他的bean

    <bean id="s5" class="com.atguigu.spring.di.Student">
        <property name="id" value="10055"></property>
        <property name="name" value="张三三"></property>
        <property name="age" value="23"></property>
        <property name="sex" value="男"></property>
        <property name="teacher" ref="teacher"></property>   //引用外部的bean  teacher
        <property name="teacher.tname" value="小红"></property>
    </bean>
    
    <bean id="teacher" class="com.atguigu.spring.di.Teacher">
        <property name="tid" value="10000"></property>
        <property name="tname" value="小明"></property>
    </bean>

5)内部bean
bean实例仅仅给一个特定的属性使用时,可以将其声明为内部bean。内部bean声明直接包含在<property>或<constructor-arg>元素里。内部bean不能使用在任何其他地方

 

    <bean id="s6" class="com.atguigu.spring.di.Student">
        <property name="id" value="10066"></property>
        <property name="name" value="崔八"></property>
        <property name="age" value="18"></property>
        <property name="sex" value="男"></property>
        <property name="teacher">
            <bean id="tt" class="com.atguigu.spring.di.Teacher">
                <property name="tid" value="2222"></property>
                <property name="tname" value="admin"></property>
            </bean>
        </property>
    </bean>

 

 

6、集合属性

在Spring中可以通过一组内置的XML标签来配置集合属性,例如:<list>,<set>或<map>。

1)数组和List
 配置java.util.List类型的属性,需要指定<list>标签,在标签里包含一些元素。这些标签 可以通过<value>指定简单的常量值,通过<ref>指定对其他Bean的引用。通过<bean>指定内置bean定义。通过<null/>指定空元素。甚至可以内嵌其他集合。
 数组的定义和List一样,都使用<list>元素。
 配置java.util.Set需要使用<set>标签,定义的方法与List一样。

    <bean id="t1" class="com.atguigu.spring.di.Teacher">
        <property name="tid" value="10001"></property>
        <property name="tname" value="佟刚"></property>
        <property name="cls">
            <list>
                <value>A</value>
                <value>B</value>
                <value>C</value>
            </list>
        </property>
    </bean>
    
    <bean id="t2" class="com.atguigu.spring.di.Teacher">
        <property name="tid" value="10002"></property>
        <property name="tname" value="婷姐"></property>
        <property name="students">
            <list>
                <ref bean="s1"/>
                <ref bean="s2"/>
                <ref bean="s3"/>
            </list>
        </property>
    </bean>

2) Map
 Java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签。每个条目包含一个键和一个值。
 必须在<key>标签里定义键。
 因为键和值的类型没有限制,所以可以自由地为它们指定<value>、<ref>、<bean>或<null/>元素。
 可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义;bean引用通过key-ref和value-ref属性定义。

    <bean id="t3" class="com.atguigu.spring.di.Teacher">
        <property name="tid" value="10003"></property>
        <property name="tname" value="admin"></property>
        <property name="bossMap">
            <map>
                <entry>
                    <key>
                        <value>10001</value>
                    </key>
                    <value>佟老师</value>
                </entry>
                <entry>
                    <key>
                        <value>10002</value>
                    </key>
                    <value>陈老师</value>
                </entry>
            </map>
        </property>
    </bean>

3)集合类型的bean
 如果只能将集合对象配置在某个bean内部,则这个集合的配置将不能重用。我们需要 将集合bean的配置拿到外面,供其他bean引用。
 配置集合类型的bean需要引入util名称空间

<bean id="t4" class="com.atguigu.spring.di.Teacher">
        <property name="tid" value="10004"></property>
        <property name="tname" value="root"></property>
        <property name="students" ref="students"></property>
    </bean>
    
    <util:list id="students">
        <ref bean="s4"/>
        <ref bean="s5"/>
        <ref bean="s6"/>
    </util:list>
    
    <util:map id="map">
        <entry>
            <key>
                <value>1</value>
            </key>
            <value>张三</value>
        </entry>
    </util:map>

 

 

 

 

IOC容器和Bean的配置

原文:https://www.cnblogs.com/lemonzhang/p/12904381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!