首页 > 自考资讯 > 自考资讯

@Enable模块原理分析

2024-10-09

大家好,今天来为大家分享@Enable模块原理分析的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

@EnableAsync 使用异步执行,

@EnableTransactionManagement 启用事务,

@EnableAutoConfiguration开启自动装配

原理

无论是Spring内置的还是我们自定义的@Enable模块,基本上都有三种实现方法,其目标都是将指定的类定位为Spring Bean:

导入的类是@Configuration类。导入类由ImportSelector实现;导入类由ImportBeanDefinitionRegistrar实现;示例1:

@配置

公共类HelloworldConfiguration {

@豆

公共字符串helloWorld() {

返回“你好,世界”;

}

}

开启EnableHelloWorld注解并获取helloWorld Bean

@Enable模块原理分析

@Configuration@EnableHelloWorldpublic class EnableHelloWorldBootstrap { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(); } //将当前启动类(@Configuration注解)注册到Spring上下文context.register(EnableHelloWorldBootstrap.class); //启动上下文context.refresh(); //获取Bean String helloWorld=context.getBean('helloWorld', String.class); System.out.printf('helloWorld=%s \n', helloWorld); //关闭上下文context.close(); }}执行结果:

你好世界=你好,世界

示例2:导入类实现为ImportSelector

公共接口服务器{ void start();无效关闭(); enum ServerType { HTTP, TCP }}@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME)@Documented@Import(ServerImportSelector.class)public @interface EnableServer { Server.ServerType type();} 基于注释属性,选择要定义的Bean

公共类ServerImportSelector实现ImportSelector {@Override公共String [] selectImports(AnnotationMetadata注释元数据){MapString,对象属性=注释元数据.getAnnotationAttributes(EnableServer.class.getName()); Server.ServerType serverType=(Server.ServerType)attributes.get('type'); String[] importClassNames=new String[0]; switch (serverType) { case HTTP: importClassNames=new String[]{HttpServer.class.getName()};休息; case TCP: importClassNames=new String[]{ TcpServer.class.getName()};休息; } 返回导入类名; }}启用Server并获取相应功能:

@Configuration@EnableServer(type=Server.ServerType.TCP) public class EnableServerBootsrap { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(); } context.register(EnableServerBootsrap.class);上下文.refresh() ; //获取Bean Server server=context.getBean(Server.class); //启用函数server.start();服务器.close();上下文.close(); }}执行结果:

TCP服务器启动.

Tcp服务器关闭.

示例3:

导入类被实现为ImportBeanDefinitionRegistrar

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(ServerImportBeanDefinitionRegistrar.class)public @interface EnableServer { Server.ServerType type();} 注册Bean

公共类ServerImportBeanDefinitionRegistrar 实现ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistryregistry) { ImportSelector importSelector=new ServerImportSelector(); } //过滤类名集合String[] selectedClassNames=importSelector.selectImports(importingClassMetadata); //创建Bean 定义Stream.of(selectedClassNames) //转换为BeanDefinitionBuilder 对象.map(BeanDefinitionBuilder:genericBeanDefinition) //转换为BeanDefinition .map(BeanDefinitionBuilder:getBean) .forEach(beanDefinition - { //将BeanDefinition 注册到BeanDefinitionRegistry BeanDefinitionReaderUtils.registerWithGenerateName(bean Definition) ,注册表); }} 启用Server并获取相应函数:见示例2。

内建模块

Spring内置模块

用户评论

轨迹!

这篇文章讲得真清楚! 我一直不明白@Enable是什么作用,看完后终于解决了这个问题了。原来是用来注解启动器的类哦!学习到了...

    有8位网友表示赞同!

不离我

最近在项目中遇到了一些配置问题,好像和@Enable模块有关,打算深入学习一下!这篇文章写的很详细,应该能帮到我在解决问题

    有5位网友表示赞同!

墨城烟柳

作为一名刚入门Java开发者,对Spring Boot这种框架还不太了解,这个文章正好能给我指明方向。感谢博主分享!

    有11位网友表示赞同!

?亡梦爱人

这个@Enable模块确实很重要,它能够简化启动器的配置,大大提高了开发效率。如果你的项目没有使用它的话,建议你赶紧尝试一下!

    有15位网友表示赞同!

别伤我i

这篇文章写的太好了!简直就是Spring Boot入门指南的必读之作。对@Enable 模块的讲解很深入,非常容易理解!

    有16位网友表示赞同!

浮世繁华

我觉得博主讲得太过于简单了。对于比较深入的原理解释,我还需要进一步学习其他资源

    有8位网友表示赞同!

╯念抹浅笑

这种注解的使用方法真的太方便了,以前手动配置启动器总是感觉很慢很累赘,有了@Enable 之后简直解放双手!

    有13位网友表示赞同!

剑已封鞘

这篇文章对@Enable 模块的解释还是比较通俗易懂的,但是对于一些更加复杂的应用场景,可能需要更多的案例分析。

    有5位网友表示赞同!

暮染轻纱

看了这篇文章后,我对 @Enable 模块有了更深刻的理解,感觉Spring Boot真不愧是开发框架中的翘楚!

    有9位网友表示赞同!

〆mè村姑

@Enable 的作用主要就是简化配置?看起来确实很强大,但是我依然觉得学习这个模块还需要一些时间。

    有14位网友表示赞同!

有你,很幸福

个人认为@Enable 模块的使用场景比较单一,对于大型复杂的项目,可能需要更深层次的理解才能发挥最大功效

    有17位网友表示赞同!

苍白的笑〃

博主的解释真的太棒了!终于明白了为什么 @Enable 模块这么重要,原来它能够自动化很多配置工作啊!

    有13位网友表示赞同!

孤岛晴空

我之前一直认为SpringBoot框架很复杂,很难上手,阅读这篇文章后发现它其实非常易学。@Enable 模块就是一个很好的例子!

    有9位网友表示赞同!

月下独酌

对于一些比较专业的读者来说,可能需要更深入的理论分析,这篇文章仅仅只提供了一些表面上的讲解

    有11位网友表示赞同!

(り。薆情海

看完文章后我感觉 @Enable 模块真的很强大,可以极大地提高开发效率。我现在迫不及待想在项目中尝试一下!

    有5位网友表示赞同!

雨后彩虹

我认为这篇文章内容有点浅。对于@Enable模块的原理解释,更少一些实例和代码解读,这样更容易理解!

    有5位网友表示赞同!

ゞ香草可樂ゞ草莓布丁

我平时很少使用Spring Boot框架,所以对 @Enable 模块也没有深入了解。 这篇文章对我学习SpringBoot框架很有帮助!

    有20位网友表示赞同!

哥帅但不是蟋蟀

这篇文章虽然写的不错,但是对于@Enable模块的应用场景和开发技巧,还可以更详细一些。

    有5位网友表示赞同!

猜你喜欢