Spring中IOC/DI配置开发

@TOC

目录

#Spring的IOC/DI

##IOC容器

##DI(依赖注入)

##一个入门案列

##说明配置bean的属性

 ##bean实例化

##Bean的生命周期

##注入数据

 ##自动装配

##配置第三方的Bean


#Spring的IOC/DI

##IOC容器

IOC(Inversion of Control)控制反转

1.什么是控制反转?

使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到 外部,此思想称为控制反转。

2.Spring和IOC之间的关系是什么呢?

Spring技术对IOC思想进行了实现, Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部", IOC思想中的别人[外部]指的就是Spring的IOC容器。

3.IOC容器的作用以及内部存放的是什么?

IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象 ,被创建或被管理的对象在IOC容器中统称为Bean ,IOC容器中放的就是一个个的Bean对象

4.当IOC容器中创建好service和dao对象后,程序能正确执行么?

不行,因为service运行需要依赖dao对象 IOC容器中虽然有service和dao对象 ,但是service对象和dao对象没有任何关系 ,需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系, 像这种在容器中建立对象与对象之间的绑定关系就要用到DI(依赖注入)。

##DI(依赖注入)

1.什么是依赖注入呢?

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入 ,业务层要用数据层的类对象,以前是自己new的 现在自己不new了,靠别人[外部其实指的就是IOC容器]来给注入进来 ,这种思想就是依赖注入

2.IOC容器中哪些bean之间需要建立依赖关系?

业务层要依赖数据层,即service和dao层要建立依赖关系。

##一个入门案列

步骤一:添加Spring依赖jar包

步骤二:写数据层接口和业务层接口并在数据层和业务层写相应的实现类,不采用new的方式创建dao对象,而是在ServiceImpl类中为dao层提供setter方法

 

步骤三:在xml文件配置bean 

注意:配置中的两个bookDao含义是不一样的

1)name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前 面加set找对应的setBookDao()方法进行对象注入 public class BookServiceImpl implements BookService

2)ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给 bookService进行注入

步骤四:获得IOC容器以及从容器中获取对象进行方法调用

##说明配置bean的属性

1.name属性

 2.bean的作用范围属性

 ##bean实例化

1.构造方法(常用)

2.静态工厂(了解)

3.实例工厂(了解)

4.FactoryBean(实用)

实现FactoryBean接口,代替原始实例工厂中创建对象的方法

 

配置文件区别

##Bean的生命周期

 1.Spring中对bean生命周期的控制提供了两种方法

1)在配置文件中的bean标签中添加init-method和destroy-method属性

<!--init-method:设置bean初始化生命周期回调函数-->
    <!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

2)类实现InitializingBean与DisposableBean接口,这种方式了解下即可。

2.对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:

初始化容器 1.创建对象(内存分配)

2.执行构造方法

3.执行属性注入(set操作)

4.执行bean初始化方法

使用bean

1.执行业务操作

关闭/销毁容器

1.执行bean销毁方法

(3)关闭容器的两种方式:

ConfigurableApplicationContext是ApplicationContext的子类

close()方法

registerShutdownHook()方法

##注入数据

1.Setter注入

注入简单数据类型

 <!--注入简单类型-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--value属性:设置注入简单类型数据值-->
        <property name="connectionNum" value="100"/>
        <property name="databaseName" value="mysql"/>
    </bean>

 注入引用类型

 <!--注入引用类型-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--property标签:设置注入属性-->
        <!--name属性:设置注入的属性名,实际是set方法对应的名称-->
        <!--ref属性:设置注入引用类型bean的id或name-->
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

 2.构造器注入

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--        根据构造方法参数名称注入-->
        <constructor-arg name="connectionNum" value="10"/>
        <constructor-arg name="databaseName" value="mysql"/>
    </bean>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

 添加构造方法

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

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

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

 ##自动装配

autowire

<!--autowire属性:开启自动装配,通常使用按类型装配-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作

2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推 荐使用

4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效 

##配置第三方的Bean

  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_db"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
        <property name="maxPoolSize" value="1000"/>
    </bean>

优化:

<!--    1.开启context命名空间-->
<!--    2.使用context空间加载properties文件-->
    <!--<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>-->
    <!--<context:property-placeholder location="jdbc.properties,jdbc2.properties" system-properties-mode="NEVER"/>-->
<!--    classpath:*.properties  :   设置加载当前工程类路径中的所有properties文件-->
<!--    system-properties-mode属性:是否加载系统属性-->
    <!--    <context:property-placeholder location="*.properties" system-properties-mode="NEVER"/>-->

    <!--classpath*:*.properties  :  设置加载当前工程类路径和当前工程所依赖的所有jar包中的所有properties文件-->
    <context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>

<!--    3.使用属性占位符${}读取properties文件中的属性-->
<!--    说明:idea自动识别${}加载的属性值,需要手工点击才可以查阅原始书写格式-->
    <bean class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>

    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <property name="name" value="${username}"/>
    </bean>

Spring的IOC/DI配置开发使用起来相对纯注解开发来说是比较复杂的,若要了解学习Spring的纯注解开发,请移步本系列的下一章节

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xboss、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值