大家好,今天来为大家分享@Enable模块原理分析的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
@EnableAsync 使用异步执行,
@EnableTransactionManagement 启用事务,
@EnableAutoConfiguration开启自动装配
原理
无论是Spring内置的还是我们自定义的@Enable模块,基本上都有三种实现方法,其目标都是将指定的类定位为Spring Bean:
导入的类是@Configuration类。导入类由ImportSelector实现;导入类由ImportBeanDefinitionRegistrar实现;示例1:
@配置
公共类HelloworldConfiguration {
@豆
公共字符串helloWorld() {
返回“你好,世界”;
}
}
开启EnableHelloWorld注解并获取helloWorld Bean
![]()
@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位网友表示赞同!
这篇文章写的太好了!简直就是Spring Boot入门指南的必读之作。对@Enable 模块的讲解很深入,非常容易理解!
有16位网友表示赞同!
我觉得博主讲得太过于简单了。对于比较深入的原理解释,我还需要进一步学习其他资源
有8位网友表示赞同!
这种注解的使用方法真的太方便了,以前手动配置启动器总是感觉很慢很累赘,有了@Enable 之后简直解放双手!
有13位网友表示赞同!
这篇文章对@Enable 模块的解释还是比较通俗易懂的,但是对于一些更加复杂的应用场景,可能需要更多的案例分析。
有5位网友表示赞同!
看了这篇文章后,我对 @Enable 模块有了更深刻的理解,感觉Spring Boot真不愧是开发框架中的翘楚!
有9位网友表示赞同!
@Enable 的作用主要就是简化配置?看起来确实很强大,但是我依然觉得学习这个模块还需要一些时间。
有14位网友表示赞同!
个人认为@Enable 模块的使用场景比较单一,对于大型复杂的项目,可能需要更深层次的理解才能发挥最大功效
有17位网友表示赞同!
博主的解释真的太棒了!终于明白了为什么 @Enable 模块这么重要,原来它能够自动化很多配置工作啊!
有13位网友表示赞同!
我之前一直认为SpringBoot框架很复杂,很难上手,阅读这篇文章后发现它其实非常易学。@Enable 模块就是一个很好的例子!
有9位网友表示赞同!
对于一些比较专业的读者来说,可能需要更深入的理论分析,这篇文章仅仅只提供了一些表面上的讲解
有11位网友表示赞同!
看完文章后我感觉 @Enable 模块真的很强大,可以极大地提高开发效率。我现在迫不及待想在项目中尝试一下!
有5位网友表示赞同!
我认为这篇文章内容有点浅。对于@Enable模块的原理解释,更少一些实例和代码解读,这样更容易理解!
有5位网友表示赞同!
我平时很少使用Spring Boot框架,所以对 @Enable 模块也没有深入了解。 这篇文章对我学习SpringBoot框架很有帮助!
有20位网友表示赞同!
这篇文章虽然写的不错,但是对于@Enable模块的应用场景和开发技巧,还可以更详细一些。
有5位网友表示赞同!