引言

上一篇文章我们有怎么介绍到如何通过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 扩展你选哪一个?的更多相关文章

  1. Spring实战——XML和JavaConfig的混合配置

    前言 看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨.所以现在每次写完主要内容后,还需要对于格式稍稍调整下.那么有没有什么编辑模式能够在你写完文章后基本也把 ...

  2. 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

    [spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...

  3. 聊聊 Spring 的 XML Schema 扩展机制的使用方式

    前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...

  4. [Java] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽

    作者:zyl910 以往我们想在spring的xml配置文件中增加说明文本时,只能使用xml注释(<!-- 注释 -->).这对于"调试.部署时想批量屏蔽部分bean" ...

  5. Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知

    本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知     1. Spring AOP  前置通知 XML配置使用案例     2. Spring AOP   ...

  6. 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. 这一次搞懂Spring的XML解析原理

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  8. spring web.xml 难点配置总结

    web.xml web.xml是所有web项目的根源,没有它,任何web项目都启动不了,所以有必要了解相关的配置. ContextLoderListener,ContextLoaderServlet, ...

  9. Spring AOP:面向切面编程,AspectJ,是基于spring 的xml文件的方法

    导包等不在赘述: 建立一个接口:ArithmeticCalculator,没有实例化的方法: package com.atguigu.spring.aop.impl.panpan; public in ...

随机推荐

  1. Detach blobs with a contact point

    https://answers.opencv.org/question/87583/detach-blobs-with-a-contact-point/ 一.问题描述 带有接触点的斑点时遇到问题,需要 ...

  2. AttributeError: 'str' object has no attribute 'lowerr' Python常见错误

    方法名拼写错误 检查方法名拼写,如有错误改正即可 特别注意m和n

  3. 深度学习---1cycle策略:实践中的学习率设定应该是先增再降

    深度学习---1cycle策略:实践中的学习率设定应该是先增再降 本文转载自机器之心Pro,以作为该段时间的学习记录 深度模型中的学习率及其相关参数是最重要也是最难控制的超参数,本文将介绍 Lesli ...

  4. 使用SignalR ASP.NET Core来简单实现一个后台实时推送数据给Echarts展示图表的功能

    什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能. 实时 web 功能使服务器端代码可以立 ...

  5. get_started_3dsctf_2016-Pwn

    get_started_3dsctf_2016-Pwn 这个题确实有点坑,在本地能打,在远程就不能打了,于是我就换了另一种方法来做. 确这个题是没有动态链接库,且PIE是关的,所以程序的大部分地址已经 ...

  6. Day17_106_IO_利用Buffered和BufferWriter完成复制

    利用Buffered和BufferWriter完成复制 代码示例: 用BufferedReader 和 BufferWriter完成复制 import java.io.*; public class ...

  7. Python学习从入门到放弃?我不允许!!!

    嗨,大家好 这里是汐仔 很多人都说学习python学习python,打开书本,三分钟,从入门到放弃. 这怎么可以!!!大家能选择python的原因可能是看它既简单,好入门,现在俨然是语言中的一匹黑马. ...

  8. 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径

    什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...

  9. Josephus问题的queue解法

    问题描述 Josephus问题是一个非常古老的问题.它的范型描述为N个人(0到N-1)围成一圈报数,报道M的人会被剔除,直到最后一个人. 要求找出最后一个人的位置或这N个人被剔除的顺序. 解决思路 我 ...

  10. 1.7.8- HTML合并单元格

    跨行与跨列