基于注解的自动配置

显式配置并不怎么方便。我们必须备好配置文件,把Bean的创建信息一个不差地填写进去之后交给Spring容器,Spring容器才能进行Bean的创建。若是需要创建的Bean不多,只有二三十个还好;若是需要创建的Bean很多,有成千上万个;这时,把Bean的创建信息一个不差地填进配置文件里就难免繁杂了。

那么,有没有什么办法能够解决这个问题,让事情优雅起来,简单起来呢?

当然有的。基于注解的自动配置就能有效地解决这个问题,让事情优雅起来,简单起来。至于基于注解的自动配置有多自动,从而能够简化配置;不妨让我们紧接前文实现的music-player项目,看看改用基于注解的自动配置能使配置简化多少;进而学习基于注解的自动配置的基础知识。为此,请打开music-player项目,修改app-config.xml如下:

瞧,那些关于如何创建Bean的配置信息一个不剩,全没了!却多了以下两个神秘的配置信息:
1.XML模式文件http://www.springframework.org/schema/context/spring-context.xsd
2.XML元素

这是怎么回事呢?

原来,基于注解的自动配置对配置文件没那么多要求。只要启用组件扫描,让Spring容器扫描组件之后自动进行Bean的创建即可。这里出现的两个神秘的配置信息显然就是用来启用组件扫描的。

其中,spring-context.xsd定义了些XML元素用于支持Spring应用上下文的配置。

可是,组件是什么?Spring容器扫描组件之后又是怎样进行Bean的自动创建的呢?回答这些问题之前,让我们先在Music类和Player类上添加@Component注解如下:

这是怎么回事呢?

原来,Spring容器如果发现配置文件存在

基于这些,我们在Music类上添加@Component(value=”music”)注解,告诉Spring容器创建一个类型为Music,id为music的Bean;在Player类上添加@Component(value=”player”)注解,告诉Spring容器创建一个类型为Player,id为player的Bean

需要注意的是,组件扫描只是完成了Bean的自动创建,没有完成Bean的自动装配。因此,现有的配置是明显不够的。我们还需提供一些配置信息,告诉Spring容器怎样完成Bean的自动装配,如下:

现在,配置文件新增了个

这里做了两个改动:
1.在Music类的setMusicName方法上添加@Value(“执着”)注解。
2.在Player类的setMusic方法上添加@Autowired(required=true)注解。

这是怎么回事呢?

原来,Bean的装配分为两种:一种是字面量值装配;一种是对象装配。Spring容器扫描组件之后,如果发现组件的方法带有@Value注解,就会进行字面量值的自动装配。如果发现组件的方法带有@Autowired注解,就会进行对象的自动装配,看看带有@Autowired注解的方法需要什么类型的Bean,再从Spring容器里找到这种类型的Bean自动装配上去。

因此,@Value注解有个字符串类型的value属性,用于指定字面量值。这样,Spring容器读到@Value注解的value属性之后就能进行字面量值的自动装配了;@Autowired注解有个布尔类型的required属性,用于指定Bean的装配是不是必须的。当required属性的值等于TRUE时,Bean的装配是必须的。如果Spring容器找不到相应的Bean进行装配,就会抛出NoSuchBeanDefinitionException类型的异常。当required属性的值等于FALSE时,Bean的装配不是必须的。如果Spring容器找不到相应的Bean进行装配,则会忽略,不进行Bean的装配。required属性的值默认等于TRUE

于是我们知道了,Music类和Player类之所以带有@Component注解,是为了能被组件扫描发现。Music类的setMusicName方法之所以带有@Value(“执着”)注解,是为了把”执着”这个字面量值自动装配上去。Player类的setMusic方法之所以带有@Autowired(required=true)注解,是为了把类型为Music的Bean自动装配上去。

非常明显,基于注解的自动配置分为两步:第一步是组件扫描(Component Scanning);第二步是自动装配(Auto Wiring)。Spring容器如果发现配置文件带有

另外,

当然,除了XML配置文件,我们也能使用配置类启用组件扫描和自动装配。如下:

我们在AppConfig配置类上添加了@ComponentScan注解。@ComponentScan注解是和

还有,Spring并没有提供与

至此,我们已经知道Spring提供了两种配置方式:一种是显式配置;一种是自动配置。显式配置通过XML或Java显式描述Bean的创建信息,再由Spring容器根据具体的配置信息进行Bean的创建和装配。因此,显式配置分为两种:一种是基于XML的显式配置,通常也叫通过XML进行配置;一种是基于Java的显式配置,通常也叫通过Java进行配置。自动配置由组件扫描和自动装配组成。我们需用Java配置类或XML配置文件启用组件扫描,再往类里添加注解,告诉Spring容器哪些类是组件以及如何进行Bean的自动装配。这样,Spring容器扫描组件之后就能进行Bean的自动创建和装配了。因此,自动配置是一种基于注解的自动配置,通常也叫通过注解进行配置。

