大厂面试官最常问的@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编程方式)的更多相关文章

  1. Java面试官最常问的volatile关键字

    在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...

  2. 一线大厂面试官最喜欢问的15道Java多线程面试题

    前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...

  3. 这些Servlet知识你一定要知道,金九银十大厂面试官都爱问

    前言 Servlet是服务器端的Java应用程序,可以生产动态Web页面.透过JSP执行过程可以知道JSP最终被编译成一个.class文件,查看该文件对应的Java类,发现该Java类继承自org.a ...

  4. 大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?

    大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配?   很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题, ...

  5. 大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了?

    本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特别爱问Kafka相关的问题,这也不难理解,谁让Kafka是大数据领域中消息队列的唯一王者,单机十万级别的吞吐量,毫秒级别的延迟,这种天生 ...

  6. 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String 在 Java 中,我们有两种方式创建一个字符串 String x ...

  7. Java面试官最爱问的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  8. iOS开发,这样写简历才能让大厂面试官看重你!

    前言: 对于职场来说,简历就如同门面.若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力.是对一个人工 ...

  9. 【测试工程师面试】在BOSS直聘上和面试官的一问一答

    岗位描述: 信用卡核心系统功能测试,负责测试计划制定,测试设计,测试执行,测试进度掌控,自动化工具建设等工作.有责任心,执行力强,工作认真细致,逻辑思维强熟悉linux,oracle或者IBM大型机操 ...

随机推荐

  1. ubuntu下pycharm的安装

    打开百度,输入pycharm下载,点击下图的第二个英文链接. 进入后选择linux下的Community进行下载,而左边的Professional是要钱购买的,当然花钱的体验效果肯定会更好. 下载完成 ...

  2. springboot集成websocket实现大文件分块上传

    遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...

  3. [LC] 350. Intersection of Two Arrays II

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...

  4. 计算机数制与IPv4

    常用计数:十进制数 1010D.二进制 1010B.十六进制1010H 计算机数制: 数制组成=每一位上的数字*该位的值 IPV4地址一共32bit 人使用点分十进制的方式来进行记忆 IPv6地址一共 ...

  5. 关于Apache Commons-Lang3的使用

    在日常工作中,我们经常要使用到一些开源工具包,比如String,Date等等.有时候我们并不清楚有这些工具类的存在,造成在开发过程中重新实现导致时间浪费,且开发的代码质量不佳.而apache其实已经提 ...

  6. hessian学习笔记

    一.hessian是什么 Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC ...

  7. bean加载与注入之重新理解

    1.@Autowired注解不可以用在静态属性上: 解决方法: 使用实现了ApplicationContextAware接口的自定义工具类,ApplicationContextAware可以让我们获得 ...

  8. Xen入门系列四【Xen 管理实操】

    1. 克隆一台虚拟机 # virt-clone -o base -n vm-clone -f /vm/vm-clone.img 参数说明: -o 原虚拟机的名称:必须为关闭或者暂停状态. -n 新虚拟 ...

  9. LabVIEW部分视觉函数中文解说

    IMAQ Learn Pattern 2 VI 在匹配阶段创建您要搜索的图案匹配的模板图像的描述,此描述的数据被附加到输入模板图像中.在匹配阶段,从模板图像中提取模板描述符并且用于从检查图像中搜索模板 ...

  10. springboot学习笔记:10.springboot+atomikos+mysql+mybatis+druid+分布式事务

    前言 上一篇文章我们整合了springboot+druid+mybatis+mysql+多数据源: 本篇文章大家主要跟随你们涛兄在上一届基础上配置一下多数据源情况下的分布式事务: 首先,到底啥是分布式 ...