Bean的作用域和生命周期

文章介绍了Spring框架中Bean的作用域,包括默认的单例模式和原型模式,并通过示例解释了不同作用域对Bean实例的影响。此外,还详细阐述了Spring的执行流程,从启动容器到Bean的生命周期,包括实例化、属性设置、初始化和销毁等阶段。最后,文章展示了如何使用@Scope注解来设置Bean的作用域,并演示了Bean的初始化和销毁方法的执行过程。
摘要由CSDN通过智能技术生成

目录

一、Bean的作用域

🎈 Bean的作用域  

 🎈 Bean的6中作用域

🎈 设置Bean的作用域 

二、Spring的执行流程和Bean的生命周期

🎈 Spring的执行流程(生命周期)

🎈 Bean的生命周期


一、Bean的作用域

🍅 先看示例(可以不看,只是帮助理解什么是作用域,作用域的具体内容往下):

创建里一个实体类User,

package com.java.demo.model;

public class User {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

然就将对象存储到带有@Bean注解的方法中

/*
* 公共类
* */
@Component
public class Users {

    /*
    * 公共对象
    * */
    @Bean("user")
    public User getUser(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        return user;
    }
}

创建两个Controller类,取出对象,注入对象到user中

@Controller
public class UserController2 {
    @Autowired
    private User user;
    public void doMethod(){
        User user2 = user;
        System.out.println("UserController 修改之前:+"+user);
        user2.setName("sandy");
        System.out.println("User 修改之后:"+ user);
    }
}
@Controller
public class UserController3 {
    @Autowired
    private User user;
    public void doMethod(){
        System.out.println("UserController3:"+user);
    }
}

以上代码,目的是为了,首先UserController2中,先打印user修改之前的名字(“zhangsan”),然后在该类中设置新的名字("sandy");

然后再UserController中,拿到user本来的名字(“zhangsan”),然后运行代码main函数

public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        UserController2 userController2 = context.getBean("userController2", UserController2.class);
        userController2.doMethod();
        UserController3 userController3 = context.getBean("userController3", UserController3.class);
        userController3.doMethod();
    }

发现userController3拿到的名字是修改以后的名字:

 以上过程就和Bean的作用域有关,原因主要就是Bean对象默认是单例模式。

 如果想要让userController3拿到的名字是修改前的名字,我们可以使用@Scope

@Component
public class Users {

    /*
    * 公共对象
    * */
    @Bean("user")
    @Scope("prototype") //原型模式
    public User getUser(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        return user;
    }
}

🎈 Bean的作用域  

通过上面的例子,我们就能很好的理解Bean的作用域是什么了:

                Bean的作用域指的是Bean在Spring容器中的某种行为(单例、原型等)。

 🎈 Bean的6中作用域

Spring MVC中

1.singleton: 单例模式(默认作用域)(Spring core) 

2.prototype: 原型模式  (Spring core)

3.request: 请求作用域,只适用于Spring MVC

4.session: 会话作用域,一个HTTP会话共享一个Bean,只适用于Spring MVC项目(Spring Web)

5.application: 全局作用域,表示的是一个Context容器共享一个作用域,只适用于Spring MVC项目(Spring Web)

6.websocket: HTTP WebSocket作用域,只适用于WebSocket作用域

🎈 设置Bean的作用域 

        1. 使用@Scope

@Component
public class Users {
    /*
    * 公共对象
    * */
    @Bean("user")
    @Scope("prototype") //原型模式
    public User getUser(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        return user;
    }
}

        2.@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Component
public class Users {
    /*
    * 公共对象
    * */
    @Bean("user")
    //@Scope("prototype") //原型模式
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public User getUser(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        return user;
    }
}

二、Spring的执行流程和Bean的生命周期

🎈 Spring的执行流程(生命周期)

启动Spring容器 -> 实例化Bean(分配内存空间,从无到有) -> Bean注册到Spring容器中(存操作) -> 将Bean装配到需要的类中(取操作)

🎈 Bean的生命周期

        1.实例化Bean(为Bean分配内存空间)

        2.设置Bean属性(进行依赖注入,将依赖的Bean赋值到当前类的属性上)

        3.Bean的初始化

                (1)执行各种通知

                (2)初始化的前置方法

                (3)初始化方法

                (4)初始化的后置方法

        4.使用Bean

        5.销毁Bean

以下是Bean的初始化方法和销毁方法:

public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了BeanNameAware -> "+s);
    }

    @PostConstruct  //使用注解初始化方法
    public void doPostConstruct(){
        System.out.println("执行了@PostConstruct");
    }

    //使用xml初始化方法
    public void  myInit(){
        System.out.println("执行了myinit");
    }

    //使用注解销毁Bean
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("执行了PreDestroy方法");
    }

    public void sayHi(){
        System.out.println("使用bean");
    }
}

执行测试类:

public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                    new ClassPathXmlApplicationContext("Spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean("mybean",BeanLifeComponent.class);
        beanLifeComponent.sayHi();
        context.close();
    }

 以下是执行结果:

 

Spring Bean 的作用域生命周期是 Spring 框架中非常重要的两个概念,这里简单介绍一下。 1. Bean 的作用域 在 Spring 中,Bean 的作用域指的是 Bean 实例的创建和销毁的范围。Spring 提供了以下五种作用域: - singleton:单例模式,容器中只有一个 Bean 实例,所有对 Bean 的请求都将返回同一个实例。 - prototype:每次请求都会创建一个新的 Bean 实例。 - request:每个 HTTP 请求都会创建一个新的 Bean 实例。 - session:每个 HTTP Session 都会创建一个新的 Bean 实例。 - global session:基于 Servlet 3.0+ 的环境下,每个全局的 HTTP Session 都会创建一个新的 Bean 实例。 2. Bean 的生命周期 Bean 的生命周期指的是 Bean 实例从创建到销毁的整个过程。Spring 提供了以下七个阶段: - 实例化 Bean:Spring 根据 Bean 的定义创建一个 Bean 的实例。 - 设置 Bean 属性:Spring 将配置文件中的属性设置到 Bean 实例中。 - BeanNameAware:如果 Bean 实现了 BeanNameAware 接口,Spring 将 Bean 的 ID 传递给 setBeanName 方法。 - BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware 接口,Spring 将 BeanFactory 实例传递给 setBeanFactory 方法。 - InitializingBean:如果 Bean 实现了 InitializingBean 接口,Spring 将调用 afterPropertiesSet 方法。 - 自定义初始化方法:Bean 可以配置自定义的初始化方法。 - DisposableBean:如果 Bean 实现了 DisposableBean 接口,Spring 将调用 destroy 方法。 - 自定义销毁方法:Bean 可以配置自定义的销毁方法。 以上就是 Spring Bean 的作用域生命周期的简单介绍。理解 Bean 的作用域生命周期对于正确使用 Spring 框架非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值