面试题:

什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:

(1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。

(2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。

(3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。


spring IOC有一个非常核心的概念——Bean。由Spring容器来负责对Bean的实例化,装配和管理。XML曾经是用来描述Bean最为流行的配置方式。

Spring可以从XML配置文件中读取任何类型的元数据并自动转换成相应的 Java代码。

JavaConfig就是使用注释来描述Bean配置的组件。JavaConfig 是Spring的一个子项目,是指基于java配置的spring。

基于 JavaConfig 方式的依赖关系绑定描述基本上映射了最早的基于 XML 的配置方式,比如:

1)表达形式层面

基于 XML 的配置方式是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"><!-- bean定义 -->
</beans>

而基于 JavaConfig 的配置方式是这样的:

@Configuration
public class MockConfiguration{
// bean定义
}

任何一个标注了 @Configuration 的 Java 类定义都是一个 JavaConfig 配置类。

2)注册 bean 定义层面

基于 XML 的配置形式是这样的:

<bean id="mockService" class="..MockServiceImpl"> ...</bean>

而基于 JavaConfig 的配置形式是这样的:

@Configuration
public class MockConfiguration {
@Bean
public MockService mockService() {
return new MockServiceImpl();
}
}

任何一个标注了 @Bean 的方法,其返回值将作为一个 bean 定义注册到 Spring 的 IoC 容器,方法名将默认成为该 bean 定义的 id。

3)表达依赖注入关系层面

为了表达 bean 与 bean 之间的依赖关系,在 XML 形式中一般是这样的:

<bean id="mockService" class="..MockServiceImpl">
<property name="dependencyService" ref="dependencyService" />
</bean>
<bean id="dependencyService" class="DependencyServiceImpl" />

而在 JavaConfig 中则是这样的:

@Configuration
public class MockConfiguration {
@Bean
public MockService mockService() {
return new MockServiceImpl(dependencyService());
}@Bean
public DependencyService dependencyService() {
return new DependencyServiceImpl();
}
}

如果一个 bean 的定义依赖其他 bean,则直接调用对应 JavaConfig 类中依赖 bean 的创建方法就可以了。

在 JavaConfig 形式的依赖注入过程中,我们使用方法调用的形式注入依赖,如果这个方法返回的对象实例只被一个 bean 依赖注入,那也还好,如果多于一个 bean 需要依赖这个方法调用返回的对象实例,那是不是意味着我们就会创建多个同一类型的对象实例?

从代码表述的逻辑来看,直觉上应该是会创建多个同一类型的对象实例,但实际上最终结果却不是这样,依赖注入的都是同一个 Singleton 的对象实例,那这是如何做到的?

笔者一开始以为 Spring 框架会通过解析 JavaConfig 的代码结构,然后通过解析器转换加上反射等方式完成这一目的,但实际上 Spring 框架的设计和实现者采用了另一种更通用的方式,这在 Spring 的参考文档中有说明。即通过拦截配置类的方法调用来避免多次初始化同一类型对象的问题,一旦拥有拦截逻辑的子类发现当前方法没有对应的类型实例时才会去请求父类的同一方法来初始化对象实例,否则直接返回之前的对象实例。

所以,原来 Spring IoC 容器中有的特性(features)在 JavaConfig 中都可以表述,只是换了一种形式而已,而且,通过声明相应的 Java Annotation 反而“内聚”一处,变得更加简洁明了了。


那些高曝光率的 Annotation

@Configuration

在类上打上这一标签,表示这个类是配置类

@ComponentScan

相当于xml的<context:componentscan basepakage=>

@ComponentScan 对应 XML 配置形式中的 <context:component-scan> 元素,用于配合一些元信息 Java Annotation,比如 @Component 和 @Repository 等,将标注了这些元信息 Annotation 的 bean 定义类批量采集到 Spring 的 IoC 容器中。
我们可以通过 basePackages 等属性来细粒度地定制 @ComponentScan 自动扫描的范围,如果不指定,则默认 Spring 框架实现会从声明 @ComponentScan 所在类的 package 进行扫描。
@ComponentScan 是 SpringBoot 框架魔法得以实现的一个关键组件,大家可以重点关注,我们后面还会遇到它。

@Bean

bean的定义,相当于xml的

<bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper" />

@EnableWebMvc

相当于xml的<mvc:annotation-driven>

@ImportResource

在 XML 形式的配置中,我们通过 <import resource="XXX.xml"/> 的形式将多个分开的容器配置合到一个配置中,在 JavaConfig 形式的配置中,我们则使用 @Import 这个 Annotation 完成同样目的:

@Configuration
@Import(MockConfiguration.class)
public class XConfiguration {...
}

@Import 只负责引入 JavaConfig 形式定义的 IoC 容器配置,如果有一些遗留的配置或者遗留系统需要以 XML 形式来配置(比如 dubbo 框架),我们依然可以通过 @ImportResource 将它们一起合并到当前 JavaConfig 配置的容器中。

@PropertySource

@PropertySource 用于从某些地方加载 *.properties 文件内容,并将其中的属性加载到 IoC 容器中,便于填充一些 bean 定义属性的占位符(placeholder),当然,这需要 PropertySourcesPlaceholderConfigurer 的配合。

如果我们使用 Java 8 或者更高版本开发,那么,我们可以并行声明多个 @PropertySource:

@Configuration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
@PropertySource("...")
public class XConfiguration{...
}

如果我们使用低于 Java 8 版本的 Java 开发 Spring 应用,又想声明多个 @PropertySource,则需要借助 @PropertySources 的帮助了,代码如下所示:

@PropertySources({ @PropertySource("classpath:1.properties"), @PropertySource("classpath:2.properties"), ...})
public class XConfiguration{...
}

 @Profile

spring3.1开始引入,一般用于多环境配置,激活时可用@ActiveProfiles注解,@ActiveProfiles("dev")

等同于xml配置

<beans profile="dev">
    <bean id="beanname" class="com.pz.demo.ProductRPC"/>
</beans>

激活该profile spring.profiles.active,也可设置默认值 spring.profiles.default
<context-param>
    <param-name>spring.profiles.default</param-name>
    <param-value>dev</param-value>
</context-param>

springBoot-03 javaConfig相关推荐

  1. SpringBoot+Mybatis加载Mapper.xml文件的两种方式

    前言:我们在平常工作中用到mybatis去加载Mapper.xml文件,可能mapper文件放的路径不一样,由此我们需要配置多个路径,幸运的是Mybatis支持我们配置多个不同路径.现在介绍两种方法. ...

  2. springboot导包显示不存在_(一)SpringBoot搭建基本后端应用

    boot在计算机术语中是启动的意思,SpringBoot也就是Spring的启动器. 稍有经验的JavaWeb程序员对于传统SSM结构的MVC应用,大多数最不好的体验就是搭建一个项目需要进行大量的配置 ...

  3. SpringBoot(1)---SpringBoot2.0技术视频教程

    SpringBoot2.0技术视频教程 01.第一节-SpringBoot2.0课程介绍 02.第二节-为什么要用SpringBoot 03.第三节-SpringCloud与SpringBoot关系 ...

  4. SpringBoot+MyBatis+MySql实现的医院管理系统

    目录 一.摘要 二.开发目标开发环境及相关技术介绍 2.1.Springboot开发构架介绍 2.2. MySQL数据库介绍 功能截图 代码截图 数据库截图 下载地址 一.摘要 目前各医疗机构中,绝大 ...

  5. 基于SSM+SpringBoot+MySQL+LayUI的医院信息管理系统(附论文)

    项目运行截图 二.开发目标开发环境及相关技术介绍 医院管理系统的开发目标主要包括: 实现医院内部的挂号.收费.药房.药库.科室.病床的信息化管理.提供记录医院内部各类经营决策汇总和明细的月报表.年报表 ...

  6. SpringBoot框架介绍

    SpringBoot框架 简单介绍 前言: 我们大家都知道Spring,Boot是启动的意思,所以SpringBoot其实是一个启动Spring项目的一个工具,从根本上讲,SpringBoot就是一些 ...

  7. 【计算机毕业设计】医院管理系统源码

    一.系统截图(需要演示视频可以私聊) 一.摘要 目前各医疗机构中,绝大部分中小型医疗机构内部没有实现任何信息化管理,医院临床信息,业务流程的数据依然采取纸质记录,造成数据容易丢失,对医院造成重大损失. ...

  8. 第三阶段:Web前端:02数据库(sql语言、JDBC数据库连接) | 03(1)SpringBoot

    二.数据库--> MySQl或MariaDB 0.1.Mysql-安装步骤 进入网址 http://doc.canglaoshi.org/-->常用下载:Windows必备-->Ma ...

  9. JavaConfig+springboot入门

    JavaConfig出现历史 Spring1.x 时代 通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换:但是,Sp ...

  10. springcloud springboot 异常拦截器 项目完善03

    springcloud springboot 异常拦截器 项目完善03 > 创建异常拦截器,在controller层没处理的异常抛出时,异常拦截器拦截后输入自定义的报错信息. 新建GlobalE ...

最新文章

  1. 【神经网络】(11) 轻量化网络MobileNetV1代码复现、解析,附Tensorflow完整代码
  2. Math.Round()——面试题小结
  3. JavaWeb:CSS层叠样式表
  4. 【模拟】P1563 玩具谜题
  5. DCMTK:类DcmVR:值表示
  6. Centos7 WARNING: ‘aclocal-1.15‘ is missing on your system.
  7. 最全三大框架整合(使用映射)——applicationContext.xml里面的配置
  8. 深入浅出看懂AlphaGo Zero - PaperWeekly 第51期
  9. Codeforces Round #281 (Div. 2) A. Vasya and Football 模拟
  10. GDAL/OGR 1.9.0获取shp文件中中文字段值和属性值乱码文件解决
  11. Java注解 编译_Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)
  12. 刷新include引进的页面
  13. Android开发里的自定义View的实现
  14. Oracle日期函数
  15. Rejected connection from xx.xx.xx.xx, address already has the configured maximum of 10 connections
  16. Qt编写邮件客户端IMAP4(一)收取邮件
  17. a java exception has occured java
  18. php webshell 木马,消灭php webshell与一句话木马
  19. Python 使用 Web3.py 进行 ETH 和代币转账
  20. 学生托管班_小学生托管班托管班价格是多少?如何收费?

热门文章

  1. 洛阳市计算机学校分布在什么地方,2019年洛阳中小学学区划分最新分布图_洛阳学区划分图...
  2. 一款基于VUE的动态化弹出层插件
  3. Maltab GUI课程设计——数独游戏
  4. Fabric 1.0源代码分析(38) Peer #BroadcastClient(Broadcast客户端)
  5. Fabric 1.0源代码分析(17)gossip(流言算法) #deliverclient(deliver客户端)
  6. keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解
  7. el-select 选中后二次确认弹窗~
  8. CPGAVAS2|叶绿体注释工具
  9. 第18章_MySQL8其它新特性(窗口函数、公用表表达式)
  10. Screen, Viewport 和 Rect 浅析