于是,关于配置的基础知识介绍完了。想必大家还有很多困惑。比如关于自动装配,当Spring容器里存在多个相同类型的Bean时,Spring容器怎么知道应该选用哪个Bean进行装配呢?讲清诸如这样的问题需要花些篇幅,将在”细说Spring”的时候另行讨论。现在,让我们开启新的征程,先来看看Spring是怎样简化JDBC的。

Original: https://www.cnblogs.com/evanlin/p/15455798.html
Author: 林雪波
Title: 基于注解的自动配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571410/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • AQS源码一窥-JUC系列

    AQS源码一窥 考虑到AQS的代码量较大,涉及信息量也较多,计划是先使用较常用的ReentrantLock使用代码对AQS源码进行一个分析,一窥内部实现,然后再全面分析完AQS,最…

    Java 2023年6月13日
    067
  • SpringBoot自动装配

    一. Spring注解发展过程 SpringBoot的自动装配依赖于注解,所以我们先来看一下注解的发展过程。 以下主要对核心注解进行说明 Spring1.0:刚刚出现注解。 @Tr…

    Java 2023年6月7日
    074
  • 数据分析网址

    数据可视化工具 百度ECharts http://echarts.baidu.com/ Cytoscape http://www.cytoscape.org/ 图表秀 http:/…

    Java 2023年6月15日
    063
  • MySQL五:InnoDB线程模型

    转载~ 一、InnoDB线程模型的组成 在Innodb存储引擎中,后台线程的主要作用是 「负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据」。此外它会将已经修改的数据文…

    Java 2023年6月8日
    070
  • 解决web.py在SAE云中的Session使用问题

    这段时间一直想尝试着在SAE中使用Python,初步选择了Web.py框架做为开发框架,但是可怜SAE上的资料少的可怜,有点问题基本上解决不了,今天解决一个Session在Sess…

    Java 2023年5月30日
    062
  • Mac环境下RabbitMq安装与测试教程

    RabbitMq安装与测试教程 Installing on Mac I. 安装 123456789 brew install rabbitmq 启动控制台之前需要先开启插件 1 ….

    Java 2023年5月30日
    0112
  • Android 虚拟机总结

    标记出不需要回收的对象,清除没有被标记的对象,它是最基础的收集算法,后续的算法都是对其的不足进行改进。 标记后会产生大量不连续的内存碎片。 将操作区域分为两块,每次只使用一块,当内…

    Java 2023年6月7日
    081
  • 我觉得 MQ 无用的理由

    不喜欢用 MQ。 如果是同一个系统内的不同模块,可以用数据库表,来传递消息;如果是不同系统间数据接口,可以用 webservice(同步,现在好像是 gRPC 有点热)、SFTP/…

    Java 2023年6月9日
    049
  • Map<String, String>转String后,转回Map

    public static Map<string,string> mapStringToMap(String str){ str=str.substring(1, st…

    Java 2023年6月5日
    061
  • SQL的执行流程

    1. SQL的语句结构 1.1 SQL92 语法 SELECT DISTINCT …,…,…(存在聚合函数) FROM …,…,… WHERE 多表的连接条…

    Java 2023年6月5日
    080
  • Java的jmap命令使用详解

    jmap命令简介 jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,…

    Java 2023年6月7日
    0139
  • Vue3的main.js的坑

    Vue2升级为Vue3之后有很多新内容,但也有很多坑,这里讲下我今天刚学Vue3遇到的坑。可以直接到最后看main.js。 首先就是Element-ui,前端vue一般都使用这个插…

    Java 2023年6月9日
    073
  • rabbitmq报错:not_a_dets_file,”/var/lib/rabbitmq/mnesia/rabbit@Sfabrici-Demo01/recovery.dets”的解决办法

    1,故障现象,rabbitmq无法启动,报错截图如下: 2,解决办法:删除掉这个文件 (base) root@Sfabrici-Demo01:/usr/lib/rabbitmq/b…

    Java 2023年5月30日
    075
  • CSharp: Proxy Pattern in donet core 3

    调用: 输出: https://github.com/apress/pro-c-sharp-10https://github.com/ProfessionalCSharp/Prof…

    Java 2023年6月16日
    045
  • Java 获取对象全部属性 包括 父类属性

    先看下反射机制是如何获取类的方法的: Class clazz = object.getClass(); clazz.getDeclaredFields(); clazz.getFi…

    Java 2023年5月29日
    062
  • Jdk内置的常用工具使用大全

    前言 此博文以jdk11中bin命令为准,旧版本被移除的命令不再介绍jdk的bin目录下面有许多命令,可以很方便的堆虚拟机进行监控或者故障排查等bin目录下的命令本质上都是Tool…

    Java 2023年5月30日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球