请介绍一下Spring框架中Bean的生命周期

合集下载

SpringBean的生命周期

SpringBean的生命周期

SpringBean的⽣命周期⼀、引⾔ 要想理解Spring框架,那么Spring Bean的⽣命周期就是必须要了解的⼀环,关于Spring Bean的⽣命周期,就是⼀个Bean在IOC容器中从创建到销毁的过程,下⾯就开始梳理⼀下⼀个Bean的创建过程。

⼆、⽣命周期概要流程 简单的来说,⼀个Bean的⽣命周期分为四个阶段: 1、实例化(Instantiation) 2、属性设置(populate) 3、初始化(Initialization) 4、销毁(Destruction)如下图: 具体逻辑位于AbstractAutowireCapableBeanFactory类doCreateBean⽅法中,代码较多,只放出了重要的部分,如下:protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {BeanWrapper instanceWrapper = null;if (instanceWrapper == null) {//实例化instanceWrapper = this.createBeanInstance(beanName, mbd, args);}try {//属性赋值this.populateBean(beanName, mbd, instanceWrapper);//初始化exposedObject = this.initializeBean(beanName, exposedObject, mbd);} catch (Throwable var18) {//...}try {//注册销毁回调接⼝this.registerDisposableBeanIfNecessary(beanName, bean, mbd);return exposedObject;} catch (BeanDefinitionValidationException var16) {//...}} 上⾯是的步实例化、属性赋值、初始化都是Spring容器启动时的步骤,销毁是在容器关闭时的操作,容器销毁时会调⽤容器的close()⽅法去销毁容器。

spring中bean的生命周期详解

spring中bean的生命周期详解

spring中bean的⽣命周期详解1.Spring IOC容器可以管理bean的⽣命周期,Spring允许在bean⽣命周期内特定的时间点执⾏指定的任务。

2.Spring IOC容器对bean的⽣命周期进⾏管理的过程:①通过构造器或⼯⼚⽅法创建bean实例②为bean的属性设置值和对其他bean的引⽤③调⽤bean的初始化⽅法④ bean可以使⽤了⑤当容器关闭时,调⽤bean的销毁⽅法3.在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁⽅法4.bean的后置处理器① bean后置处理器允许在调⽤初始化⽅法前后对bean进⾏额外的处理② bean后置处理器对IOC容器⾥的所有bean实例逐⼀处理,⽽⾮单⼀实例。

其典型应⽤是:检查bean属性的正确性或根据特定的标准更改bean的属性。

③ bean后置处理器时需要实现接⼝:org.springframework.beans.factory.config.BeanPostProcessor。

在初始化⽅法被调⽤前后,Spring将把每个bean实例分别传递给上述接⼝的以下两个⽅法:postProcessBeforeInitialization(Object, String)postProcessAfterInitialization(Object, String)5.添加bean后置处理器后bean的⽣命周期①通过构造器或⼯⼚⽅法创建bean实例②为bean的属性设置值和对其他bean的引⽤③将bean实例传递给bean后置处理器的postProcessBeforeInitialization()⽅法④调⽤bean的初始化⽅法⑤将bean实例传递给bean后置处理器的postProcessAfterInitialization()⽅法⑥bean可以使⽤了⑦当容器关闭时调⽤bean的销毁⽅法总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

Spring中Bean的作用域与生命周期详解

Spring中Bean的作用域与生命周期详解

Spring中Bean的作⽤域与⽣命周期详解⽬录⼀、Bean的作⽤域1、单实例Bean声明2、多实例Bean声明⼆、Bean的⽣命周期1、bean的初始和销毁2、bean的后置处理器总结⼀、Bean的作⽤域⾸先我们来讲⼀下有关于bean的作⽤域,⼀般情况下,我们书写在IOC容器中的配置信息,会在我们的IOC容器运⾏时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单实例的Bean对象,这样就意味着⽆论我们使⽤多少个getBean()⽅法,获取到的同⼀个JavaBean都是同⼀个对象,这就是单实例Bean,整个项⽬都会共享这⼀个bean对象。

在Spring中,可以在<bean>元素的scope属性⾥设置bean的作⽤域,以决定这个bean是单实例的还是多实例的。

Scope属性有四个参数,具体的使⽤可以看下图:1、单实例Bean声明默认情况下,Spring只为每个在IOC容器⾥声明的bean创建唯⼀⼀个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调⽤和bean引⽤都将返回这个唯⼀的bean实例。

该作⽤域被称为singleton,它是所有bean的默认作⽤域。

也就是单实例。

为了验证这⼀说法,我们在IOC中创建⼀个单实例的bean,并且获取该bean对象进⾏对⽐:<!-- singleton单实例bean1、在容器创建时被创建2、只有⼀个实例--><bean id="book02" class="com.spring.beans.Book" scope="singleton"></bean>测试获取到的单实例bean是否是同⼀个:@Testpublic void test09() {// 单实例创建时创建的两个bean相等Book book03 = (Book)iocContext3.getBean("book02");Book book04 = (Book)iocContext3.getBean("book02");System.out.println(book03==book04);}得到的结果是true;2、多实例Bean声明⽽既然存在单实例,那么就⼀定存在多实例。

SpringBean的生命周期总结

SpringBean的生命周期总结

SpringBean的⽣命周期总结除了使⽤阶段外,Spring 将 bean 的⽣命周期定义为实例化、属性填充、初始化和销毁四个阶段,并为每个阶段提供了多个拓展点⽤于⾃定义 bean 的创建过程。

这篇⽂章介绍了 bean 的⽣命周期和其各个拓展点,通过图⽰⽣动的展⽰、并结合⼀个实例来演⽰全过程。

Spring ⽣命周期拓展点的类型Spring 提供的拓展点可以分为:⽤于单个 bean 的专⽤拓展点:编写 bean 类时通过实现这些接⼝、重写其中的函数来实现拓展点。

Spring 容器会在适当的时候调⽤这些接⼝中定义的函数。

诸多 Aware 接⼝的⼦接⼝ InitializingBean 接⼝和 DisposableBean 接⼝⽤于所有普通 bean 初始化的通⽤拓展点:这些接⼝中定义了多个拓展点,使⽤时需要定义⼀个专门的类实现接⼝、重写必要的函数。

Spring 容器初始化时会将这些类优先注册为 bean,待它们初始化完成之后再初始化普通的 bean。

在其他每个普通 bean 注册时,Spring 容器都会尝试调⽤所有已注册的通⽤拓展点。

BeanPostProcessor InstantiationAwareBeanPostProcessorDestructionAwareBeanPostProcessor下⽅出现的图⽰中,菱形表⽰通⽤拓展点,⽽圆形表⽰专⽤拓展点,矩形就是 bean 的⽣命周期中的某⼀步骤。

实例化创建 bean 对象实例的过程,包括使⽤⼯⼚模式创建和调⽤构造函数。

Spring 通过InstantiationAwareBeanPostProcessor接⼝在实例化前和后各提供了两个通⽤拓展点,加上对象实例化的过程,执⾏顺序如下:1. postProcessBeforeInstantiation:在普通 bean 对象实例化开始之前调⽤2. 对象实例化3. postProcessAfterInstantiation:在普通 bean 对象实例化完成之后调⽤属性填充如果对象中有 setter 函数,并通过配置元数据指定了注⼊的属性,Spring 容器会在这⼀步为其注⼊配置的值。

spring中bean的生命周期

spring中bean的生命周期

Spring bean生命周期在传统的Java应用中,Bean的生命周期非常简单。

Java的关键词new用来实例化Bean(或许他是非序列化的)。

这样就够用了。

相反,Bean的生命周期在Spring容器中更加细致。

理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。

1.容器寻找Bean的定义信息并且将其实例化。

2.受用依赖注入,Spring按照Bean定义信息配置Bean的所有属性。

3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean 的ID。

4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。

5.如果BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()方法将被调用。

6.如果Bean指定了init-method方法,它将被调用。

7.最后,如果有BeanPsotProcessor和Bean关联,那么它们的postProcessAfterInitialization()方法将被调用。

到这个时候,Bean已经可以被应用系统使用了,并且将被保留在Bean Factory中知道它不再需要。

有两种方法可以把它从Bean Factory中删除掉。

1.如果Bean实现了DisposableBean接口,destory()方法被调用。

2.如果指定了订制的销毁方法,就调用这个方法。

Bean在Spring应用上下文的生命周期与在Bean工厂中的生命周期只有一点不同,唯一不同的是,如果Bean实现了ApplicationContextAwre接口,setApplicationContext()方法被调用。

只有singleton行为的bean接受容器管理生命周期。

non-singleton行为的bean,Spring容器仅仅是new的替代,容器只负责创建。

Spring注解开发02--------bean的生命周期

Spring注解开发02--------bean的生命周期

Spring注解开发02--------bean的⽣命周期概述什么是bean的⽣命周期?bean的⽣命周期是指⼀个bean,从创建,再到初始化,最后到销毁的过程!1. 构造(对象创建):单实例,默认容器启动时创建对象多实例,在每次获取的时候创建对象2. 初始化:对象创建完毕并赋值好,调⽤初始化⽅法。

3. 销毁:单实例,在容器关闭时调⽤销毁⽅法多实例,创建之后容器就不会管理这个bean了,容器不会调⽤销毁⽅法。

4. 我们还可以通过BeanPostProcessor来进⾏初始化⽅法前后的⼀些操作!在Spring中是容器来管理bean的⽣命周期,但是我们可以使⽤⼀些我们⾃定义的⽅法,来使得容器进⾏到当前bean的⽣命周期时来调⽤我们⾃定义的初始化与销毁⽅法。

Spring实现⽣命周期的⼏种⽅式1.指定init-method=""与destroy-method=""2.3.@PostConstruct: 在bean创建完成并且属性赋值完成,来执⾏初始化@PreDestroy:在容器销毁bean之前通知我们清理⼯作4.在bean初始化前后进⾏⼀些处理⼯作postProcessBeforeInitialization:在任意初始化调⽤之前(包括我们指定任意初始化⽅法之前)postProcessAfterInitialization:在任意初始化⽅法调⽤之后@Bean⽅式实现概述@Bean注解为我们提供了两个属性initMethod与destroyMethod,我们使⽤使⽤时最直接赋值⽅法名即可。

测试1.编写实体类person,编写构造⽅法,init(初始化⽅法)与destory(销毁⽅法)package com.xdw.pojo;public class Person {private Integer age;private String name;public void init() {System.out.println("person init。

spring之Bean的生命周期详解

spring之Bean的生命周期详解

spring之Bean的⽣命周期详解Bean的⽣命周期:Bean的定义——Bean的初始化——Bean的使⽤——Bean的销毁Bean的定义Bean 是 spring 装配的组件模型,⼀切实体类都可以配置成⼀个 Bean ,进⽽就可以在任何其他的 Bean 中使⽤,⼀个 Bean 也可以不是指定的实体类,这就是抽象 Bean 。

Bean的初始化Spring中bean的初始化回调有两种⽅法⼀种是在配置⽂件中声明init-method="init",然后在⼀个实体类中⽤init()⽅法来初始化另⼀种是实现InitializingBean接⼝,覆盖afterPropertiesSet()⽅法。

第⼀种:配置⽂件:<?xml version="1.0" encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd"><bean id="init-one" class="org.spring.test.BeanInitDemo1" init-method="init"><property name="message" value="这⾥是配置⽂件中为message赋值"></property></bean></beans>BeanInitDemo1类:package org.spring.test;public class BeanInitDemo1 {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public void init(){this.setMessage("这⾥是init()⽅法初始化设值");}}测试类:package org.spring.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BeanInitDemo1 bid = (BeanInitDemo1) context.getBean("init-one");System.out.println(bid.getMessage());}}运⾏结果:这⾥是init()⽅法初始化设值原因:init()初始化⽅法的调⽤是在配置⽂件的Bean初始化之后执⾏的,所以改变了配置⽂件中对message的赋值。

Spring中bean的生命周期详解(面试说辞)

Spring中bean的生命周期详解(面试说辞)

Spring中bean的⽣命周期详解(⾯试说辞)链接:Spring中bean的⽣命周期(详解)1.四个主要阶段2.常⽤的扩展点3.影响多个bean的接⼝4.只调⽤⼀次的接⼝5.与aware有关的接⼝6.两个⽣命周期接⼝7.总结:四个主要阶段Spring bean的⽣命周期只有四个主要阶段,其他都是在这四个主要阶段前后的扩展点,这四个阶段是:1.实例化 Instantiation2.属性赋值 Populate3.初始化 Initialization4.销毁 Destruction其中实例化和属性赋值分别对应构造⽅法和setter⽅法的注⼊,初始化和销毁是⽤户能⾃定义扩展的两个阶段。

可通过查源码的⽅式发现,他们都在doCreate()⽅法中,// 忽略了⽆关代码protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (instanceWrapper == null) {// 实例化阶段!instanceWrapper = createBeanInstance(beanName, mbd, args);}// Initialize the bean instance.Object exposedObject = bean;try {// 属性赋值阶段!populateBean(beanName, mbd, instanceWrapper);// 初始化阶段!exposedObject = initializeBean(beanName, exposedObject, mbd);}}可以发现,分别调⽤三种⽅法:1.createBeanInstance() -> 实例化2.populateBean() -> 属性赋值3.initializeBean() -> 初始化⽽销毁阶段是在容器关闭时调⽤的,在ConfigurableApplicationContext类的close()中常⽤的扩展点影响多个bean的接⼝两个最重要的接⼝:InstantiationAwareBeanPostProcessorBeanPostProcessor实现这两个接⼝的bean,会⾃动切⼊到相应的⽣命周期中,其中InstantiationAwareBeanPostProcessor是作⽤于实例化阶段的前后,BeanPostProcessor是作⽤于初始化阶段的前后。

spring:bean的生命周期

spring:bean的生命周期

spring:bean的⽣命周期1、spring中bean的⽣命周期(1)概念在spring框架中,所有的bean对象都有⽣命周期,就是指bean的创建、初始化、服务、销毁的⼀个过程。

(2)bean的⽣命周期bean的定义在spring中通常是通过配置⽂档的⽅式来定义Bean的,在⼀个配置⽂件中可以定义多个Beanbean的初始化bean的使⽤通过ApplicationContext对象或Beanfactory对象获取bean销毁(3)代码的⽅式演⽰Bean的⽣命周期创建Student类:public class Student implements BeanNameAware {private String sname;@Overridepublic String toString() {return"Student{" +"sname='" + sname + '\'' +'}';}public Student() {System.out.println("bean创建了");}public void setSname(String sname) {System.out.println("设置对象属性setName()..");this.sname = sname;}//Bean的初始化⽅法public void initStudent() {System.out.println("初始化Bean");}//实现BeanNameAware接⼝的setBeanName(),传递Bean的ID。

@Overridepublic void setBeanName(String sname) {System.out.println("调⽤BeanNameAware的setBeanSname,返回的ID值是:" +sname);}//Bean的使⽤public void use() {System.out.println("使⽤Bean");}//Bean的销毁⽅法public void destroyStudent() {System.out.println("销毁Bean");}}其中调⽤接⼝后要实现接⼝的setBeanName⽅法,该⽅法的作⽤是返回bean的ID值再创建⼀个类,书写Bean后置处理器相关的⽅法:public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object o, String s) throws BeansException {System.out.println("前⽅法"+s);return o;}@Overridepublic Object postProcessAfterInitialization(Object o, String s) throws BeansException {System.out.println("后⽅法"+s);return o;}}spring的配置⽂件:<bean name="student"class="com.zhb.bean.Student" init-method="initStudent" destroy-method="destroyStudent"> </bean><bean class="com.zhb.test.MyBeanPostProcessor"></bean>第⼆个是配置后处理器的bean,只需要配置类全名,不需要配置ID等,spring可以⾃动识别并注⼊。

一分钟掌握Spring中bean的生命周期!

一分钟掌握Spring中bean的生命周期!

一分钟掌握Spring中bean的生命周期!
Spring中bean的生命周期是指从bean实例创建到bean实例销毁之间所经历的一系
列过程。

Spring容器会管理bean实例,并负责bean实例的这一系列过程,也就是bean
的生命周期。

beab的生命周期由以下几个步骤组成:
1、实例化Bean:在bean容器初始化的时候,Spring会根据配置的Bean实例化,通
常会调用Bean的无参构造方法。

2、装载属性:根据bean的自身配置的属性,为bean的属性赋值。

3、调用初始化方法:当Spring装载完bean的属性之后,会调用一些用户定义的初
始化方法,一般就是bean的init方法,它可以把一些初始化操作做完。

4、Bean使用:在完成初始化之后,bean就可以被使用了,即Spring容器提供bean
的实例供给其他程序使用。

5、调用销毁方法:当Spring需要销毁bean实例的时候,会通知bean调用用户配置
的destroy方法,在该方法中做一些合适的操作。

6、销毁Bean:最终,Spring容器完成bean实例的销毁,bean不再在内存当中占据
空间。

Spring容器会管理bean的这一生命周期,一般开发者只需关注初始化和销毁的过程,因为bean的创建和销毁的过程,开发者并不需要去处理,只需要定义一些必要的初始化
和销毁的操作即可。

深入理解Spring中bean的生命周期介绍

深入理解Spring中bean的生命周期介绍

深⼊理解Spring中bean的⽣命周期介绍1.以ApplocationContext上下⽂单例模式装配bean为例,深⼊探讨bean的⽣命周期:(1).⽣命周期图:(2).具体事例:person类实现BeanNameAware,BeanFactoryAware接⼝public class Person implements BeanNameAware ,BeanFactoryAware{private String name;public Person(){System.out.println("调⽤构造器为属性值初始化");}public String getName() {return name;}public void setName(String name) { = name;}@Overridepublic void setBeanName(String arg0) {// TODO Auto-generated method stubSystem.out.println("获取beanName id值"+" "+arg0);}@Overridepublic void setBeanFactory(BeanFactory arg0) throws BeansException {// TODO Auto-generated method stubSystem.out.println("获取BeanFactory" +" "+arg0);}}public class MyBeanPostProcessor implements BeanPostProcessor{@Overridepublic Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {// TODO Auto-generated method stubSystem.out.println("调⽤postProcessAfterInitialization");return arg0;}@Overridepublic Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {// TODO Auto-generated method stubSystem.out.println("调⽤postProcessBeforeInitialization");return arg0;}}ApplicationContext.xml配置⽂件:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd"> <!-- bean的配置⽂件 --><bean id="person" class="org.jingdong.bean.life.Person"><property name="name" value="grl"></property></bean><bean id="myBeanPostProcessor" class="org.jingdong.bean.life.MyBeanPostProcessor"></bean></beans>Main.javapublic class Main {public static void main(String[] args) {// 创建IOC容器ApplicationContext ac = new ClassPathXmlApplicationContext("org/jingdong/bean/life/applicationContext.xml");//从容器中获取bean实例Person person = (Person) ac.getBean("person");//使⽤beanSystem.out.println(person.getName());}}2.以Spring Factory装配bean为例:(1).⽣命周期图: 以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Springbean的加载过程和生命周期

Springbean的加载过程和生命周期

Springbean的加载过程和生命周期在Spring框架中,Bean的加载过程可以分为三个主要的步骤:Bean的定义、Bean的实例化和依赖注入。

接下来,Bean的实例化。

在Bean的定义得到之后,Spring容器将根据定义的信息来实例化Bean对象。

有三种常见的方式来实例化Bean对象:构造方法、静态工厂方法和实例工厂方法。

构造方法是通过调用类的构造方法来实例化Bean对象,静态工厂方法是通过调用类上的静态工厂方法来实例化Bean对象,实例工厂方法是通过调用类的实例工厂方法来实例化Bean对象。

无论是哪种方式,最终都会返回一个实例化后的Bean对象。

最后,依赖注入。

在Bean实例化之后,Spring容器会根据Bean的定义信息进行依赖注入。

依赖注入是指将Bean所需要的其他Bean注入到它的属性中。

有三种主要的方式进行依赖注入:构造方法注入、Setter方法注入和字段注入。

构造方法注入是通过调用类的构造方法,并将其他Bean作为参数传入来进行注入;Setter方法注入是通过调用类的Setter方法,并将其他Bean作为参数传入来进行注入;字段注入是通过直接将其他Bean注入到类的字段中来进行注入。

不同的方式适用于不同的情况,可以根据具体需求选择适合的方式。

Bean的生命周期包括三个主要的阶段:实例化、初始化和销毁。

首先是实例化阶段。

在Bean实例化的过程中,Spring容器会调用Bean的构造方法来创建Bean的实例。

在构造方法调用之后,Bean实例就被创建出来了。

但是,此时Bean的属性还没有被初始化。

需要注意的是,Bean的销毁是可选的,并不是所有的Bean都需要进行销毁操作。

只有在Bean需要进行一些清理操作或资源释放等特殊情况下,才需要进行销毁。

总结一下,Spring容器中的Bean的加载过程包括Bean的定义、Bean的实例化和依赖注入;Bean的生命周期包括实例化、初始化和销毁。

请介绍一下Spring框架中Bean的生命周期

请介绍一下Spring框架中Bean的生命周期

请介绍一下Spring框架中Bean的生命周期这个配置文件就定义了一个标识为HelloWorld 的Bean。

在一个配置文档中可以定义多个Bean。

二、Bean的初始化有两种方式初始化Bean。

1、在配置文档中通过指定init-method 属性来完成在Bean的类中实现一个初始化Bean属性的方法,如init(),如:public class HelloWorld{public String msg=null;public Date date=null;public void init() {msg=”HelloWorld”;date=new Date();}……}然后,在配置文件中设置init-mothod属性:2、实现org.springframwork.beans.factory.InitializingBean接口Bean实现InitializingBean接口,并且增加afterPropertiesSet() 方法:public class HelloWorld implement InitializingBean {public String msg=null;public Date date=null;public void afterPropertiesSet() {msg=”向全世界问好!”;date=new Date();}……}那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定init-method属性了。

三、Bean的调用有三种方式可以得到Bean并进行调用:1、使用BeanWrapperHelloWorld hw=new HelloWorld();BeanWrapper bw=new BeanWrapperImpl(hw);bw.setPropertyvalue(“msg”,”HelloWorld”);system.out.println(bw.getPropertyCalue(“msg ”));2、使用BeanFactoryInputStream is=new FileInputStream(“config.xml”);XmlBeanFactory factory=new XmlBeanFactory(is);HelloWorld hw=(HelloWorld) factory.getBean(“HelloWorld”);system.out.println(hw.getMs g());3、使用ApplicationConttextApplicationContext actx=new FleSystemXmlApplicationContext(“config.xml”);HelloWorld hw=(HelloWorld)actx.getBean(“HelloWorld”);System.out.println(hw.getMsg());四、Bean的销毁1、使用配置文件中的destory-method 属性与初始化属性init-methods类似,在Bean的类中实现一个撤销Bean 的方法,然后在配置文件中通过destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。

浅谈Spring中Bean的作用域、生命周期

浅谈Spring中Bean的作用域、生命周期

浅谈Spring中Bean的作⽤域、⽣命周期本⽂主要探究的是关于Bean的作⽤域、⽣命周期的相关内容,具体如下。

Bean的作⽤域 Spring 3中为Bean定义了5中作⽤域,分别为singleton(单例)、prototype(原型)、request、session和global session,5种作⽤域说明如下:1.singleton:单例模式,Spring IoC容器中只会存在⼀个共享的Bean实例,⽆论有多少个Bean引⽤它,始终指向同⼀对象。

Singleton作⽤域是Spring中的缺省作⽤域,也可以显⽰的将Bean定义为singleton模式,配置为:<bean id="userDao" class="erDaoImpl" scope="singleton"/>2.prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建⼀个新的Bean实例,每个Bean实例都有⾃⼰的属性和状态,⽽singleton全局只有⼀个对象。

根据经验,对有状态的bean使⽤prototype作⽤域,⽽对⽆状态的bean使⽤singleton作⽤域。

3.request:在⼀次Http请求中,容器会返回该Bean的同⼀实例。

⽽对不同的Http请求则会产⽣新的Bean,⽽且该bean仅在当前Http Request内有效。

<bean id="loginAction" class="blogs.Login" scope="request"/> ,针对每⼀次Http请求,Spring容器根据该bean的定义创建⼀个全新的实例,且该实例仅在当前Http请求内有效,⽽其它请求⽆法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。

Spring框架中的Bean生命周期

Spring框架中的Bean生命周期

Spring框架中的Bean生命周期在开发Java应用程序时,Spring框架是非常流行和常用的框架之一。

它提供了一种管理对象的方式,这些对象被称为"Bean"。

Bean的生命周期是指从它被创建到最终被销毁的整个过程。

在本文中,我将详细介绍Spring框架中Bean的生命周期。

1. Bean的定义在Spring框架中,Bean的定义是通过配置文件或注解来完成的。

开发人员可以根据实际需求,定义Bean的属性、依赖关系和作用域等。

一旦Bean被定义,Spring容器将负责管理它的生命周期。

2. Bean的实例化当Spring容器启动时,它会根据Bean的定义信息创建相应的Bean实例。

这个过程称为"实例化"。

Spring支持多种方式来实例化Bean,包括构造函数实例化、静态工厂方法实例化和实例工厂方法实例化等。

3. 设置Bean的属性一旦Bean实例化完成,Spring容器会根据定义文件或注解中的配置信息,将属性值注入到Bean中。

这个过程称为"属性注入"。

开发人员可以使用构造函数注入、Setter方法注入或自动装配等方式来设置Bean的属性。

4. Bean的初始化在完成属性注入后,Spring容器会调用Bean的初始化方法。

开发人员可以在Bean的定义中指定初始化方法,这个方法将用于执行一些初始化操作,例如建立数据库连接或加载其他资源。

Spring还提供了注解方式来指定初始化方法。

5. 使用Bean一旦Bean初始化完成,它就可以被应用程序使用了。

开发人员可以通过Spring容器获取Bean的实例,并调用其方法来完成业务逻辑。

6. Bean的销毁当应用程序关闭或不再需要某个Bean时,Spring容器会调用Bean的销毁方法。

开发人员可以在Bean的定义中指定销毁方法,用于执行一些清理操作,例如关闭数据库连接或释放其他资源。

与初始化方法一样,Spring也提供了注解方式来指定销毁方法。

Spring框架中Bean的生命周期及加载顺序

Spring框架中Bean的生命周期及加载顺序

Spring框架中Bean的⽣命周期及加载顺序Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执⾏特定的操作,常⽤的设定⽅式有以下三种:通过实现 InitializingBean/DisposableBean 接⼝来定制初始化之后/销毁之前的操作⽅法;通过 <bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调⽤的操作⽅法;在指定⽅法上加上@PostConstruct 或@PreDestroy注解来制定该⽅法是在初始化之后还是销毁之前调⽤。

这是我们就有个疑问,这三种⽅式是完全等同的吗,孰先孰后?⼀、简单介绍1、init-method⽅法,初始化bean的时候执⾏,可以针对某个具体的bean进⾏配置。

init-method需要在applicationContext.xml配置⽂档中bean的定义⾥头写明。

例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>这样,当TestBean在初始化的时候会执⾏TestBean中定义的init⽅法。

2、afterPropertiesSet⽅法,初始化bean的时候执⾏,可以针对某个具体的bean进⾏配置。

afterPropertiesSet 必须实现 InitializingBean接⼝。

实现 InitializingBean接⼝必须实现afterPropertiesSet⽅法。

3、BeanPostProcessor,针对所有Spring上下⽂中所有的bean,可以在配置⽂档applicationContext.xml中配置⼀个BeanPostProcessor,然后对所有的bean进⾏⼀个初始化之前和之后的代理。

springbean生命周期和作用域

springbean生命周期和作用域

springbean⽣命周期和作⽤域1.spring bean⽣命周期和作⽤域在前⾯博客中提到容器启动获得BeanDefinition对象中有⼀个scope 属性。

该属性控制着bean对象的作⽤域。

本章节介绍Bean的作⽤域及⽣命周期,了解bean是怎么来的⼜怎么没的。

⼀、Bean的作⽤域在Bean容器启动会读取bean的xml配置⽂件,然后将xml中每个bean元素分别转换成BeanDefinition对象。

在BeanDefinition对象中有scope 属性,就是它控制着bean的作⽤域。

Spring框架⽀持5种作⽤域,有三种作⽤域是当开发者使⽤基于web的ApplicationContext的时候才⽣效的。

下⾯就是Spring直接⽀持的作⽤域了,当然开发者也可以⾃⼰定制作⽤域。

⼀、Bean的⽣命周期前⾯章节介绍了bean容器以及bean的配置与注⼊,本章节学习bean的⽣命周期,了解bean是怎么来的⼜是怎么没的。

ApplicationContext容器中,Bean的⽣命周期流程如上图所⽰,流程⼤致如下:1.⾸先容器启动后,会对scope为singleton且⾮懒加载的bean进⾏实例化,2.按照Bean定义信息配置信息,注⼊所有的属性,3.如果Bean实现了BeanNameAware接⼝,会回调该接⼝的setBeanName()⽅法,传⼊该Bean的id,此时该Bean就获得了⾃⼰在配置⽂件中的id,4.如果Bean实现了BeanFactoryAware接⼝,会回调该接⼝的setBeanFactory()⽅法,传⼊该Bean的BeanFactory,这样该Bean就获得了⾃⼰所在的BeanFactory,5.如果Bean实现了ApplicationContextAware接⼝,会回调该接⼝的setApplicationContext()⽅法,传⼊该Bean的ApplicationContext,这样该Bean就获得了⾃⼰所在的ApplicationContext,6.如果有Bean实现了BeanPostProcessor接⼝,则会回调该接⼝的postProcessBeforeInitialzation()⽅法,7.如果Bean实现了InitializingBean接⼝,则会回调该接⼝的afterPropertiesSet()⽅法,8.如果Bean配置了init-method⽅法,则会执⾏init-method配置的⽅法,9.如果有Bean实现了BeanPostProcessor接⼝,则会回调该接⼝的postProcessAfterInitialization()⽅法,10.经过流程9之后,就可以正式使⽤该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存⼀份该bean的实例,⽽对于scope为prototype的Bean,每次被调⽤都会new⼀个新的对象,期⽣命周期就交给调⽤⽅管理了,不再是Spring容器进⾏管理了11.容器关闭后,如果Bean实现了DisposableBean接⼝,则会回调该接⼝的destroy()⽅法,12.如果Bean配置了destroy-method⽅法,则会执⾏destroy-method配置的⽅法,⾄此,整个Bean的⽣命周期结束。

面试Spring之bean的生命周期

面试Spring之bean的生命周期

⾯试Spring之bean的⽣命周期找⼯作的时候有些⼈会被问道Spring中Bean的⽣命周期,其实也就是考察⼀下对Spring是否熟悉,⼯作中很少⽤到其中的内容,那我们简单看⼀下。

在说明前可以思考⼀下Servlet的⽣命周期:实例化,初始init,接收请求service,销毁destroy;Spring上下⽂中的Bean也类似,如下1、实例化⼀个Bean--也就是我们常说的new;2、按照Spring上下⽂对实例化的Bean进⾏配置--也就是IOC注⼊;3、如果这个Bean已经实现了BeanNameAware接⼝,会调⽤它实现的setBeanName(String)⽅法,此处传递的就是Spring配置⽂件中Bean的id值4、如果这个Bean已经实现了BeanFactoryAware接⼝,会调⽤它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring⼯⼚⾃⾝(可以⽤这个⽅式来获取其它Bean,只需在Spring配置⽂件中配置⼀个普通的Bean就可以);5、如果这个Bean已经实现了ApplicationContextAware接⼝,会调⽤setApplicationContext(ApplicationContext)⽅法,传⼊Spring上下⽂(同样这个⽅式也可以实现步骤4的内容,但⽐4更好,因为ApplicationContext是BeanFactory的⼦接⼝,有更多的实现⽅法);6、如果这个Bean关联了BeanPostProcessor接⼝,将会调⽤postProcessBeforeInitialization(Object obj, String s)⽅法,BeanPostProcessor经常被⽤作是Bean内容的更改,并且由于这个是在Bean初始化结束时调⽤那个的⽅法,也可以被应⽤于内存或缓存技术;7、如果Bean在Spring配置⽂件中配置了init-method属性会⾃动调⽤其配置的初始化⽅法。

描述一下SpringBean的生命周期

描述一下SpringBean的生命周期
Байду номын сангаас
网络错误400请刷新页面重试持续报错请尝试更换浏览器或网络环境
描述一下 SpringBean的生命周期
1、解析类得到BeanDefinition (Spring创建对象不是使用程序员定义的class文件,而是使用的BeanDefination) 2、如果有多个构造方法,则需要推断构造方法 3、确定好构造方法后,进行实例化得到一个对象。(原始对象) 4、填充属性,依赖注入。 5、回调Aware,比如BeanNameAware,BeanFactoryAware 6、调用BeanPostProcessor的初始化前的方法 7、调用初始化方法 8、调用BeanPostProcessor的初始化后的方法,这里如果有AOP,则会进行AOP(代理对象) 9、如果当前创建的bean时单例,则会把bean放到单例池(实现了AOP放进去的就会是代理对象) 10、使用bean 11、spring关闭容器时调用DisposableBean中的destory()方法。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

请介绍一下Spring框架中Bean的生命周

这个配置文件就定义了一个标识为HelloWorld 的Bean。

在一个配置文档中可以定义多个Bean。

二、Bean的初始化有两种方式初始化Bean。

1、在配置文档中通过指定init-method 属性来完成在Bean的类中实现一个初始化Bean属性的方法,如init(),如:public class HelloWorld{public String msg=null;public Date date=null;public void init() {msg=”HelloWorld”;date=new Date();}……}然后,在配置文件中设置init-mothod属性:2、实现org.springframwork.beans.factory.InitializingBean接口Bean实现InitializingBean接口,并且增加afterPropertiesSet() 方法:public class HelloWorld implement InitializingBean {public String msg=null;public Date date=null;public void afterPropertiesSet() {msg=”向全世界问好!”;date=new Date();}……}那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定init-method属性了。

三、Bean的调用有三种方式可以得到Bean并进行调用:1、使用BeanWrapperHelloWorld hw=new HelloWorld();BeanWrapper bw=new BeanWrapperImpl(hw);bw.setPropertyvalue(“msg”,”
HelloWorld”);system.out.println(bw.getPropertyCalue(“msg ”));2、使用BeanFactoryInputStream is=new FileInputStream(“config.xml”);XmlBeanFactory factory=new XmlBeanFactory(is);HelloWorld hw=(HelloWorld) factory.getBean(“HelloWorld”);system.out.println(hw.getMs g());3、使用ApplicationConttextApplicationContext actx=new FleSystemXmlApplicationContext(“config.xml”);HelloWorld hw=(HelloWorld)
actx.getBean(“HelloWorld”);System.out.println(hw.getMsg());
四、Bean的销毁1、使用配置文件中的destory-method 属性与初始化属性init-methods类似,在Bean的类中实现一个撤销Bean 的方法,然后在配置文件中通过destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。

2、实现org.springframwork.bean.factory.DisposebleBean接口如果实现了DisposebleBean接口,那么Spring将自动调用bean中的Destory方法进行销毁,所以,Bean中必须提供Destory方法。

相关文档
最新文档