大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)
大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)
现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法。一行 简单的注解就可以解决很多事情。但是,其实每一个注解背后都有很多值得学习和思考的内容。这 些思考的点也是很多大厂面试官喜欢问的内容。
@Configuration处理类:org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition
@Bean处理类:org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
· 项目包结构
F:.
├─java
│ └─com
│ └─example
│ └─demo4
│ │ Demo4Application.java
│ │
│ ├─configuration
│ │ PersonConfiguration.java
│ │ StuConfiguration.java
│ │
│ ├─controll
│ │ StuController.java
│ │
│ ├─dao
│ │ StuDao.java
│ │ StuDaoImp.java
│ │
│ ├─entity
│ │ Person.java
│ │ Stu.java
│ │
│ └─server
│ StuService.java
│ StuServiceImp.java
│
└─resources
application.properties
project.text
· Beans依赖图
·
·
问题1:@Configuration和@Component区别**(@Configuration自动cglib动态代理)**
·
o @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例(Spring启动时会专门处理@Configuration)。proxyBeanMethods可以设置成false,取消代理。除此之外以下@Bean无法动态代理。
o 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
o 配置类不能是 final 类
o 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
o 任何嵌套配置类都必须声明为static。
o @Bean必须是单例(默认就是,别改成prototype)
o @Component里面的@Bean不是代理的
o 代理和不代理的区别如下代码:
//拿到@Bean->person
Person person = context.getBean(Person.class);
//拿到组件
PersonConfiguration personConfiguration = context.getBean(PersonConfiguration.class);
//执行组件里面的person()方法
Person person1=personConfiguration.person();
//使用stu
System.out.println(stu.getClass().getName());
//获取组件里面的person()方法对象的hashCode
System.out.println("person1:"+person1.getClass().getName() + "@" + Integer.toHexString(person1.hashCode()));
//@Bean->person对象的hashCode
System.out.println("person:"+person.getClass().getName() + "@" + Integer.toHexString(person.hashCode()));
//从IOC容器中取出存在的personBean
Map<String, Person> beansOfType = context.getBeansOfType(Person.class);
//对比知道不代理执行组件里面的person()方法的对象不会被Spring管理,代理就会管理
System.out.println("beansOfType:"+beansOfType.get("person").getClass().getName() + "@" + Integer.toHexString(person.hashCode()));
·
问题2:expected single matching bean but found 2
·
o
同类型多个Beans,引发原因比如使用了context.getBean(Stu.class)、@Autowired只用ByType类获取或者注入Beans的时候
o
o
使用名称获取,不优先使用ByType,==如果是其它第三方(也许第三方直接ByType)那么可以采取【禁止使用】或【优先使用】
o
o
禁止使用
o
o @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class })
o application.properties里配置:spring.autoconfigure.exclude=全类名,全类名
o
优先使用(在设计层面不建议这样使用)
o
o
@Bean
@Primary
public Person person() {
return new Person();
}
o
o
==正确姿态约定好命名规则尤为重要==
o
·
问题3:could not be registered. A bean with that name has already been defined in file
·
o 组件重复问题,大多使用配置:spring.main.allow-bean-definition-overriding=true
o 以上配置会覆盖Bean,并且依然产生具体对象
具体底层实现类(谁定义存储了这些注册类??):
·
AnnotatedGenericBeanDefinition:存储@Configuration注解注释的类
·
·
ScannedGenericBeanDefinition:存储@Component、@Service、@Controller等注解注释的类
·
·
spring初始化时,会用GenericBeanDefinition或是ConfigurationClassBeanDefinition(用@Bean注解注释的类)存储用户自定义的Bean,在初始化Bean时,又会将其转换为RootBeanDefinition
大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)的更多相关文章
- Java面试官最常问的volatile关键字
在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...
- 一线大厂面试官最喜欢问的15道Java多线程面试题
前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...
- 这些Servlet知识你一定要知道,金九银十大厂面试官都爱问
前言 Servlet是服务器端的Java应用程序,可以生产动态Web页面.透过JSP执行过程可以知道JSP最终被编译成一个.class文件,查看该文件对应的Java类,发现该Java类继承自org.a ...
- 大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?
大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配? 很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题, ...
- 大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了?
本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特别爱问Kafka相关的问题,这也不难理解,谁让Kafka是大数据领域中消息队列的唯一王者,单机十万级别的吞吐量,毫秒级别的延迟,这种天生 ...
- 基础面试,为什么面试官总喜欢问String?
关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String 在 Java 中,我们有两种方式创建一个字符串 String x ...
- Java面试官最爱问的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...
- iOS开发,这样写简历才能让大厂面试官看重你!
前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...
- 【测试工程师面试】在BOSS直聘上和面试官的一问一答
岗位描述: 信用卡核心系统功能测试,负责测试计划制定,测试设计,测试执行,测试进度掌控,自动化工具建设等工作.有责任心,执行力强,工作认真细致,逻辑思维强熟悉linux,oracle或者IBM大型机操 ...
随机推荐
- mybatis: Invalid bound statement (not found)即使调试源码也很难注意的坑
需要改成 注意: 这个是不能一次性建立多级目录的 这个才是ok的
- (一)Thread的run() 和 start() 方法
Java多线程在实际开发中会遇到很多问题,对于这种争抢CPU时间片段的选手,我们或许有很多困惑,捉摸不透.即便如此,它也是可以被我们控制的. 最近在看Java多线程的书籍,里面有好多我曾经不怎么注意的 ...
- poj-3662 Telephone Lines 二分答案+最短路
链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...
- [LC] 289. Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...
- 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录
人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...
- 吴裕雄--天生自然 JAVA开发学习:多线程编程
class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...
- VLC查看日志的方法
最近使用VLC去播放rtsp网络串流总是失败,显示要查看日志,查看的方法: 进入VLC的GUI,点击视图,添加界面,添加调试窗口: 添加调试窗口,会弹出界面: 上面会有报错的提示. 大佬如果有其他的办 ...
- OpenCV 为程序界面添加滑动条
#include <cv.h> #include <highgui.h> using namespace cv; /// 全局变量的声明与初始化 ; int alpha_sli ...
- perf4j @Profiled常用写法
以下内容大部分摘抄自网络上信息. 1.默认写法 @Profiled 日志语句形如: 2009-09-07 14:37:23,734 [main] INFO org.perf4j.TimingLogge ...
- MyBatis注解及动态Sql
一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...