系列三、Spring Bean

news2024/11/17 15:26:17

一、什么是Spring bean *

一句话,被Spring容器管理的bean就是Spring bean。

二、Java bean和Spring bean对象之间的区别 

Java bean的实例化对象是自己创建出来的,Spring的bean是IOC容器创建出来的。

三、配置bean有哪几种方式 *

答:有四种方式,分别如下:

# 第一种:xml方式
<bean id="userService" class="org.star.UserService"></bean>

# 第二种:注解方式
@Component、@Controller、@Service、@Repostory
前提:需要配置扫描包

# 第三种:JavaConfig方式
@Bean

# 第四种:@Import方式

3.1、@Component和@Bean的区别

@Component是通过Spring的反射机制调用构造方法实例化的,@Bean通常和@Configuration注解搭配使用,通过方法返回,自己可以控制实例化过程。

四、Spring中bean的作用域有哪几种 *

  • singleton 单例(默认)
  • prototype 多例
  • request web应用,一个请求创建一个bean
  • session web应用,一个会话创建一个bean
  • application web应用,一个应用共享一个bean

五、单例bean的优势 **

  • 减少了新生成实例的消耗。新生成实例消耗包括两个方面
    (1)Spring底层会通过工厂模式+反射的方式实例化bean,这些都是消耗性能的操作;
    (2)给对象分配内存也会涉及到复杂的算法;
  • 减少JVM垃圾回收,不会给每个请求都生成新的实例bean,所以回收的对象变少了;
  • 可以快速地获取到bean,因为单实例的bean除了第一次getBean之外,其余都是直接从缓存中获取的,所以很快;

六、Spring的bean是线程安全的吗 ***

单例bean的情况下,如果在类中声明了成员变量,并且有读写操作,那么这个bean就存在线程安全问题,但是如果把成员变量声明在方法中,那么此时这个单例bean就是线程安全的。

七、Spring如何处理线程并发问题 ***

  • 将bean设置为多例(在类中声明了成员变量,并且有读写操作);
  • 将成员变量放到ThreadLocal中;
  • 使用同步锁(会影响服务器的吞吐量)(在类中声明了成员变量,并且有读写操作)

八、Spring实例化bean有几种方式 ***

  1. 方式一:构造器方式
  2. 方式二:通过静态工厂方式
  3. 方式三:通过实例工厂方式
  4. 方式四:通过FactoryBean
# 源码链接
https://gitee.com/augenstemn/spring-interview-parent.git

8.1、这几种创建bean的方式,有何不同

方式一由Spring控制bean的实例过程,方式二、三、四由程序员自己控制,更加灵活。

九、什么是bean的装配?什么是bean的自动装配 *

        Spring容器创建bean后,这一个个的bean如果不为其装配(又称注入)属性,那么这些bean直接是没有任何联系的,可以手动的在xml中通过property+ref的方式手动维护bean和bean之间的关系,这种方式称为手动注入,也可以通过@Autowired的方式进行自动注入。

十、自动注入的注意事项 * 

  • 一定要声明set方法
  • 覆盖:当配置了自动注入后,仍然可以使用<constructor-arg>和<property>配置来定义依赖,这些配置将覆盖自动注入

十一、自动装配的方式有几种 *

        在Spring中,对象无需自己查找或者创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,可以使用@Autowired或者@Resource注解来配置自动装配模式,在Spring框架的xml配置中共有5种自动装配:

  • no:默认的方式是不自动进行装配的,需要手动设置ref属性来进行装配bean;
  • byName:通过bean的名称来进行自动装配,如果一个bean的属性和另一个bean的name相同,就会进行自动装配;
  • byType:通过参数的数据类型进行自动装配;
  • constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配;
  • autodetect:自动探测,如果有构造方法,通过构造方法自动装配,否则使用byType方式进行自动装配(在Spring3.0+中弃用);

十二、bean有哪些生命周期的回调方法和执行顺序 **

答:生命周期的回调方法主要分两种,一种是初始化的时候进行调用的,另外一种是销毁的时候进行调用的,不管是初始化调用还是销毁时调用,都有对应的三种方式。

  1. 方式一:通过注解 @PostConstruct + @PreDestroy的方式,实现回调(优先级最高)
  2. 方式二:通过实现接口 InitializingBean, DisposableBean的方式,实现回调(优先级其次)
  3. 方式三:通过 @Bean(initMethod = "init",destroyMethod = "destroy")的方式,实现回调(优先级最低)

十三、Spring在加载过程中,bean有哪几种形态 ***

十四、bean的生命周期

bean的生命周期是指bean从创建到销毁的整个过程,分为如下四个大的过程,即:

  1. 实例化
    (1)构造器方式实例化
    (2)静态工厂实例化
    (3)实例工厂实例化
    (4)FactoryBean实例化
  2. 属性赋值
    (1)解析自动装配(byName、byType、Constructor、@Autowired) ===> DI的体现
    (2)可能会出现循环依赖问题
  3. 初始化
    (1)调用xxxAware回调方法
    (2)调用初始化生命周期回调(三种)
    (3)如果bean实现了aop,创建动态代理
  4. 销毁
    (1)在Spring容器关闭的时候进行调用
    (2)调用销毁生命周期进行回调

