Spring的IOC依赖控制反转(佟刚)

本文介绍了Spring框架的基础知识,包括其特点与优势,并详细解析了Spring的依赖注入(DI)、面向切面编程(AOP)、配置文件编写、Bean的自动装配及作用域配置等内容。
学习 spring 了.大家都知道 spring 在项目中是首先啊.用起来很方便,给我提供了许多的开发支持.使用容易,可是要知道它的工作细节就难了.都知道传智播客的讲课风格,很深.呵呵,非常合我 的胃口.在学习中学的深一点,在上班的时候碰到问题就不会荒.总那些只会写点 helloWorld 的,就认为自己不错了的,要强很多.

1.spring 
Spring 是一个开源框架.和前面我们学习的 struts 和 hibernate 是一样的开源框架.它们三个放在一起是经典的组合SSH.
我们使用Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
优点:
轻量级. 整个大小可以打成一个 2.5 MB 的 jar 包, 而且 Spring 的处理开支也很小.
Spring 是非侵入性的: 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
依赖注入(DI --- dependency injection)
面向切面编程(AOP --- aspect oriented programming)
容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 文件组合这些对象

2.Spring IDE 的 Eclipse插件的安装: 
和前面我们使用的 struts 和 hibernate 的插件安装是一样的.安装上只有就有提示功能了.要不然总忘啊.嘿嘿...
①建立一个 spring文件夹
②将插件包中的 features 文件夹和 plugins 复制到 spring 文件夹下.
③在 links 文件下新建 spring.link 文件, 在其中编写如下内容: path=/spring

3.spring的IOC 
IOC(Inversion of Control): 其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式

4.spring 有两种注入方法: 
1)setter 注入 
最流行的 DI 类型. 容器通过组件里的 setter 方法注入依赖.
优点: setter 方法可以自动生成; 简单
缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能会因为 setter 方法的调用而被修改
2)构造器注入: 
通过构造器注入依赖.
优点: 解决了 setter 注入的缺点
缺点: 需通过参数位置来确定参数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长.

5.Spring 配置文件的书写 
就是将对象交给Spring的容器管理.
1)使用setter方法注入配置: 
    <bean name="sayHello" class="cn.itcast.spring.HelloSpring"> 
        <property name="message" value="Hello Wrold"></property> 
    </bean> 
property 中的 name 是 Bean 需要注入的属性值.
value 是 Bean 需要注入属性的具体值.
如果注入的不是普通的值,而是以个 Bean 对象:
<property name="message" ref="helloWorld"></property>这里的 ref 指向的是 Bean 的 name 后 id 属性.
2)使用构造器方法注入配置: 
    <bean name="c" class="cn.itcast.spring.HelloSpring"> 
        <constructor-arg value="hello wrold" /> 
    </bean> 
    
6.内部 bean 的声明: 
    <bean id="sequenceGenerator5" 
        class="cn.itcast.spring.ref.SequenceGenerator"> 
        <property name="init" value="600"/> 
        <!-- 声明使用内部 Bean --> 
        <property name="prefix"> 
            <bean class="cn.itcast.spring.ref.DatePrefixGenerator"> 
                <property name="datePattern" value="yyyyMMdd"/> 
            </bean> 
        </property> 
        <property name="suffix" value="UU"/>    
    </bean> 
     
7.得到 Bean 实例 
    ApplicationContext bean = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    HelloSpring helloSpring = (HelloSpring)bean.getBean("c"); 
    helloSpring.sayHello(); 
总结:
    ApplicationContext 只是一个接口, 需要实例化其实现类:ClassPathXmlApplicationContext: 从 classpath 下加载配置文件

8.继承 Bean 配置: 
使用了 parent
sequenceGenerator2 继承了 sequenceGenerator ,并且覆写了 init 属性的值.
    <bean id="sequenceGenerator" 
        class="cn.itcast.spring.ref.SequenceGenerator"> 
        <property name="init" value="200"/> 
        <property name="suffix" value="ZZ" /> 
        <property name="prefix" ref="prefixGenerator" /> 
    </bean> 
    
    <bean id="sequenceGenerator2" 
        parent="sequenceGenerator"> 
        <property name="init" value="400"/> 
    </bean> 

9.集合注入 
1)List: 
    <property name="suffix"> 
        <list> 
            <value>XX</value> 
            <value>YY</value> 
            <value>ZZ</value> 
        </list> 
    </property> 
2)Map: 
    <util:map id="map"> 
        <entry> 
            <key> 
                <value>XX--</value> 
            </key> 
            <value>--xx</value> 
        </entry> 
        <entry> 
            <key> 
                <value>YY</value> 
            </key> 
            <ref bean="sequenceGenerator" /> 
        </entry> 
        <entry key="ZZ" value="zz" /> 
    </util:map> 

10.Bean 自动装配 
    在 <bean> 的 autowire 属性里指定自动装配的模式
    byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
    byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
    constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用
自动装配的缺点:
    在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
    autowire属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.

11.作用域 
和 struts 集成使用的时候很有作用. struts 的 action 是单实例的. 可以用这个属性配置成多实例.
    <bean name="sayHello" class="cn.itcast.spring.HelloSpring" scope="prototype"> 
        <property name="message" value="Hello Wrold"></property> 
    </bean> 

12.外部化 Bean 配置: 
有些重要的配置文件是不能随便修改的,所以我们可以将一些需要修改的配置信息外部化.
    <!-- 外部化 Bean 配置信息 -->
    <context:property-placeholder location="classpath:c3p0.properties"/> 

    <!-- 配置数据源 -->
    <bean id="dataSource" 
        class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
        <property name="user" value="${user}"/> 
        <property name="password" value="${password}"/> 
        <property name="jdbcUrl" value="${url}"/> 
        <property name="driverClass" value="${driver}"/> 
        
        <property name="minPoolSize" value="5"/> 
        <property name="initialPoolSize" value="2"/> 
        <property name="maxPoolSize" value="20"/> 
        <property name="acquireIncrement" value="2"/>    
    </bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源技术之家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值