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可写可不写

 

原文地址:https://www.cnblogs.com/yuby/p/10896838.html