`
逐客叫我
  • 浏览: 1889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring-- IOC容器详解(转)

 
阅读更多
Spring作为一个在java界广泛使用且评价颇高的一个开源框架,给我们提供了好多的功能,极大的方便了我们的开发。此处我介绍IOC容器和AOP概念。

        IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IOC容器主要使用DI方式实现的。不需要主动查找,对象的查找、定位和创建全部由容器管理。

       通俗点说就是不创建对象。以前我们要调用一个对象的方法,首先要new一个对象。但使用IOC容器,在代码中不直接与对象连接,而是在配置文件中描述要使用哪一个对象。容器负责将这些联系在一起。

       IOC容器的对象实例化是通过配置文件来实现的。术语上这叫做注入。注入有两种形式,采用构造方法注入和采用setter注入。具体的注入形式如下

采用set方法注入,给属性添加一个set方法,并对其进行赋值

publicclass UserManagerImplimplements UserManager {

    private UserDaouserDao;

    publicvoid setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

}

采用构造方法注入,在构造方法中对属性进行赋值

publicclass UserManagerImplimplements UserManager {

    private UserDaouserDao;

    public UserManagerImpl(UserDao userDao) {

        this.userDao = userDao;

    }

}

配置文件:

<beanid="userManager"class="com.bjpowernode.spring.manager.UserManagerImpl">

     <propertyname="userDao"ref="usrDao4Oracle"/>

  </bean>

配置文件:

<beanid="userManager"class="com.bjpowernode.spring.manager.UserManagerImpl">

    <constructor-argref="userDao4Mysql"/>

</bean>

set注入特点:

        与传统的JavaBean的写法更相似,程序员更容易理解、接受,通过setter方式设定依赖关系显得更加直观、明显;

        对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致死你功能下降。而使用设置注入,则避免这下问题;

       尤其在某些属性可选的情况下,多参数的构造器更加笨拙。



构造方法注入特点:

       构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。

<p LINE-HEIGHT= 25px" align="left">       对于依赖关系无须变化的Bean,构造注入更有用处;因为没有setter方法,所有的依赖关系全部在构造器内设定,因此,不用担心后续代码对依赖关系的破坏。
      依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则;



        建议采用以设置注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设置注入。

       此处我们说的普通属性的注入,但是还有一些列表,数组,map等类型的变量。我们看一下他们的注入形式:

01
<bean id="bean1" class="com.bjpowernode.spring.Bean1">
02
        <property name="strValue" value="Hello_Spring"/>
03
          
04
        <!--
05
        <property name="intValue" value="123"/>
06
         -->
07
        <property name="intValue">
08
            <value>123</value>
09
        </property>
10
          
11
        <property name="listValue">
12
            <list>
13
                <value>list1</value>
14
                <value>list2</value>
15
            </list>
16
        </property>
17
        <property name="setValue">
18
            <set>
19
                <value>set1</value>
20
                <value>set2</value>
21
            </set>
22
        </property>
23
        <property name="arrayValue">
24
            <list>
25
                <value>array1</value>
26
                <value>array2</value>
27
            </list>
28
        </property>
29
        <property name="mapValue">
30
            <map>
31
                <entry key="k1" value="v1"/>
32
                <entry key="k2" value="v2"/>
33
            </map>
34
        </property>
35
        <property name="dateValue" value="2009年12月14日" />
36
    </bean>
       spring中并不是所有类型的编辑器都实现好了,有些类型比如时间他就没有实现。需要我们自己去定义。如何自定义属性编辑器呢?首先,要继承 PropertyEditorSupport类,然后覆盖setAsText()方法,最后将自定义的属性编辑器注入到spring中
01
public class UtilDatePropertyEditorextends PropertyEditorSupport {
02

03
    private Stringpattern;
04

05
    @Override
06

07
    publicvoid setAsText(String text)throws IllegalArgumentException {
08

09
        System.out.println("---UtilDatePropertyEditor.setAsText()--->" + text);
10

11
        try {
12

13
            Date date = new SimpleDateFormat(pattern).parse(text);
14

15
            this.setValue(date);
16

17
        } catch (ParseException e) {
18

19
            e.printStackTrace();
20

21
            thrownew IllegalArgumentException(text);
22

23
        }
24

25
    }
26

27
    publicvoid setPattern(String pattern) {
28

29
        this.pattern = pattern;
30

31
    } 
32

33
}
       这里pattern匹配形式,我们采用的是set注入。配置文件中实现为:
01
<bean id="customEditors" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
02
        <property name="customEditors">
03
            <map>
04
                <entry key="java.util.Date">
05
                    <bean class="com.bjpowernode.spring.UtilDatePropertyEditor">
06
                        <property name="pattern" value="yyyy年MM月dd日"/>
07
                    </bean>
08
                </entry>
09
            </map>
10
        </property>
11
    </bean>
      从上面可以看出,配置文件中每一个类用bean标签来标识,属性用property来标识。如果属性多的话,配置文件也会很繁杂。有没有某种情况能够减少配置文件的一些设置呢?确实是可以的,如果几个bean都有相同的属性,那这些属性是可以抽象出来的。比如:
01
<bean id="AbstractBean"abstract="true">
02
        <propertyname="id"value="100"/>
03
        <propertyname="name"value="zhangsan"/>
04
        <propertyname="sex"value="nan"/>
05
</bean>  
06
<beanid="bean3"class="com.bjpowernode.spring.Bean3"parent="AbstractBean"/>
07
<beanid="bean4"class="com.bjpowernode.spring.Bean4"parent="AbstractBean">
08
     <propertyname="age">
09
          <value>90</value>
10
     </property>
11
</bean>
         bean3,bean4中有相同的属性,id,name,sex,则可以将其抽象出一个抽象bean,然后,在具体bean中指定其parent标签为抽象bean。
        我们都知道正则表达式,用一个统一的格式表示多种不同的字符。在IOC中也有类似的功能。有得时候某个对象中包含其他对象的属性。如果,这些属性名称 name间或者类型(具体的包名类名)有某种关系的话,是可以不用显示调用的。IOC容器自动就回去查找。如:

01
<beans ...
02
           default-autowire="byName"
03
           >
04
  
05
    <!-- 
06
    <bean id="bean2" class="com.bjpowernode.spring.Bean2">
07
        <property name="bean3" ref="bean3"/>  
08
        <property name="bean4">
09
            <ref bean="bean4"/>
10
        </property>
11
        <property name="bean5" ref="bean5"/>
12
    </bean>
13
    -->
14
  
15
    <bean id="bean2" class="com.bjpowernode.spring.Bean2"/>
01
<beans ...
02
           default-autowire="byType"
03
           >
04
  
05
    <!-- 
06
    <bean id="bean2" class="com.bjpowernode.spring.Bean2">
07
        <property name="bean3" ref="bean3"/>  
08
        <property name="bean4">
09
            <ref bean="bean4"/>
10
        </property>
11
        <property name="bean5" ref="bean5"/>
12
    </bean>
13
    -->
14
  
15
    <bean id="bean2" class="com.bjpowernode.spring.Bean2"/>
16
  
17
    <bean id="bean322" class="com.bjpowernode.spring.Bean3">
18
        <property name="id" value="100"/>
19
        <property name="name" value="zhangsan"/>
20
        <property name="sex" value="nan"/>
21
    </bean>
        IOC容器实现的bean配置与我们在代码中new实例达到的效果是一样的。那我们实例化的时候,可以采用单例模式,只保证有一个实例在运行,也可以多个实例运行。IOC容器中有这种配置吗?当然有,那就是bean的scope作用域。singleton默认值,每次调用getBean()向IOC容器中取得的对象是相同的。即单例。而prototype,则是每次调用getBean()向IOC容器中取得对象是不相同的。即相当于普通的实例化。
<bean id="bean1"class="com.bjpowernode.spring.Bean1"scope="prototype"/>
或者

<bean id="bean1"class="com.bjpowernode.spring.Bean1"scope="singleton"/>

         通过IOC控制反转,大量减少了Factory和Singleton的数量,使代码层次更加清晰。Spring的IOC容器是一个轻量级的容器,没有侵入性,不需要依赖容器的API,也不需要实现一些特殊接口。而一个合理的设计最好尽量避免侵入性。减少了代码中的耦合,将耦合推迟到了配置文件中,发生了变化也更容易控制。

地址:http://www.open-open.com/lib/view/open1338175365089.html
分享到:
评论

相关推荐

    maven-spring-ioc

    IoC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖关系。在本教程中,我们将深入探讨Spring如何通过配置文件实现IoC。 ### 1. Spring IoC概述 IoC(Inversion of Control)是一种设计原则,它将控制...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘3.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘4.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘2.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘1.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC(Inversion of Control,控制反转)实现原理之 IOC 初始化流程。IOC 是一种软件设计模式,用于将软件系统中...

    Spring - 2 IoC

    ### Spring - 2 IoC #### 一、Spring与IoC概念详解 ...通过以上内容的学习,我们可以了解到Spring框架中IoC容器的基本概念、设计模式、实现方式以及具体的使用案例。这有助于更好地理解和应用Spring框架中的IoC技术。

    官方完整包 spring-framework-5.3.7.RELEASE-dist.zip

    - 配置Spring的IoC容器,可以使用XML配置或Java配置。 - 开发业务逻辑,利用Spring的依赖注入和AOP特性。 - 如果涉及Web开发,可以配置Spring MVC并创建控制器。 - 运行应用程序,并使用Spring提供的测试工具...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    ### Spring IoC容器详解 Spring提供了两种类型的IoC容器:`BeanFactory`和`ApplicationContext`。 #### 1. 核心容器 - **BeanFactory**:这是一个较低级别的容器,功能相对较少,采用懒加载的方式,在实际需要...

    spring-core3.2.5集合包

    1. **IoC(Inversion of Control)容器**:Spring 的核心是 IoC 容器,它负责管理应用程序的对象及其依赖关系。通过反转控制,开发者不再手动创建对象,而是将配置交由 IoC 容器处理,提升了代码的可测试性和可维护...

    coco-spring-ioc

    《简易Spring-ioc详解》 在Java开发领域,Spring框架以其强大的功能和广泛的应用而备受开发者喜爱。...此外,掌握这些核心概念后,无论是使用Spring框架还是其他类似的IoC容器,都将更加得心应手。

    Spring-IOC实例

    Spring的IoC容器不仅管理Bean的生命周期,还支持AOP,允许我们在不修改源代码的情况下,对方法进行增强或拦截。这在日志记录、事务管理等方面非常有用。 总结,Spring-IOC实例展示了如何利用Spring框架进行对象的...

    Spring 的DI和IoC实例详解(转)

    在Spring框架中,IoC容器是实现这些概念的核心组件。它负责创建对象,管理它们的生命周期,以及处理对象之间的依赖关系。IoC容器通过XML配置文件或注解来定义对象的创建和依赖关系。例如,我们可以创建一个Bean定义...

    Spring-MyBatis-Ajax重点详解

    IoC/DI 容器、Spring 框架、MyBatis、Ajax 相关知识点总结 IoC/DI 容器是一种设计思想,意味着将设计好的对象交给 Spring 容器控制,而不是传统的在对象内部直接控制。IoC/DI 容器主要控制了外部资源获取(不只是...

    spring-framework-3.0.RELEASE

    1. **spring-core**:核心工具包,提供基本的Spring功能,包括IoC容器和基本的类型转换。 2. **spring-context**:包含应用程序上下文,是DI容器的核心,提供事件、国际化、资源加载等功能。 3. **spring-beans**...

    spring-4.3.21.RELEASE.rar

    "spring-beans-4.3.21.RELEASE-javadoc.jar"提供了Spring的Bean工厂,它是IoC容器的基础,负责创建、配置和管理对象,实现依赖注入。 "spring-core-4.3.21.RELEASE-javadoc.jar"和"spring-core-4.3.21.RELEASE.jar...

    官方原版完整包 spring-framework-5.3.2.RELEASE.zip

    其中,IoC容器是Spring的基础,它管理着应用中的对象及其依赖关系,使得代码更加松耦合,易于测试和维护。AOP则是Spring提供的一种处理横切关注点的方式,比如日志、事务管理等,可以被模块化并独立于业务逻辑。 在...

    Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计.doc

    首先,Spring的IoC容器基于BeanFactory接口,这是容器的基础规范,它定义了如何管理和创建Bean。BeanFactory提供了诸如获取Bean实例、判断Bean是否存在等基本操作。BeanFactory的扩展接口包括ListableBeanFactory...

Global site tag (gtag.js) - Google Analytics