【Spring面试】六、@Autowired、@Configuration、第三方Bean的配置

文章目录

  • Q1、如何让自动注入没有找到依赖Bean时不报错?
  • Q2、如何让自动注入找到多个依赖的Bean时不报错?
  • Q3、@Autowired注解有什么作用?
  • Q4、@Autowired和@Resource之间的区别
  • Q5、@Autowired注解自动装配的过程是怎样的?
  • Q6、@Configuration的作用及解析原理
  • Q7、@Bean的方法调用是怎么保证单例的?
  • Q8、要将一个第三方的类配成Bean有哪些方式?
  • Q9、为什么@ComponentScan不设置basePackage也会扫描?

Q1、如何让自动注入没有找到依赖Bean时不报错?

答案:

@Autowired(required = false)   //默认为true
private Role role;
...

Q2、如何让自动注入找到多个依赖的Bean时不报错?

error:expected single matching bean but found 2....

给优先使用的Bean加注解@Primary

@Primary
@Component
....

Q3、@Autowired注解有什么作用?

// 可以标注在构造器、方法、参数、字段、注解类型(做为元注解)上
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
// 运行时注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {/*** Declares whether the annotated dependency is required.* 声明该注解标注的依赖是否需要一定存在于Spring容器中* 				true为必须存在,如果不存在的话就抛出NoSuchBeanDefinitionException异常*				false不要求必须存在,如果不存在也不抛出异常(一般不建议设置,可能会引发线上事故)* <p>Defaults to {@code true}.*/boolean required() default true;}

答案:

是Spring依赖注入(DI)的方式之一。特性:

  • 先按类型注入,即byType
  • 如果类型匹配到了多个,则按名字注入,byName
  • 因此,不用额外提供属性的get和set方法
  • 搭配@Qualifier和@Primary解决多个同类型的Bean的问题
//在DI的地方指定bean的名字
@Service
public class UserService {@Autowired@Qualifier("user1")private IUser user;
}
//在Bean定义的地方加一个优先主要的声明
@Primary
@Service
public class User1 implements IUser{@Overridepublic void say() {}
}

在这里插入图片描述

在构造方法上用@Autowired

这种写法会报错:

public class TraceConfig {@Autowiredprivate Info info;private final AppConfig appConfig;public TraceConfig(Info info) {this.appConfig = info;}//....
}

正确写法:

public class TraceConfig {private final AppConfig appConfig;@Autowiredpublic TraceConfig(Info info) {this.appConfig = info;}//....
}

第一种写法报错的原因是加载的顺序问题,@Autowired写在变量上的注入,要等到变量所在类完全加载完才注入,因此变量appConfig的加载要早于Info这个Bean,给appConfig赋值时,还没有注入。最后,在构造器上加Autowired注解,实际上还是使用了Autowired装配方式,并非构造器装配。

