Notas del estudio de primavera: ciclo de vida y alcance del frijol

ciclo de vida del frijol

Artículo reimpreso: https://blog.csdn.net/qq_39323228/article/details/103284456

https://blog.csdn.net/w_linux/article/details/80086950

  • Crear una instancia del objeto bean (a través del constructor o el método de fábrica)
  • Establecer propiedades de objeto (setter, etc.) (inyección de dependencia)
  • Si el Bean implementa la interfaz BeanNameAware, la fábrica llama al método setBeanName () del Bean para pasar el ID del Bean. (Y el siguiente es para verificar la interfaz Aware)
  • Si el Bean implementa la interfaz BeanFactoryAware, la fábrica llama al método setBeanFactory () para pasar en la fábrica misma
  • Pase la instancia de Bean al método postProcessBeforeInitialization (Object bean, String beanname) del preprocesador del Bean
  • Llamar al método de inicialización de Bean
  • Pase la instancia de Bean al método postProcessAfterInitialization (Object bean, String beanname) del postprocesador del Bean
  • Usar frijol
  • Antes de cerrar el contenedor, llame al método de destrucción del Bean

 

Después de leer detenidamente los dos artículos anteriores, básicamente lo entiendo. Aquí está el código para comprender el ciclo de vida

package com.example.Spingbootdemo.dto;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


/**
 * @Author: xx
 * @Date: 2020/12/5
 */

public class LomBoom implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean,
    DisposableBean {
    private String field;

    public LomBoom() {
        System.out.println("SpringBean 构造方法");
    }

    public String getField() {
        System.out.println("SpringBean get方法");
        return field;
    }

    public void setField(String field) {
        System.out.println("SpringBean set方法");
        this.field = field;
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("BeanName:"+s);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactory");

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContext");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");
    }

    public void init(){
        System.out.println("init");
    }

    public void des(){
        System.out.println("des");
    }
}

 

package com.example.Spingbootdemo;

import com.example.Spingbootdemo.dto.LomBoom;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@SpringBootApplication
public class SpingbootdemoApplication {

	public static void main(String[] args) {

		SpringApplication.run(SpingbootdemoApplication.class, args);

		//ApplicationContext context = new AnnotationConfigApplicationContext(LomBoom.class);

		ApplicationContext context=new ClassPathXmlApplicationContext("component-bean.xml");

		LomBoom lomBoom = (LomBoom) context.getBean("lomBoom");
		//Bean的使用

		System.out.println(lomBoom);
		//关闭容器
		((AbstractApplicationContext) context).close();


	}

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-autowire="byName">

    <bean id="lomBoom" class="com.example.Spingbootdemo.dto.LomBoom"  init-method="init" destroy-method="des" >
        <property name="field" value="test" />
    </bean>

</beans>

 

alcance de frijol

Spring 3 define 5 ámbitos para Bean, a saber, singleton (singleton), prototipo (prototipo), solicitud, sesión y sesión global. Los 5 ámbitos se explican a continuación:

  1. Singleton: modo Singleton. Solo existe una instancia de Bean compartida en el contenedor Spring IoC. No importa cuántos Beans se refieran a ella, siempre apunta al mismo objeto. El alcance Singleton es el alcance predeterminado en Spring. También puede definir explícitamente el Bean como un modo singleton y configurarlo como:
    • <bean id = "userDao" class = "com.ioc.UserDaoImpl" scope = "singleton" />
  2. Prototype: Modo Prototype.Cada vez que se obtiene un bean definido por prototype a través del contenedor Spring, el contenedor creará una nueva instancia de Bean.Cada instancia de Bean tiene sus propias propiedades y estado, mientras que el singleton tiene solo un objeto globalmente. Según la experiencia, utilice el alcance del prototipo para beans con estado y el alcance singleton para los beans sin estado.
  3. solicitud: en una solicitud Http, el contenedor devolverá la misma instancia del Bean. Para diferentes solicitudes Http, se generará un nuevo bean y el bean solo es válido en la Solicitud Http actual.
    • <bean id = "loginAction" class = "com.cnblogs.Login" scope = "request" />, para cada solicitud Http, el contenedor Spring crea una instancia nueva de acuerdo con la definición de bean, y la instancia está solo en el solicitud Http actual La solicitud es válida, pero otras solicitudes no pueden ver los cambios de estado en la solicitud actual.Cuando finaliza la solicitud Http actual, la instancia del bean también se destruirá.
  4. Sesión: en una sesión Http, el contenedor devolverá la misma instancia del Bean. Una solicitud para una sesión diferente creará una nueva instancia, y la instancia del bean solo es válida en la sesión actual.
    • <bean id = "userPreference" class = "com.ioc.UserPreference" scope = "session" />, al igual que la solicitud Http, cada solicitud de sesión crea una nueva instancia, y las diferentes instancias no comparten atributos, y las instancias Es solo válido en su propia solicitud de sesión. Cuando finalice la solicitud, la instancia se destruirá.
  5. Sesión global: en una sesión Http global, el contenedor devolverá la misma instancia del Bean, que solo es válida cuando se utiliza el contexto del portlet.

 

Supongo que te gusta

Origin blog.csdn.net/mumuwang1234/article/details/113729550
Recomendado
Clasificación