

Spring的Xml和JavaConfig 扩展你选哪一个?
source link: https://segmentfault.com/a/1190000040063718
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上一篇文章我们有怎么介绍到如何通过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文件中写的<bean/>元素。
- 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配置中的<import/>标签,基于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)会通过内部<import>标签进行重新组合或者外部上下文文件进行聚合。 - xml和JavaConfig 当然也是可以混合使用的,至于使用哪种方式还是看个人的编程习惯,没有哪种方式是绝对的好,各有千秋。
看完这两篇关于不同方式Spring的 扩展我们是不是可以自己动手去实现一个了。
- 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
- 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
- 感谢您的阅读,十分欢迎并感谢您的关注。
巨人的肩膀摘苹果:
https://javajr.cn
Recommend
-
55
-
33
常听到一句话,“能用图描述的就不用表,能用表就不用文字”。这句话也直接的表明了:在认知上,大家对于图形的敏感度远比文字高。 但同...
-
26
每日前端夜话 0x100 每日前端夜话,陪你聊前端。 每天晚上18:00准时推送。 正文共:1094 字 预计...
-
27
npm 和 yarn 你选哪个? 作者:Charlie Midtlyng 翻译:疯狂的技术宅 原文:javascript.christmas/2019/10 未经...
-
28
code小生 一个专注大前端领域的技术平台 公众号回复 Android 加入安卓技术群 ...
-
12
没有煽情,没有废话,依然是满屏的“安徽口音英语”。在所有人都期待余承东为可能“绝唱”的Mate40,添加一些“悲壮的浪漫”元素时,他却一如往常的,直奔主题:华为史上最强大的Mate,Mate40系列。与iPhone12系列一样,此次,华为带来了四款机型:Mate40、Mate40Pro、Ma...
-
10
白手起家的三条土豪路,你选哪条?大数据话题下的优秀答主【编者按:欢迎关注微信服务号“北冥乘海生”,参与抽奖,奖品为10本《计算广告》新版签名书,月底开奖!】 前两...
-
11
Optimism VS Polygon:哪一个能更好地扩展以太坊? 比推BitpushNews 原创 2021-04-09 03:18 热度 303932 分享 微信扫一扫:分享
-
7
【ShardingSphere技术专题】「ShardingJDBC」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式) - 异次元の技术领域 - OSCHINA - 中文开源技术交流社区 ShardingSphere介绍 ShardingSphere是一套开源的分...
-
6
一、问题的描述 在实际的系统应用开发中我经常会遇到这样的一类需求,相信大家在工作中也会经常遇到: 同一个系统在多个省份部署。 一个业务在北京是一种实现方式,是基于北京用户的需求。 同样的业务在...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK