引言
上一篇文章咱们有怎么介绍到如何通过 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