zoukankan      html  css  js  c++  java
  • spring基础

    2019-09-30

    引用整理而来,非原创

    Spring IoC 容器

    1两种容器

    BeanFactory

    ApplicationContext

    2Bean的定义

    bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的

    class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
    name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
    scope 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。
    constructor-arg 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    properties 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    autowiring mode 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
    initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。
    destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。

    3Bean的作用域

    prototype和singleton的区别

    bean 的作用域属性(scope="prototype")如果为 prototype,每次产生新的 bean 实例

    bean 的作用域属性(scope="singleton")如果为 singleton,每次返回同一个 bean 实例

    Spring框架的五大作用域

    singleton、prototype、request、session、global-session

    (1)singleton 是默认的作用域,也就是说,当定义 Bean 时,如果没有指定作用域配置项,则 Bean 的作用域被默认为 singleton。 

    (2)Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

    4Bean的生命周期

    Bean 的生命周期可以表达为:Bean 的定义——Bean 的初始化——Bean 的使用——Bean 的销毁

    init-method 和 destroy-method

    init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

    5Bean的后置处理器

    Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。

    6Bean定义继承

    子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。

    Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。你可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。

    Spring 依赖注入

    (1)基于构造方法的依赖注入

    <bean>
        <constructor-arg name="" ref=""></constructor-arg>
    </bean>
    View Code

    (2)基于设值方法的依赖注入

    <bean>
        <property name="" ref=""></property>
    </bean>
    View Code

    你应该注意定义在基于构造函数注入和基于设值函数注入中的 Beans.xml 文件的区别。唯一的区别就是在基于构造函数注入中,我们使用的是〈bean〉标签中的〈constructor-arg〉元素,而在基于设值函数的注入中,我们使用的是〈bean〉标签中的〈property〉元素。

    注入内部 Beans

    注入集合

    Spring Bean 自动装配

    你已经学会如何使用<bean>元素来声明 bean 和通过使用 XML 配置文件中的<constructor-arg><property>元素来注入 。

    Spring 容器可以在不使用<constructor-arg><property> 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。

    通过 bean 元素的 autowire 属性可以指定自动装配的模式

    模式描述
    no 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。
    byName 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
    byType 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。
    constructor 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
    autodetect Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。

    可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合。

    Spring 基于注解的配置

    开启注解

    <context:annotation-config/>

    @Required 注解

    @Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中(在XML中为属性赋值),否则容器就会抛出一个 BeanInitializationException 异常。

    @Autowired 注解

    可以放在三个位置

    成员变量前(如:UserDao userDao),构造方法前,设值方法前

    在这里做个小结:                                                                                     

    我们的spring一步步优化发展,过程如下,分四个阶段:

    基于构造方法、基于设值函数、自动装配(byName、byType)、基于注解(@Required、@Autowired)

    对比四个阶段的XML配置文件

     1 第一阶段时
     2 <bean id="" class="">
     3   <constructor-arg ref=""/>
     4 </bean>
     5 
     6 第二阶段时
     7 <bean id="" class="">
     8   <property name="" ref="">
     9 </bean>
    10 
    11 第三阶段时
    12 <bean id="" class="" autowire="">
    13 
    14 </bean>
    15 
    16 第四阶段时
    17 <bean id="" class="">
    18 
    19 </bean>

    @Qualifier 注解

    我们有一个类(是一个 Dao),但是在 XML 以它为模板创建了两个对象,但我只想把第一个对象注入到(Service)中,如何做

    1    @Autowired
    2    @Qualifier("student1")
    3    private Student student;
  • 相关阅读:
    事务的传播特性及事务的并发
    Spring 配置文件配置事务
    Spring 配置文件AOP
    Spring 注解形式AOP
    Spring与Junit测试整合
    Spring基础知识1--环境搭建、bean创建、依赖注入、注解注入
    JDK动态代理与CGLIB动态代理
    java.lang.illegalArgumentException异常
    计算器
    list
  • 原文地址:https://www.cnblogs.com/Evista/p/11614287.html
Copyright © 2011-2022 走看看