zoukankan      html  css  js  c++  java
  • springBean

    1.被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的

    spring配置元数据类型:①基于XML的配置文件②基于注解的配置③基于java的配置

    对于基于 XML 的配置,Spring 2.0 以后使用 Schema 的格式,使得不同类型的配置拥有了自己的命名空间,是配置文件更具扩展性

    ①:xmlns="http://www.springframework.org/schema/beans",默认命名空间:它没有空间名,用于Spring Bean的定义(空间名即xmlns:后面的部分,表示该xml文档中所有没有加空间名的标签都用这个命名空间里面的定义解释)

    ②:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",xsi命名空间:这个命名空间用于为每个文档中命名空间指定相应的Schema样式文件,是标准组织定义的标准命名空间

    详细解释见:https://blog.csdn.net/lsx2017/article/details/81452182

    2.基于xml的配置文件

    1)属性:

    ①class:这个属性是强制性的,并且指定用来创建 bean 的 bean 类。

    ②name:这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。

    ③scope:这个属性指定由特定的 bean 定义创建的对象的作用域。

    <bean id="helloWorld" class="com.app.model.HelloWorld" scope="singleton"> </bean>

    singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在。singleton 是默认的作用域,也就是说,当定义 Bean 时,如果没有指定作用域配置项,则 Bean 的作用域被默认为 singleton。 当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域
    prototype

    每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() ,当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

    request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
    session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
    global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境

    ④constructor-arg:

    ⑤properties:

    ⑥autowiring mode

    ⑦lazy-initialization mode:延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。

    ⑧initialization:在 bean 的所有必需的属性被容器设置之后(即执行完setXXX()方法),调用回调方法。

      实现方式:1.Bean实现InitializingBean接口,并实现InitializingBean中的afterPropertiesSet()方法,在配置文件中不需要别的配置即可使用,但是因为这个方法需要写在Bean中,增加了Bean和spring的耦合。

                        2.通过xml配置元数据中的init-method属性来指定一个无参方法,

                        上述两个方法可以同时使用,先执行1后执行2

    参考:https://www.cnblogs.com/youngnong/p/5832239.html

    ⑨destruction:当包含该 bean 的容器被销毁时,使用回调方法。

     实现方式:1.Bean实现DisposableBean接口,并实现DisposableBean中的destroy()方法,在配置文件中不需要别的配置即可使用,但是因为这个方法需要写在Bean中,增加了Bean和spring的耦合。

                        2.通过xml配置元数据中的destroy-method属性来指定一个无参方法,

                        上述两个方法可以同时使用,先执行1后执行2,当关闭spring容器并且当Bean的scopesingleton才会上述方法。

    ⑧,⑨相关代码:

    也可通过下述代码批量设置:

    如果Bean的java类中有对应的方法,则会执行,否则不会。如果有通过⑧⑨设置的方法,则不会执行默认方法。

     AbstractApplicationContext.registerShutDownHook用来在非web环境下面关闭springIoc容器,以使可以调用Bean的destruction代码

    Bean定义过程执行发放顺序:先执行构造方法再执行setXXX()设置属性的方法,在执行bean后置处理器中的postProcessBeforeInitialization(),再执行init-method方法,再执行postProcessAfterInitialization()方法,最后再执行单例模式(singleton )下的destroy_method方法。

    3.Bean与spring容器的关系:

    spring容器从配置元数据中读取Bean配置信息,生成Bean定义注册表,根据Bean注册表和Bean实现类(即我们定义的java类)实例化Bean,将Bean实例放到spring容器中即Bean缓存池,最后引用程序使用这些Bean。

    4.spring bean后置处理器

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

    xml配置:

    BeanFactoryApplicationContext两个容器对待bean的后置处理器稍微有些不同。ApplicationContext容器会自动检测Spring配置文件中那些bean所对应的Java类实现了BeanPostProcessor
    接口,并自动把它们注册为后置处理器。在创建bean过程中调用它们,所以部署一个后置处理器跟普通的bean没有什么太大区别。

         BeanFactory容器注册bean后置处理器时必须通过代码显示的注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法

    如果有多个BeanPostProcessor,会根据在xml文档中配置的顺序或通过addBeanPostProcessor的顺序执行,也可以通过让BeanPostProcessor接口实现类实现Ordered接口getOrder方法,该方法返回一整数,默认值为 0,优先级最高,值越大优先级越低

    疑问:如果两个BeanPostProcessor一个实现了OrderedgetOrder方法,一个没实现,而两个BeanPostProcessor都已经注册了,那么在实现了Ordered的BeanPostProcessor在执行Bean的初始化方法之前会先执行一遍。

     5.springBean继承

    bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等。

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

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

    当你使用基于 XML 的配置元数据时,通过使用父属性,指定父 bean 作为该属性的值来表明子 bean 的定义

    HelloChina这个Bean将继承HelloWorld这个Bean的message2这个配置,相当于:

    当父Bean的scope是scope="prototype",子Bean的scope也是scope="prototype",除非你重新定义子Bean的scope

    Bean定义模板:

     

    将父bean的abstract属性设置为true,此时父Bean为一个模板,不能被实例化,class可写可不写

     

  • 相关阅读:
    RunLoop详解
    NSURLConnection基本用法(苹果原生)
    NSThread 基本使用
    NSOperation/NSOperationQueue详细使用介绍
    JSON解析
    XML解析
    GCD详细用法
    [Java]手动编译Java
    [Selenium] Grid 介绍
    [SoapUI] 循环遍历某个Test Case下的所有Test Step,将Cookie传递给这些Test Step
  • 原文地址:https://www.cnblogs.com/yuby/p/10896838.html
Copyright © 2011-2022 走看看