spring配置文件开发

IOC/DI

        代码书写现状:耦合度偏高

        解决方案:使用对象时,在程序中不要主动new对象,转为由程序外部提供对象

        IOC控制反转:对象的控制权,由程序转移到外部,这种思想称之为控制反转

IOC容器

        Spring提供了一个容器,成为IoC容器,用来充当IoC思想中的外部

DI(Dependency Injection)依赖注入

        在容器中建立bean和bean之间的依赖关系的整个过程,成为依赖注入

bean

        IoC容器负责对象的创建、初始化等一系列操作,被创建或被管理的对象在IoC容器中统称为Bean

<bean id="BrandDemo1" class="com.lyl.pojo.BrandDemo1" scope="prototype">
   <!--id配置的是bean的名称(一般为类名)
       class bean的路劲
       scope 默认为单例 配置为prototype为多例
       
       property是依赖关系 name 是需要bean内部需要创建对象的成员变量 ref是name的实体类bean的id
       或者别名
   --->
    <property name="user" ref="UserDemo1"/>
</bean>

实例化bean的三种方式——构造工厂

        静态工厂

public class OrderDaoFactory{
    public static OrderDao getOrderDao(){
        return new OrderDaoIml();
    }
}

        

<bean 
    id = "orderDao"
    factory-method="getOrderDao"
    class = "com.lyl.faxtory.OrderDaoFactory"
    />

bean声明周期

        初始化容器

                1.创建对象(内存分配)

                2.执行构造方法

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

                4.执行bean初始化方法

        使用bean

                1.执行业务操作

        关闭/销毁容器

                1.执行bean销毁方法

        bean生命周期控制

                方法一

                        1.提供声明周期控制方法(init()方法,destory()方法)

                        2.配置生命周期控制方法

<bean id = "bookDao" class = "com.lyl.dao.BookDao" init-method = "init" destory="destory">

方法二

        接口控制(了解)

                实现InitializengBean, DisposableBean接口, 实现方法

public class BookServiceImpl implements BookService , InitializingBean,DisposableBean {}

依赖注入方式

        思考:向一个类中传递数据的方式有几种

  • 普通方法(setter方法)
    • 构造方法
    • 思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行的是字符串或数字呢?
    • 引用类型
    • 简单类型(基本类型与String)
    • 依赖注入方式
    • setter注入
      • 简单类型
      • 引用类型
    • 构造器注入
      • 简单类型
      • 引用类型

构造器注入引用类型

        在bean中定义引用类型属性并提供可访问的构造方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    public BookServiceImp1(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

依赖注入方式选择

1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现

2.可选依赖使用setter注入进行,灵活性强

3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨

4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入

6.自己开发的模块推荐使用setter注入

依赖自动装配

· 配置中使用bean标签autowire属性设置自动装配的类型

<bean id="bookDao" class="com.lyl.dao.imp1.BookDaoImpl" />
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType" />

依赖自动装配特征

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时( byType )必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时( byName )必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

注入集合对象

        注入数组对象

<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>
    </list>
</property>

注入Set对象

<property name="set">
    <set>
        <value>itcast</value
        ><value>itheima</value>
        <value>boxuegu</value>
    </set>
</property>

注入Map对象

<property name="map">
    <map>
        <entry key="country" value="china" />
        <enthy key="province" value="henan" />
        <entry key="city" value="kaifeng" />
    </map>
</property>

注入properties文件

<property name="properties" >
    <props>
        <prgp key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>

加载properties文件

一. 开启context命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation =
               "http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd
">
</beans>

二. 使用context命名空间,加载指定properties文件

<context:property-placeholder location="jdbc.properties" />
<!--system-properties-mode="NEVER"系统内部属性不会加载进去-->
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
<!--classpath:*.properties加载当前项目中所有properties文件(项目依赖jar包不会加载)-->
<context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>
<!--classpath*:加载当前项目中所有properties文件(项目依赖jar包也会加载)-->
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>

 三. 使用 ${} 读取加载的属性值

<property name="username" value="${jdbc.username} " />

 完整代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation =
               "http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd
">
<!--  1.开启context命名空间
      2.使用context空问加载properties文件
      *.properties加载当前项目中所有properties文件(项目依赖jar包不会加载)
      classpath*:是不仅当前项目可以用而且,项目所依赖的jar包也可以用
        -->
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
<!--  3.使用属性占位符${}读取properties文件中的属性-->
<bean class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverclassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.ur1}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
</beans>

总结

容器相关

  • BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
  • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
  • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
  • ApplicationContext接口常用初始化类
  • classPathxmlApplicationContextFileSystemxmlApplicationContext

bean相关

<bean>
id="bookDao"                                     bean的Id
name="dao bookDaoImpl daoImpl"                   bean别名
class="com.lyl.dao.imp1.BookDaoImpl"         bean类型,静态工厂类,FactoryBean类
scope="singleton"                                控制bean的实例数量
init-method="init"                               生命周期初始化方法
destroy-method="destory"                         生命周期销毁方法
autowire="byType"                                自动装配类型
factory-method="getInstafce"                     bean工厂方法,应用于静态工厂或实例工厂
factory-bean=" com.lyl.factory .BookDaoFactory"    实例工厂bean
lazy-init="true"                                 控制bean延迟加载
/>

 依赖注入相关

<bean id="bookService" class="com.lyl.service.impl.BookServiceImpl">
    <constructor-arg name="bookDao" ref="bookDao" />      构造器注入引用类型
    <constructor-arg name="userDao" ref="userDao" />
    <constructor-arg name="msg" value="WARN"/>            构造器注入简单类型
    <constructor-arg type="java.lang.String" index="3" value="WARN"/> 类型匹配与索引匹配
    <property name="bookDao" ref="bookDao" />             setter注入引用类型
    <property name="userDao" ref="userDao" />
    <property name="msg" value="WARN"" />                 setter注入简单类型
    <property name="names">                               setter注入集合类型
        <list>    list集合
            <value>itcast</value>                         集合注入简单类型
            <ref bean="dataSource" / >                    集合注入引用类型
        </list>
    </property>
</bean>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值