大家好,我是被编程耽搁的文艺Tom。

前几天,有位同学向我反馈,说在面试中问到这样这样一个面试题:谈谈你对Spring Bean的了解。明天咱们就针对这样一个面试题,给大家做一个具体的介绍。我一共分三段来介绍,首先,介绍什么是Spring Bean?而后,定义Spring Bean有哪些形式?,最初,给大家介绍Spring容器是如何加载Bean的?

咱们先来看什么是Spring Bean?

1、什么是Spring Bean?
Spring Bean是Spring中最根本的组成单元,Spring 官网文档对 Bean 的解释是这样的:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and managed by a Spring IoC container.
翻译过去就是:
在 Spring 中,形成应用程序骨干并由Spring IoC容器治理的对象称为Bean。Bean是一个由Spring IoC容器实例化、组装和治理的对象。

从官网定义中,咱们能够提取出以下信息:
1、Bean是对象,一个或者多个不限定。
2、Bean托管在Spring中一个叫IoC的容器中。
3、咱们的程序是由一个个Bean形成的。
Spring是通过申明式配置的形式来定义Bean的,所有创立Bean须要的前置依赖或者参数都是通过配置文件先申明,Spring启动当前会解析这些申明好的配置内容。那么,咱们该如何去定义Spring中的Bean呢?

2、定义Spring Bean有哪些形式?
一般来说,Spring Bean的定义配置有三种形式:
第一种:基于XML的形式配置
这种配置形式次要实用于以下两类场景:
1、Bean实现类来自第三方类库、比方DataSource等
2、须要定义命名空间的配置,如:context、aop、mvc等。
举个例子,来看一段代码
<beans>

<import resource=“resource1.xml” />//导入其余配置文件Bean的定义<import resource=“resource2.xml” /><bean id="userService" class="com.gupaoedu.vip.UserService" init-method="init" destory-method="destory"> </bean><bean id="message" class="java.lang.String">  <constructor-arg index="0" value="test"></constructor-arg></bean>

</beans>
这段代码是规范的Spring配置内容,咱们从上往下来看,首先导入一个叫做resource1.xml的规范配置文件,而后,导入了第二个规范的配置文件resource2.xml,接着,定义了一个叫做userService的Bean,对应的类是com.gupaoedu.vip.UserService,并且申明了在userService实例化之后要调用init()办法,在userService销毁之后调用destory()办法。
第二种:基于注解扫描的形式配置
这种配置形式次要实用于:在开发中须要援用的类,如Controller、Service、Dao等。
两种配置办法:
<context:component-scan base-package="com.gupaoedu.vip">
  <context:include-filter type="regex" expression="com.gupaoedu.vip.mall.*"/>//蕴含的指标类
  <context:exclude-filter type="aspectj" expression="com.gupaoedu.vip.mall..*Controller+"/>   //排除的指标类
</context:component-scan>
在这段配置中,context:component-scan相当于应用了Spring内置的扫描注解的组件 @ComponentScan ,申明了须要扫描的根底包门路com.gupaoedu.vip,把所有com.gupaoedu.vip.mall上面的子包全副纳入扫描范畴。并且排除了com.gupaoedu.vip.mall 包上面所有以Controller结尾或者蕴含Controller结尾的类。

应用Spring容器治理组件的beanName规定,默认是类名首字母变小写,能够本人批改。Spring次要提供了4种内置的注解用来申明Bean。它们别离是@Controller,申明为管制层组件的Bean,@Service,申明为业务逻辑层组件的Bean,@Repository,申明为数据拜访层组件的Bean,当对组件的档次难以定位的时候应用@Component注解来申明。

Spring提供了四个注解,这些注解的作用与下面的XML定义bean成果统一,在于将组件交给Spring容器治理。组件的名称默认是类名(首字母变小写),能够本人批改:

第三种:基于Java类的配置
这种配置形式次要实用于以下两类场景:
1、须要通过代码管制对象创立逻辑的场景;
2、实现零配置,打消XML配置文件的场景。
同样还是举个例子,来看一段代码:
@Configuration
public class BeansConfiguration {

@Bean  public Student student(){        Student student = new Student();    student.setName("张三");    student.setTeacher(teacher());    return student;    }  @Bean  public Teacher teacher(){        Teacher teacher = new Teacher();    teacher.setName("Tom");    return teacher;    }

}
通过剖析这段代码,我能够理解到应用基于类的配置须要以下步骤:
1、首先,在BeansConfiguration类上配置@Configuration注解,示意将BeansConfiguration类将定义Bean的元数据
2、在办法上应用@Bean注解,办法名默认就是Bean的名称,办法返回值就是Bean的实例。
3、通过AnnotationConfigApplicationContext或子类来启动Spring容器,从而加载这些曾经申明好的注解配置。

最初,总结一下,定义Spring Bean三种形式,别离是:基于XML的形式配置、基于注解扫描的形式配置、基于元数据类的配置。
那么Bean的配置定义好当前,Spring又是如何加载这些Bean配置并创立Bean实例呢?
3、Spring容器如何加载Bean?
Spring解析这些申明好的配置内容,将这些配置内容都转化为BeanDefinition对象,BeanDefinition中简直保留了配置文件中申明的所有内容,再将BeanDefinition存到一个叫做beanDefinitionMap中。以beanName作为Key,以BeanDefinition对象作为Value。之后Spring容器,依据beanName找到对应的BeanDefinition,再去抉择具体的创立策略。而Spring具体的创立策略如图所示,大家想要高清无码图的能够在评论区留言。

对于Spring Bean的面试题解析就到这里,置信大家也曾经了解。如果想看Spring BeanDefiniton定义的小伙伴,能够关注我后续的更新内容。

我是被编程耽搁的文艺Tom,如果大家还有其余疑难,也能够在评论区留言。如果我的解析对你有帮忙,请动动手指一键三连分享给更多的人。

关注我,面试不再难!

关注微信公众号『 Tom弹架构 』回复“简历”可获取配套材料。

  • 本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『 Tom弹架构 』可获取更多技术干货!

**原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!
**