IOC学习笔记Ⅰ

系列文章目录
IOC学习笔记Ⅱ



一、概念

IOC(Inversion of Control):使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
DI(Dependency Injection)——IOC 的另一种表述方式:组件以一些预先定义好的方式 (例如: setter 方法)接受来自于容器的资源注入,在容器中建立bean与bean之间的依赖关系的整个过程。

二、IOC应用

1.bean的基本配置

基础配置:
①id 属性:bean 的名称,在 IOC 容器中,bean 的名称必须是唯一的。
②如果没有指定 id 属性,那么将会用 class 属性作为 bean 的名称。
③Class 属性:类的全名称(包名+类名)

    <bean id="bookDao" class="org.example.dao.BookDaoImpl">
        <property name="datebaseName" value="mysql"/>
        <property name="connectionNum" value="100"/>
    </bean>

从IOC容器获取Bean:
调用 ApplicationContext 的 getBean() 方法
getBean()方法的参数:
String:根据配置文件中的 ID 属性来获取 bean
Class:根据对象的类型来获取 bean
注意:如果只指定要返回的 Bean 的类型就想从 IOC 容器中取得 Bean 的前提是该类型的 Bean 在 IOC 容器中只有一个

      ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
      获取bean
      BookDao bookDao = (BookDao) ctx.getBean("bookDao");
      System.out.println(bookDao.getConnectionNum());

2.依赖注入

①通过属性注入(setter注入):
属性注入使用< property > 元素, 使用 name 属性指定 Bean 的属性名称,value 属性 或 < value > 子节点指定属性值。属性注入是实际应用中最常用的注入方式

    <bean id="bookDao" class="org.example.dao.BookDaoImpl">
        <property name="datebaseName" value="mysql"/>
        <property name="connectionNum" value="100"/>
    </bean>

②构造方法注入

public class BookDaoImpl implements BookDao{
    private int connectionNum;
    private String databaseName;

    public BookDaoImpl(int connectionNum, String databaseName) {
        this.connectionNum = connectionNum;
        this.databaseName = databaseName;
    }

    @Override
    public void save() {
        System.out.println("book dao save ..." + databaseName + "," + connectionNum);
    }

}
    <bean id="bookDao" class="org.example.dao.BookDaoImpl">
        <constructor-arg name="databaseName" value="mysql"/>
        <constructor-arg name="connectionNum" value="666"/>
    </bean>

选择:
1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
强制依赖指对象在创建的过程中必须要注入指定的参数
2…可选依赖使用setter注入进行,灵活性强
可选依赖指对象在创建过程中注入的参数可有可无
3.Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入

3.字面值

字面值:可用字符串表示的值,可以通过 元素标签或 value 属性进行注入。 基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。例:< mysql >

    <bean id="bookDao" class="org.example.dao.BookDaoImpl">
        <constructor-arg name="databaseName">
            <value><![CDATA[<mysql>]]></value>
        </constructor-arg>
        <constructor-arg name="connectionNum" value="666"/>
    </bean>

4.引用其他bean

组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相 互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用 在 Bean 的配置文件中, 可以通过 元素或 ref 属性为 Bean 的属性或构造器 参数指定对 Bean 的引用。

    <bean id="bookService" class="org.example.service.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

5.注入Null值

不能直接value=“null”

<property name="databaseName"> <null></null> </property>

6.注入级联属性

注意:Spring 为级联属性赋值之前必须先初始化对象,否则会出现异常。

    <bean id="p2" class="edu.etime.springdemo.beans.Person"> 
    <property name="name">
        <null></null> 
    </property> 
    <!-- 通过属性来应用其他 bean -->
    <property name="car">
        <ref bean="car3" /> 
    </property>
     <!-- 注入级联属性 -->
    <property name="car.price" value="40"></property> </bean>

注入级联属性后 IOC容器中car对象的price也会被随之改变

7.注入集合

 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>

8.util&p标签

//引入命名空间
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
    <util:list>
        <ref bean="bookDao"/>
    </util:list>
    <bean id="bookDao" class="com.quickstart.dao.impl.BookDaoImpl" 
          p:databaseName="mysql" p:connectionNum="666">
    </bean>

总结

对Spring进行了一个基础的入门,学习了IOC容器和DI依赖注入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值