Spring的Xml和JavaConfig 扩展你选哪一个?
引言
上一篇文章我们有怎么介绍到如何通过XML的形式来定义Spring的扩展《Spring面试高频题如何:自定义XML schema 扩展》,好多人都在吐槽现在都什么年代了,xml还有人再用吗?这玩意早就过时了吧,还有必要去掌握它吗?Spring官网都把这种方式放在最后面了,可想而知它的重要性到底怎样了?既然大家都吐槽了,那我们今天继续来介绍下基于注解的Spring扩展。
JavaConfig 配置扩展
从Spring3.0开始Spring提供了JavaConfig的方式可以用来代替以前XML的这种方式,原来在XML配置里的都可以通过注解来一一替换实现。主要通过@Configuration,@Bean, @Import,和@DependsOn这几个注解来搭配实现的。这种方式也是SpringBoot所使用的。
@Configuration
@Configuration只能标记在类上,表示该类为JavaConfig类,使其可以被Spring IOC容器扫描识别并创建Bean加入到容器中。@Configuration类就相当于以往的一个xml文件。下面我们看一个官网提供的例子:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
这个定义的JavaConfig就相当于原来如下XML的配置:
<beans>
<bean id="myService" class="cn.javajr.services.MyServiceImpl"/>
</beans>
@Bean
@Bean只能被标记在方法上,表示该方法返回一个Spring Bean,可以被IOC容器托管,相当于以前在xml文件中写的元素。
- name:指定一个或者多个bean的名字,当没有设置name时,Spring容器会默认将@Bean方法名作为bean name,当设置了name后,就不会再使用方法名,同时设置多个name时,除第一个name外,其他的都会作为bean的别名。相当于xml配置中的name属性。
- initMethod:指定容器在初始化完bean后调用的方法。相当于xml配置中的init-method属性。
- destroyMethod:指定在容器在销毁bean前调用的方法。相当于xml配置中的 destroy-method。
- autowire:指定bean在自动装配时依赖注入使用的策略,取值可以参考Enum类Autowire 的三个常量:Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。
@Import
XML配置中的标签,基于JavaConfig提供了@Import来组合模块化的配置类,使用方式如下所示:
@Configuration()
@Import({ApplicationContextConfig.class})
public class ApplicationContextConfig {
上面就比较简单的介绍了几种通过JavaConfig注解来替换XML形式的注解,使用起来还是非常简单的,如果你有对以前的XML配置文件都比较了解的话,使用JavaConfig就更加简单方便了。
Dubbo的JavaConfig
上篇文章我们介绍了dubbo通过XML的方式自定义扩展,今天我们就接着看看dubbo是如何通过JavaConfig来替代XML形式的扩展的。
我们看看dubbo的服务提供者是如何通过注解来实现的
@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.annotation.impl")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static class ProviderConfiguration {
}
@Configuration这个注解我们上面已经介绍过了,我们重点看下@EnableDubbo这个注解
@EnableDubbo 其实又是@EnableDubboConfig @DubboComponentScan是通过这两个组合注解来实现的,
@EnableDubboConfig注解实现如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Import(DubboConfigConfigurationRegistrar.class)
public @interface EnableDubboConfig {
这个注解使用了@Import(DubboConfigConfigurationRegistrar.class) 所以Spring 在处理
@EnableDubboConfig 注解 的时候就会去实例化DubboConfigConfigurationRegistrar
并且调用它的registerBeanDefinitions方法,这个方法主要是对propties文件进行解析并根据不同的配置
项生成对应类型的Bean对象。
总结
- 通过基于XML和基于Java的配置扩展,可以使用户通过Spring使用我们研发的组件,提供很好的易用性。
- 虽然现在大多数都是采用JavaConfig这种方式了,但是还是有人会比较喜欢xml这种方式
xml可以让配置集中化,所有的组件并不是分散的,因此使你对beans有一个很好的概览,比如mybais配置文件、SpingMvc配置文件,都放在一起,如果你需要分割文件,Spring可以帮你实现。然后(Spring)会通过内部标签进行重新组合或者外部上下文文件进行聚合。 - xml和JavaConfig 当然也是可以混合使用的,至于使用哪种方式还是看个人的编程习惯,没有哪种方式是绝对的好,各有千秋。
- 看完这两篇关于不同方式Spring的 扩展我们是不是可以自己动手去实现一个了。
结束
- 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
- 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
- 感谢您的阅读,十分欢迎并感谢您的关注。
巨人的肩膀摘苹果:
https://javajr.cn
Spring的Xml和JavaConfig 扩展你选哪一个?的更多相关文章
- Spring实战——XML和JavaConfig的混合配置
前言 看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨.所以现在每次写完主要内容后,还需要对于格式稍稍调整下.那么有没有什么编辑模式能够在你写完文章后基本也把 ...
- 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean
[spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...
- 聊聊 Spring 的 XML Schema 扩展机制的使用方式
前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...
- [Java] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽
作者:zyl910 以往我们想在spring的xml配置文件中增加说明文本时,只能使用xml注释(<!-- 注释 -->).这对于"调试.部署时想批量屏蔽部分bean" ...
- Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知
本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知 1. Spring AOP 前置通知 XML配置使用案例 2. Spring AOP ...
- 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 这一次搞懂Spring的XML解析原理
前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...
- spring web.xml 难点配置总结
web.xml web.xml是所有web项目的根源,没有它,任何web项目都启动不了,所以有必要了解相关的配置. ContextLoderListener,ContextLoaderServlet, ...
- Spring AOP:面向切面编程,AspectJ,是基于spring 的xml文件的方法
导包等不在赘述: 建立一个接口:ArithmeticCalculator,没有实例化的方法: package com.atguigu.spring.aop.impl.panpan; public in ...
随机推荐
- java例题_29 二维数组问题,并输出对角线之和
1 /*29 [程序 29 求矩阵对角线之和] 2 题目:求一个 3*3 矩阵对角线元素之和 3 程序分析:利用双重 for 循环控制输入二维数组,再将 a[i][i]累加后输出. 4 */ 5 6 ...
- SqlServer视图的创建与使用
SqlServer系列之视图的创建与使用: 什么是视图? 视图的概述 在数据查询中,可以看到数据表设计过程中,考虑到数据的冗余度低.数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一 ...
- vue 快速入门 系列 —— 初步认识 vue
其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...
- Python数据分析入门(十):数据清洗和准备
数据清洗是数据分析关键的一步,直接影响之后的处理工作 数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘? 是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作 ...
- [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.6 环路增益的测量/9.7 本章小结
9.6 环路增益的测量 测量原型反馈系统的环路增益是一个非常好的工程实践.这种实践的目的是验证系统是否被正确地建模.如果是的,那么已经应用了良好控制器设计的系统,其特性将满足相关瞬态过冲(相角裕度), ...
- python进阶(一)变量与数据类型、python之禅
一.变量: 1.变量组成:由数据.字母与下划线组合 2.不能以数字开头 3.python关键字与函数名不能作为变量名 4.当字符串变量中包含引号时,可使用单引号与双引号进行区分,或转义 print(& ...
- hahahah JavaScript 小小小细节
nice~!
- day-4 xctf-pwn CGfsb
xctf-pwn CGfsb 传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id= ...
- manjaro找不到默认键盘布局
1 问题描述 manjaro安装fcitx后,没有默认的键盘布局,不是这样: 而是: 2 解决方案 解决方案在启动fcitx时就已经有提示了: 缺少了libjson-c这个库,直接使用pacman搜索 ...
- Day07_35_Colection下的方法
Collection 下的方法 * **Collection 集合的方法应用** ``` package com.shige.Collection; import java.util.ArrayLis ...