关于spring:谈谈你对Spring-Bean的理解

3次阅读

共计 3482 个字符,预计需要花费 9 分钟才能阅读完成。

大家好,我是被编程耽搁的文艺 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 弹架构』可获取更多技术干货!

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

正文完
 0