//构造器注入
public Class CarFactory{private Tank tank;public CarFactory(Tank tank) {  //按构造函数形参的类型去装配,byTypethis.tank = tank;  //按构造函数来自动装配}
}

在这里插入图片描述

在普通方法上加Autowired注解

@Service
public class UserService {@Autowiredpublic void init() {//逻辑}
}

spring会在项目启动的过程中,自动调用一次加了@Autowired注解的方法,我们可以在该方法做一些初始化的工作

在set方法上加Autowired注解

@Service
public class UserService {private UserDao user;@Autowiredpublic void setUser(UserDao user) {this.user = user;}
}

@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上。前者,Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量;后者,Spring会调用setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。

@Autowired用在方法的参数上

//构造方法的参数
@Service
public class UserService {private IUser user;public UserService(@Autowired IUser user) {this.user = user;System.out.println("user:" + user);}
}
//普通方法的参数
@Service
public class UserService {public void test(@Autowired IUser user) {user.say();}
}

@Autowired注入一个同类型所有Bean的list

@Service
public class UserService {@Autowiredprivate List<IUser> userList;//...}

此时@Autowired会自动把相同类型的IUser对象收集到集合中。

Q4、@Autowired和@Resource之间的区别

答案:

  • @Autowired是Spring提供的,@Resource是JDK提供的,不与框架强绑定
  • @Autowired是先按类型匹配,匹配到多个则按名字;@Resource默认按照名字去匹配,没匹配到则按类型去匹配

Q5、@Autowired注解自动装配的过程是怎样的?

@Autowired是通过Bean的后置处理器进行解析的,在创建一个Spring上下文的时候在构造函数中进行注册AutowiredAnnotationBeanPostProcessor,然后在Bean的创建过程中进行解析:

  • 实例化后进行预解析,即解析@Autowired标注的属性、方法,比如把属性的类型、名称、所在的类等元数据缓存起来
  • 在属性注入这一步进行真正的解析,即拿到上面缓存的元数据,去IoC容器中查找并返回注入

在根据元数据去容器中查找时:

  • 只找到一个,则将这个Bean装配给@Autowired指定的属性
  • 找到不止一个,则根据名称来查找
  • 一个也没找到,则throw exception,除非required=false

在这里插入图片描述

Q6、@Configuration的作用及解析原理

答案:

  • @Confiruration注解是用来代替xml配置方式下的spring.xml文件的(<bean>)
  • 但没有@Configuration也可以配置@Bean
  • 加了@Configuration注解会为配置类创建cglib动态代理,保证了配置类的内部方法之间依赖调用时都从容器中获取bean

在这里插入图片描述

关于解析原理:

  • 在创建Spring上下文的时候会注册一个解析配置处理器ConfigurationClassPostProcessor(实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor)
  • 在调用invokeBeanFactoyPostProcessor,就会去调用ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry进行解析配置(解析配置类说白就是去解析各种注解(@Bean @Confiquration@lmport @Component… 就是注BeanDefinition)
  • ConfigurationClassPostProcessor.postProcessBeanFactory去创建cglib动态代理

Q7、@Bean的方法调用是怎么保证单例的?

//同一个问题:
@Configuration加与不加的区别是什么?

答案:

  • 如果希望@Bean的方法返回是对象是单例,需要在类上面加上@Configuration
  • Spring 底层会为@Configuration(会在invokeBeanFactoryPostProcessor 通过内置BeanFactoryPostProcessor)生成CGLIB动态代理
  • 当@Bean方法进行互调时,则会通过CGLIB进行增强,通过调用的方法名作为Bean的名称去IoC容器中获取,进而保证了@Bean方法的单例

在这里插入图片描述

Q8、要将一个第三方的类配成Bean有哪些方式?

既然是第三方的类,那你总不能去他们代码中加一个@Component的注解,所以:

答案:

第一种:使用@Bean

@Configuration
public class MainConfig{@Beanpublic DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl("xxxx");return dataSource;}
}

第二种:使用@Import,但使用这种方式是不能像上面的@Bean一样干预这个对象的创建过程的,因为Spring直接反射+new Instance

@Import(DruidDataSource.class)
@Configuration
public class MainConfig{}

如果想操作Bean的创建,可以通过用@Import的另一种用法:

在这里插入图片描述

第三种:通过扩展接口BeanDefinitionRegistryPostProcessor(创建BeanDefinition的扩展接口都可以用来操作Bean的生产)

在这里插入图片描述

Q9、为什么@ComponentScan不设置basePackage也会扫描?

正常用法中,@ComponentScan设置扫描包的地址,然后Spring去扫描包下所有类中带@Component注解的类,并注册为BeanDefinition

答案:

因为Spring在解析@ComponentScan的时候,拿到basePackage,如果没有设置,则将你的类所在的包路径做为扫描包的路径。

在这里插入图片描述

涉及的Spring解析的源码:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 无法创建Javaweb项目也无法添加web模块

只有一个原因&#xff0c;就是使用的是社区版的idea&#xff0c;不是专业版的 如果想要idea创建动态的javaweb项目&#xff0c;还得去下载专业版 使用全新的专业版本&#xff0c;就有web模块了

冠达管理:“A股”上热搜,个股普跌!这一概念,逆市掀涨停潮

A股商场和港股商场今天上午再度低位震动&#xff0c;“A股”词条冲上微博热搜。 ​ A股商场方面&#xff0c;主要指数均跌落&#xff0c;创业板指创年内新低&#xff0c;TMT赛道团体走低&#xff0c;拖累商场人气。上午海峡西岸概念板块成为商场最大亮点之一&#xff0c;个股…

使用高斯混合模型进行聚类

一、说明 高斯混合模型 &#xff08;GMM&#xff09; 是一种基于概率密度估计的聚类分析技术。它假设数据点是由具有不同均值和方差的多个高斯分布的混合生成的。它可以在某些结果中提供有效的聚类结果。 二、Kmean算法有效性 K 均值聚类算法在每个聚类的中心周围放置一个圆形边…

Neo4j图数据库实践——基于知识图谱方法开发构建猪类养殖疾病问答查询系统

Neo4j是一个开源的、高性能的图形数据库。它被设计用于存储、检索和处理具有复杂关系的大规模数据。与传统的关系型数据库不同&#xff0c;Neo4j使用图形结构来表示数据&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这使得Neo4j在处理关系密集型数据时非常强…

【GNN 03】PyG

工具包安装&#xff1a; 不要pip安装 https://github.com/pyg-team/pytorch_geometrichttps://github.com/pyg-team/pytorch_geometric import torch import networkx as nx import matplotlib.pyplot as pltdef visualize_graph(G, color):plt.figure(figsize(7, 7))plt.xtic…

企业架构LNMP学习笔记14

默认官方模块&#xff1a; Gzip压缩&#xff1a; 压缩文件&#xff0c;使文件变小了&#xff0c;传输更快了&#xff0c;目前大部分市场浏览器都支持Gzip。 传输的时候省流量。 目的是为了提高用户的加载速度。 #开启gzip压缩 gzip on; #http协议版本 gzip_http_version 1.0…

Maven 知识点总结

文章目录 Maven1、Maven 坐标2、Maven 仓库3、Maven 依赖依赖配置依赖范围依赖调解原则排除依赖 4、Maven 生命周期5、Maven 聚合与继承 Maven Maven是一个项目管理工具&#xff0c;它包含了项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;&#xf…

无人机通信协议MAVLink简介

Micro Air Vehicle Link(简称MAVLink)用于无人系统(例如,机器人、无人机、无人车、无人船和无人潜航器)。它定义了一组无人系统和地面站之间的消息交换规则。此协议广泛用于无人驾驶系统中,特别是ArduPilot和PX4无人驾驶系统,MAVLink协议提供了强大的功能,不仅用于监视…

Linux安装Redis(详细教程)

Linux安装Redis 注&#xff1a;希望将redis安装到此目录 /usr/local/redis 希望将安装包下载到此目录 /usr/local/src 可自己选择 1.创建安装目录/usr/local/redis mkdir /usr/local/redis 2.进入安装包目录 cd /usr/local/redis 3.进行下载安装包 wget https://download…

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

JDK8新特性--函数式接口--(Consumer的概念理解,模拟练习,企业实战)全流程彻底搞懂

背景&#xff0c;起因是因为在项目开发过程中&#xff0c;发现了一处代码的写法觉得很新奇看不懂&#xff0c;了解后发现是用到了函数式接口的知识。特此学习记录&#xff0c;整体过程梳理在本文。如果你不满足就会写个CURD&#xff0c;业务代码只会new来new去&#xff0c;代码…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北京…

从零开始-与大语言模型对话学技术-gradio篇(4)

前言 本文介绍「星火杯」认知大模型场景创新赛中的落选项目- AI命理分析系统&#xff0c;属于个人娱乐练手。总结提炼了往期文章精华并发掘出新的知识。 包括本地部署版本和Web在线版本&#xff0c;两种打包方式基于 半自动化使用.bat手动打包迁移python项目 如何把 Gradio …

Java——》synchronized互斥性

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

你应该知道的几个国产化平台-行云管家

近年来我国国产化加速发展&#xff0c;国产化平台也越来越多。但还有很多小伙伴不知道有哪些&#xff0c;这里就给大家汇总几个&#xff0c;大家应该知道的国产化平台。 你应该知道的几个国产化平台 1、cpu&#xff1a;龙芯、飞腾、鲲鹏、兆芯、海光、申威 2、浏览器&#xf…

Vercel的下一件大事:AI SDK和开发人员加速器

Vercel CEO Guillermo Rauch说&#xff0c;构建AI应用程序是开发人员注册Vercel的第二大原因。Ergo&#xff1a;Vercel AI SDK和加速器。 在 2020 年代&#xff0c;很少有公司比流行的 React 框架 Next.js 的管理者 Vercel 对前端开发人员生态系统产生更大的影响。当我在 2020…

骨传导耳机怎么听到声音?骨传导耳机是否会对听力造成损害?

其实骨传导耳机让我们听到的的传声原理很简单&#xff0c;而且骨传导现象很常见&#xff0c;简单的来说&#xff0c;就是像我们平时吃薯片或者挠头发&#xff0c;无论声音再小&#xff0c;自己也能听见&#xff0c;这就是骨传导的现象&#xff0c;也是为啥骨传导耳机不需要入耳…

GitHubGiteeGitlab极狐(JihuLab)同时生成并配置SSH公私钥详细过程

GitHub-微软-github.com Gitee-开源中国- gitee.com Gitlab-乌克兰GitLab 公司-gitlab.com 极狐(JihuLab)-中国代理商运营的Gitlab -gitlab.cn或者jihulab.com 使用SSH公钥可以让你在你的电脑和GitHub等平台通讯的时候使用更安全的连接&#xff08;Git的Remote要使用SSH地址&a…

计算机竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

vue应用全局音乐(自动播放)

这里写自定义目录标题 1.从同事哪里白嫖过来的&#xff0c;主要是jq写的&#xff0c;需要单独引入jq cdn 2.打开index.html 将代码放到里面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><metaname"viewport"content…