十五、Spring是如何解决循环依赖的

十六、Spring如何避免在并发情况下获取到不完整的bean

16.1、不完整的bean

        实例化后,属性填充及初始化之前的bean即为不完整的bean。

16.2、如何避免获取到不完整的bean

双重检查锁机制。

16.3、为什么一级缓存不加到锁里面

主要出于性能的考虑,避免已创建好的bean阻塞等待。

十七、BeanDefinition的加载过程 ****

        BeanDefinition用来描述bean的生产信息,决定bean如何生产,是一个定义态的bean。我们在创建Spring容器的时候,首先会去读取配置,然后解析配置,将符合条件的bean注册成BeanDefinitionMap,然后工厂根据这些描述信息去生产bean。

十八、如何在Spring中所有的bean创建完成后做扩展 ****

18.1、哪个地方标识着所有的bean创建完成了

循环完所有的DeanDefinition后,bean就创建完了。

# 1
public AnnotationConfigApplicationContext(String... basePackages) {
		this();
	scan(basePackages);
	refresh();
}

# 2、AbstractApplicationContext 550行
finishBeanFactoryInitialization(beanFactory);

# 3、AbstractApplicationContext 878行
beanFactory.preInstantiateSingletons();

# 4、DefaultListableBeanFactory #preInstantiateSingletons 849~903行
@Override
public void preInstantiateSingletons() throws BeansException {
	if (logger.isTraceEnabled()) {
		logger.trace("Pre-instantiating singletons in " + this);
	}

	// Iterate over a copy to allow for init methods which in turn register new bean definitions.
	// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
	List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

	// Trigger initialization of all non-lazy singleton beans...
	for (String beanName : beanNames) {
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
			if (isFactoryBean(beanName)) {
				Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
				if (bean instanceof FactoryBean) {
					final FactoryBean<?> factory = (FactoryBean<?>) bean;
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
										((SmartFactoryBean<?>) factory)::isEagerInit,
								getAccessControlContext());
					}
					else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
						getBean(beanName);
					}
				}
			}
			else {
				getBean(beanName);
			}
		}
	}

	// Trigger post-initialization callback for all applicable beans...
	for (String beanName : beanNames) {
		Object singletonInstance = getSingleton(beanName);
		if (singletonInstance instanceof SmartInitializingSingleton) {
			final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
			if (System.getSecurityManager() != null) {
				AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
					smartSingleton.afterSingletonsInstantiated();
					return null;
				}, getAccessControlContext());
			}
			else {
				smartSingleton.afterSingletonsInstantiated();
			}
		}
	}
}

18.2、两种方式

创建监听器、实现接口

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/25 10:58
 * @Description:
 */
@Component
public class MyContextRefreshedEventExtend {

    @EventListener(ContextRefreshedEvent.class)
    public void onContextRefreshedEvent(ContextRefreshedEvent event) {
        System.out.println(event);
        System.out.println("all singleton beans loaded,onContextRefreshedEvent execute success!");
    }

}


/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/25 11:03
 * @Description:
 */
@Component
public class MySmartInitializingSingletonExtend implements SmartInitializingSingleton {

    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("all singleton beans loaded,afterSingletonsInstantiated execute success!");
    }
}

十九、如何在所有的BeanDefinition注册完成后做扩展 ***

实现BeanFactoryPostProcessor接口,做扩展。

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/25 11:45
 * @Description: bean工厂的后置处理器,用于在所有的BeanDefinition注册完成后做扩展
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String definitionName : beanFactory.getBeanDefinitionNames()) {
            System.out.println("definitionName = " + definitionName);
        }
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("userService");
        beanDefinition.setScope("prototype");
    }
}

二十、bean的创建顺序是由什么决定的

bean的创建顺序是由BeanDefinition的注册顺序来决定的,当存在依赖关系时,会影响bean的创建顺序。

20.1、BeanDefinition的注册顺序是由什么决定的

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssh连接失败,提示ssh: connect to host port 22: Connection refused

情况描述 如图&#xff0c;ssh连接失败&#xff0c;连接显示器输入sudo netstat -tuln | grep 22命令查看占用22端口的服务&#xff0c;无任何输出&#xff0c;说明也不是默认端口22被占用的问题。 无法启动&#xff0c;提示如下查看 SSH 服务是否正在运行&#xff0c; syste…

ChatGLM2-6B模型尝鲜

一、前言 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上&#xff0c;ChatGLM2-6B 引入了如下新特性&#xff1a; 更强大的性能&#xff1a;基于 ChatGLM 初代模型的开发经验&#…

如何在忘记手机密码或图案时重置 Android 手机?

忘记手机密码或图案是 Android 用户一生中不得不面对的最令人沮丧的事情之一。恢复 Android 设备的唯一方法是在 Android 设备上恢复出厂设置。但许多用户不使用此方法&#xff0c;因为此过程会擦除您设备上可用的所有个人数据。 但是&#xff0c;有一种方法可以在不丢失任何数…

串口转HID键鼠功能芯片CH9329应用指南

