Spring学习笔记-bean的生命周期和作用域

bean的生命周期

转载文章:https://blog.csdn.net/qq_39323228/article/details/103284456

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

  • 实例化bean对象(通过构造方法或者工厂方法)
  • 设置对象属性(setter等)(依赖注入)
  • 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
  • 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
  • 将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
  • 调用Bean的初始化方法
  • 将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
  • 使用Bean
  • 容器关闭之前,调用Bean的销毁方法

上面两篇文章仔细阅读后,就基本上大概明白了,这边放一下在了解生命周期时的代码

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>

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="com.ioc.UserDaoImpl" 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="com.cnblogs.Login" scope="request"/>,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。
  4. session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
    • <bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。
  5. global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

猜你喜欢

转载自blog.csdn.net/mumuwang1234/article/details/113729550