搜索
首页Javajava教程Java Spring中Bean的作用域及生命周期是什么

1.Bean的作用域

1.1 被修改的Bean案例

Java Spring中Bean的作用域及生命周期是什么

原因:Bean的作用域默认是单例模式的,也就是说所有⼈的使⽤的都是同⼀个对象!之前我们学单例模式的时候都知道,使⽤单例可以很⼤程度上提⾼性能,所以在 Spring 中Bean 的作⽤域默认也是 singleton 单例模式。

@Component
public class Users {

    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}
@Component
public class Bean1 {

    @Autowired
    private User user;
    public User getUser(){
        System.out.println("Bean1对象未修改name之前 : "+user);
        user.setName("C++");
        return user;
    }
}
@Component
public class Bean2 {
    @Autowired
    private User user;

    public User getUser(){
        return user;
    }
}
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        Bean1 bean1 = context.getBean("bean1",Bean1.class);
        System.out.println(bean1.getUser());
        Bean2 bean2 = context.getBean("bean2",Bean2.class);
        System.out.println(bean2.getUser());
    }
}

1.2 为什么使用单例模式作为默认作用域

  • 相同资源只创建一份,节省空间

  • 不需要过多的创建和销毁对象,执行速度提高

1.3 作用域

作用域,一般理解为:限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。
Bea的作⽤域是指BeanSpring整个框架中的某种⾏为模式,⽐如singleton单例作⽤域,就表
Bean在整个Spring中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个
⼈读取到的就是被修改的值。

在Spring中,bean 的作用域被称为是行为模式,因为在Spring看来,单例模式,就是一种行为,意味着在整个Spring中bean只能存在一份。

1.4 Bean的6种作用域

  • singleton:单例作⽤域

  • prototype:原型作⽤域(多例作⽤域)

  • request:请求作⽤域

  • session:会话作⽤域

  • application:全局作⽤域

  • websocket:HTTP WebSocket 作⽤域

后四种都是SpringMVC中限定使用的,因此现阶段我们只学前两个就行。

1.5 设置作用域

回到刚才的案例,Bean2希望获取到的bean对象是未被修改的,我们就可以将单例模式修改为多例模式。

使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Java Spring中Bean的作用域及生命周期是什么

Java Spring中Bean的作用域及生命周期是什么

使用@Scope("prototype")

Java Spring中Bean的作用域及生命周期是什么

2.Spring执行流程和Bean的生命周期

Java Spring中Bean的作用域及生命周期是什么

ps:当执行性到装配Bean的属性那一步时,当扫描到有属性注入时,会先停下类注入,优先进行属性注入,因为后面的方法可能会用到该属性。

2.1 Bean的生命周期

所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。

Bean 的生命周期分为以下5大部分:

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

  • 2.设置属性(Bean 注入和装配)

  • 3.Bean 初始化

实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的接口方法,例如:Spring在初始化 bean,是需要给 bean 赋予 id(name)。而设置 beanName 成功的话,就会生成一个 beadNameAware 通知;执行 BeanPostProcessor 初始化前置方法(如果没有重写此方法,按照源码操作);执行 @PostConstruct 初始化方法,依赖注入操作之后被 执行;执行自己指定的 init-method 方法(如果有指定的话),是Spring中bean标签内指定的方法;

Java Spring中Bean的作用域及生命周期是什么

这个初始化方法和上面一个用注解初始化的方法是两个不同时期的产物,init是xml时代产物,@PostConstruct是注解时代产物。优先级:当梁总方法同时存在时,优先执行注解,再执行init执行 BeanPostProcessor 初始化后置方法(如果没有重写此方法,按照源码操作)。
  • 4.使用 Bean

  • 5.销毁 Bean销毁容器的各种方法, 如 @PreDestroy、DisposableBean 接口方法、destroy-method。

@PreDestroy和destroy-method的关系和初始化方法的两个关系差不多
优先级:@ProDestroy > 重写的DisposableBean接口方法 > destroy-method

执行流程图如下:

Java Spring中Bean的作用域及生命周期是什么

ps:实例化和初始化的区别:实例化就是 分配内存空间。初始化,就是把我们一些参数,方法的具体实现逻辑给加载进去。

2.1.1生命周期演示

Java Spring中Bean的作用域及生命周期是什么

Java Spring中Bean的作用域及生命周期是什么

xml配置如下:

Java Spring中Bean的作用域及生命周期是什么

Bean

public class BeanLifeComponent implements BeanNameAware {
    @PostConstruct
    public void PostConstruct(){
        System.out.println("执行@PostConstruct");
    }
    public void init(){
        System.out.println("执行bean-init-method");
    }
    public void use(){
        System.out.println("正在使用bean");
    }
    @PreDestroy
    public void PreDestroy(){
        System.out.println("执行@PreDestroy");
    }
    public void setBeanName(String s){
        System.out.println("执行了Aware通知");
    }
}

启动类

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class);
        beanLifeComponent.use();
        context.destroy();
    }
}

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.beans"></content:component-scan>
    <bean id="1" class="com.beans.BeanLifeComponent" init-method="init"></bean>
</beans>
2.1.2 为什么要先设置属性,在进行初始化
@Controller
public class TestUser {
    @Autowired
    private Test test;

    public TestUser(){
        test.sayHi();
        System.out.println("TestUser->调用构造方法");
    }
}

如果这段代码先执行了初始化,也就是其构造方法,会用到test对象,此时还没有设置属性,test就为null,会造成空指针异常。因此必须先设置属性,在进行初始化。

以上是Java Spring中Bean的作用域及生命周期是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器