概述 CH9329是一款串口转USB HID设备功能芯片&#xff0c;根据不同的工作模式&#xff0c;HID设备可以识别为&#xff1a;USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据&#xff0c;并自动根据串口工作模式进行数据解析&#xff0c;解析完成后按照HID类设备规范…

使用DBSyncer实现增量Mysql到Mysql的数据同步_DBSyncer1.2.4版本---数据同步之DBSyncer工作笔记006

之前都是用来postgresql到mysql的同步,需要配置postgresql的复制槽,对于mysq来说,需要配置: mysql启用binlog: https://gitee.com/ghi/dbsyncer/wikis/%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE%EF%BC%88%E6%95%B0%E6%8D%AE%E6%BA%90%EF%B…

基于springboot实现网上书城平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上书城平台管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上书城管理系统的网络应用&#xff0c;在国外网上书城管理系统已经是很普遍的方式&#xff0c;不过国内的书城管理系统可…

GT-Works3 软件和 三菱GX-works2 GXworks3 程序设计软件的联机仿真

下面这个链接的视频教程可以使用与GT-Works3 软件和 GX-works2 GXworks3 程序设计软件的联机仿真。 简单的仿真起来非常方便。 链接: 三菱GX-Developer与三菱GT-Designer3使用及联机仿真 仿真画面&#xff1a;

上门预约上门洗衣洗鞋店管理软件;

洗衣洗鞋店干洗店管理软件。闪站侠洗衣软件。是一款优秀的洗衣管理系统。支持拍照功能。支持各种会员管理。支持小票和报表打印。功能强大。操作简单。上手容易。有多个案例&#xff0c;可以来体验&#xff01;

移动端ViT新利器!苹果提出稀疏专家混合模型Mobile V-MoEs

文章链接&#xff1a;https://arxiv.org/abs/2309.04354 最近&#xff0c;专家混合模型MoE受到了学术界和工业界的广泛关注&#xff0c;其能够对任意输入来激活模型参数中的一小部分来将模型大小与推理效率分离&#xff0c;从而实现模型的轻量化设计。目前MoE已经在自然语言处理…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…

基于Java的电影院订票管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

麒麟KYLINOS通过命令行配置kysec的防火墙

原文链接&#xff1a;麒麟KYLINOS通过命令行配置kysec的防火墙 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇使用命令行配置kysec的防火墙的文章&#xff0c;通过本篇文章的学习&#xff0c;大家可以了解到图形化界面中的防火墙信息是如何生成的&#xff0c;为后期…

修改谷歌浏览器标签页名字

1. 背景 在开发过程中&#xff0c;有时我们会对同一个网站打开很多的浏览器标签页&#xff0c;比如 百度首页 页面&#xff0c;用来同时保存多个开发窗口&#xff0c;多个标签页内有不同的内容&#xff0c;但是多个标签页的名称是根据网站自动提取的&#xff0c;完全一样&…

Leetcode. 2866.美丽塔II

要求O&#xff08;N&#xff09;复杂度内解决&#xff0c;考虑单调栈&#xff0c;这个题很像经典的美丽度的那个单调栈的模板题 对有每一个位置&#xff0c;考虑右边能扩展到哪来&#xff1f;不如直接从末尾来倒着看&#xff0c;发现从末尾需要维护一个单调增的单调栈&#xff…

Redis | 数据结构(03)链表

大家最熟悉的数据结构除了数组之外&#xff0c;我相信就是链表了。 Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的&#xff0c;所以 Redis 自己设计了一个链表数据结构。 链表节点结构设计 先来看看「链表节点」结构的样子&#xff1a; type…

nvm下node安装:node环境变量配置

1. 查看所有可安装的版本 nvm list available 2. 查看本地已经安装的所有版本 nvm list 3. 安装&#xff0c;命令中的版本号&#xff08;可指定版本&#xff09; nvm install 16.15.1 4. 使用指定node版本 nvm use 16.15.1 5. 卸载命令 nvm uninstall 16.15.1 6. 查看…

基于Java的蛋糕甜品商店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

浅谈安科瑞可编程电测仪表在老挝某项目的应用

摘要&#xff1a;本文介绍了安科瑞多功能电能表在老挝某项目的应用。AMC系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract&#xff1a;This article introduces the application of the multi-function energy …

第二证券:基本面改善预期强化 机构聚焦科技成长

沪指日前迎来“三连涨”。10月26日&#xff0c;上证指数、深证成指和创业板指全部收红&#xff0c;分别收涨0.48%、0.40%、0.65%。此前的两个交易日&#xff0c;上证指数、深证成指也均收涨&#xff0c;创业板指24日涨幅也达到了0.85%。 从近期密布发布的策略报告来看&#xf…

如何解决hadoop文件无法浏览问题“Failed to retrieve data from /webhdfs/v1/?op=LISTSTATUS: Server Error“

搭建好了hadoop环境后&#xff0c;namenode、datanode看着都是正常的。但是当点到browser the file system时&#xff0c;结果报错了&#xff0c;报错的内容是“Failed to retrieve data from /webhdfs/v1/?opLISTSTATUS: Server Error“. 在解决这个问题上&#xff0c;我走了…