传智播客--Spring的IOC依赖控制反转(佟刚)

学习 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>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值