大厂面试官最常问的@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. Introduction to Differential Equations,Exercise 1.1,1.5,1.6,1.8,1.9,1.10

    As noted,if $z=x+iy$,$x,y\in\mathbf{R}$,then $|z|=\sqrt{x^2+y^2}$ is equivalent to $|z|^2=z\overline ...

  2. Pay Back(模拟)

    链接:https://ac.nowcoder.com/acm/contest/1086/C 题目描述 "Never a borrower nor a lender be." O h ...

  3. 35)PHP,关于PHP和html

    (1)其实无论是CSS还是js,又或者是html,都是可以随意的载入到我们的php文件中,其实这些文件就是一个外来的引入文件,所以,根本没有什么神奇的, 你要是想把php的结果有调理的展示,那么就直接 ...

  4. druid yml

    application-db.yml pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true p ...

  5. PAT甲级——1065 A+B and C (64bit)

    1065 A+B and C (64bit) Given three integers A, B and C in [−2​63​​,2​63​​], you are supposed to tell ...

  6. [LC] 149. Max Points on a Line

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  7. 吴裕雄--天生自然 R语言开发学习:数据集和数据结构

    数据集的概念 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量.表2-1提供了一个假想的病例数据集. 不同的行业对于数据集的行和列叫法不同.统计学家称它们为观测(observation)和 ...

  8. Qt Sleep、QCoreApplication::processEvents()(最佳的平衡:一边发送消息,一边睡眠)

    sleep()//秒 msleep()//毫秒 usleep()//微秒 以前为了模拟鼠标点击用过这些函数,可以让进程中断,今天发现我原来的做法其实不对.这组函数会将你当前的线程/进程变为“睡眠”状态 ...

  9. VSTO开发Excel 2013/2016工作簿项目

    范例下载:(下载后直接双击扩展名为.vsto的文件,或者双击扩展名为.xlsx的工作簿,按提示操作) ExcelWorkbook_Everything.rar

  10. OpenCV Laplace 算子

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...