• Spring--入门第一天


    一、bean之间的关系

    1)bean的继承配置:

    使用bean的parent属性指定继承哪个bean的配置;此时可以不用配置父类中已有的属性配置。并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等

    <bean id="address1" class="yang.mybatis.test.Address"
    p:city="BeiJing" p:street="TianAnMen" ></bean>
    
    <bean id="address2" 
    p:street="ZhongGuanCun" parent="address1"></bean>

    抽象bean可以不指定class属性,抽象bean bean的abstract=“true”的bean,这样的bean不能被IOC容器实例化,只能用来被继承。

    2)depends-on 依赖配置

    depend-on用来表示一个Bean的实例化依靠另一个Bean先实例化,如果在一个bean A上定义了depend-on B那么就表示:A 实例化前先实例化 B。

    二、Bean的作用域

    在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.

    默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.在创建IOC容器时bean被实例化,调用其构造方法。

    类别               说明
    singleton  在SpringIOC 容器中仅存在一个Bean实例,Bean以单实例的方式存在
    prototype  每次调用getBean()时都会返回一个新的实例
    request  每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
    session  同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean.该作用域仅适用于WebApplicationcontext环境



    三、使用外部属性文件

    Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.

    注册 PropertyPlaceholderConfigurer

    • Spring 2.0:
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="db.properties"></property>
    </bean>
    • Spring 2.5 之后:

    可通过 <context:property-placeholder> 元素简化:
    <beans> 中添加 context Schema 定义xmlns:context="http://www.springframework.org/schema/context"
    在配置文件中加入如下配置:

    <!--引入文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 数据库连接池,使用dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    
      <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>
    
    classpath类路径下的db.properties
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=1234

    四、Spring 表达式语言(简称SpEL):

    是一个支持运行时查询和操作对象的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL
    SpEL 为 bean 的属性进行动态赋值提供了便利

    • 通过 SpEL 可以实现:
    • 通过 bean 的 id 对 bean 进行引用
    • 调用方法以及引用对象中的属性
    • 计算表达式的值
    • 正则表达式的匹配

    字面量的表示:

    整数:<property name="count" value="#{5}"/>
    小数:<property name="frequency" value="#{89.7}"/>
    科学计数法:<property name="capacity" value="#{1e4}"/>
    Boolean:<property name="enabled" value="#{false}"/>

    引用其他对象

    <!--通过value属性和SpEL配置Bean之间的引用关系-->
    <property name="car" value="#{car}"></property>

    引用其他对象的属性

    <!--通过value属性和SpEL配置一个Bean的属性值为另一个Bean的属性值-->
    <property name="carPrice" value="#{car.price}"></property>

    调用其他方法,还可以链式操作

    <property name="carPrice" value="#{car.price.toString().toUpperCase}"></property>

    调用静态方法或静态属性:通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:

    <property name="initValue" value="#{T(java.lang.Math).PI}"></property>

    五、OC 容器中Bean 的生命周期

    Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.

    Spring IOC 容器对 Bean 的生命周期进行管理的过程:

    1. 通过构造器或工厂方法创建 Bean 实例(调用构造器)
    2. 为 Bean 的属性设置值和对其他 Bean 的引用(调用setter方法)
    3. 调用 Bean 的初始化方法 (调用配置文件中配置的init-method)
    4. 使用bean
    5. 当容器关闭时, 调用 Bean 的销毁方法(调用配置文件中配置的destory-method)

    在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.同时Bean类中设置这两个方法

    <bean id="address" class="yang.mybatis.test.Address" init-method="init" destroy-method="destory"
      p:city="BeiJing" p:street="TianAnMen"/>

    六、创建 Bean 后置处理器

    Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
    Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

    创建自定义后置处理器, 需要实现接口(org.springframework.bean.config.BeanPostProcessor). 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

    // init 方法之后调用
    postProcessAfterInitialization(java.lang.Object bean, java.lang.String beanName)
    //init 方法之前调用    
    postProcessBeforeInitialization(java.lang.Object bean, java.lang.String beanName)

    bean:bean实例名字
    beanName:IOC容器配置的id

    在Spring配置文件中配置自定义Bean后置处理器

    <bean class="自定义后置处理器的全路径名"></bean>

    添加 Bean 后置处理器后 Bean 的生命周期

    Spring IOC 容器对 Bean 的生命周期进行管理的过程:

    1. 通过构造器创建 Bean 实例
    2. 为 Bean 的属性设置值和对其他 Bean 的引用
    3. 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
    4. 调用 Bean 的初始化方法
    5. 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
    6. 使用Bean 
    7. 当容器关闭时, 调用 Bean 的销毁方法
  • 相关阅读:
    数据结构杂谈(三)堆排序
    数据结构杂谈(二)简单有趣的地精排序Gnome sort
    搭建proftp服务器
    python 单例模式
    mongo
    kafka
    查看端口占用
    tinyproxy 代理使用
    Linux 搭建wiki
    linux 安装 java
  • 原文地址:https://www.cnblogs.com/realshijing/p/7942658.html
Copyright © 2020-2023  润新知