Lesson3:Bean作用域和生命周期

目录

一、Bean作用域的引入

二、Bean作用域的概念

三、Bean的6种作用域

四、Bean作用域的设置方法(@Scope)

4.1 直接写String类型的作用域

4.2 使用全局的参数

五、Bean原理

5.1 Spring Core执行流程

5.2 Bean生命周期(从诞生到销毁的整个过程)

5.3 实例化和初始化的区别

六、总结


一、Bean作用域的引入

假设有一个公共的Bean,提供给A用户和B用户使用。在使用是A用户改了Bean对象的数据,导致B用户在使用时发生了预期之外的逻辑错误。

先在Spring中存入一个UserInform对象

package asd;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserBean {

    @Bean({"user1"})
    public UserInform getUser1(){
        UserInform userInform = new UserInform();
        userInform.setId(1);
        userInform.setName("小明");
        return userInform;
    }
}

第一个用户拿到该对象,并修改name。

package asd;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class USer {
    @Autowired
    private UserInform userInform;
    public void showUser(){
        System.out.println("未修改"+userInform);
        userInform.setName("小明明");
        System.out.println("修改后"+userInform);
    }
}

第二个用户拿到该对象

package asd;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class USer2 {
    @Autowired
    private UserInform userInform;
    public void showUser(){
        System.out.println("用户信息"+userInform);
    }
}

打印两个用户拿到的对象

import asd.USer;
import asd.USer2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        USer uSer = applicationContext.getBean("USer",USer.class);
        uSer.showUser();
        USer2 uSer2 = applicationContext.getBean("USer2", USer2.class);
        uSer2.showUser();
    }
}

从运行结果可以看出,当用户A修改了对象的值,用户B拿到的就是修改后的值。

原因: Bean默认情况下是单例状态(因为使用单例可以很大程度上提高性能),意味着所有人使用的都是同一个对象。

二、Bean作用域的概念

Bean的作用域是指Bean在Spring整个框架中的某种行为模式。比如singleton单例作用域,就表示Bean在整个Spring中只有一份,他是全局共享的,如果一个人修改了,那么另外一个人读到的就是被修改的值。

三、Bean的6种作用域

单例作用域:singleton(Spring支持)

原型作用域(多例作用域):prototype(Spring支持)

请求作用域:request(Spring MVC【SpringWeb】生效)

会话作用域:session(Spring MVC【SpringWeb】生效)

全局作用域:application(Spring MVC【SpringWeb】生效)

HTTP WebSocket作用域:websocket(Web Socket生效)

四、Bean作用域的设置方法(@Scope)

4.1 直接写String类型的作用域

    @Scope("prototype")
    @Bean({"user1"})
    public UserInform getUser1(){
        UserInform userInform = new UserInform();
        userInform.setId(1);
        userInform.setName("小明");
        return userInform;
    }

4.2 使用全局的参数

    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean({"user1"})
    public UserInform getUser1(){
        UserInform userInform = new UserInform();
        userInform.setId(1);
        userInform.setName("小明");
        return userInform;
    }

五、Bean原理

5.1 Spring Core执行流程

step1:启动Spring容器(main中).

step2:加载XML,实例化并申请内存。

step3:将添加了5大类注解的对象存储到容器中。

step4:将存储的Bean中注入的对象属性进行实例化.

5.2 Bean生命周期(从诞生到销毁的整个过程)

step1:实例化Bean对象,申请内存空间。

step2:配置Bean属性,依赖注入和装配。

step3:Bean初始化

        ①实现各种Aware通知的方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法

        ②执行BeanPostProcessor初始化前置方法

        ③执行构造器方法@PostConstruct初始化方法

        ④initial-method初始化方法

        ⑤初始化的后置方法

step4:使用Bean

step5:销毁Bean,销毁Bean的方法,@PresidentDestroy、destroy-method

5.3 实例化和初始化的区别

实例化和属性设置是Java级别的系统事件,其操作过程不可人工干预和修改。初始化是给开发者提供的,可以在实例化以后,类加载之前进行自定义事件处理。

六、总结

介绍了Bean的六种作用域,单例作用域和原型作用域是Spring核心作用域,request、session、application、websocket是Spring MVC作用域。使用@Scope设置Bean的作用域。最后介绍了Spring Core的执行流程和Bean的生命周期。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘减减

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值