热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

springBoot@Enable*注解的使用

这篇文章主要介绍了springBoot@Enable*注解的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、为什么使用@SpringBootApplication注解,即可做到自动配置?

答:@SpringBootApplication,内部起作用的注解其实有3个。@EnableAutoConfiguration,@ComponentScan,@Configuration。这篇文章主要是讲解@EnableXX注解

2、为什么使用了@EnableAutoConfiguration。当使用了@ConfigurationProperties时,即可自动导入.yml 或者.properties里面的配置项?

答:在@EnableAutoConfiguration内部,使用了@Import注解。导入AutoConfigurationImportSelector帮助springBoot将符合条件的Configuration加载到IOC容器中。但是内部其实使用了SpringFactoriesLoader来完成。类似与java SPI的功能
,即从/META-INF/spring.factories加载配置

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration 

可以看到@Import中,其实是导入了一个AutoConfigurationImportSelector的类。最关键的是,该类实现了接口ImportSelector

public interface ImportSelector {
 /**
  * Select and return the names of which class(es) should be imported based on
  * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
  */
 String[] selectImports(AnnotationMetadata importingClassMetadata);

}

这是ImportSelector的描述,大概意思就是,该方法返回的Bean 会自动的被注入,被Spring所管理。

接着来看 AutoConfigurationImportSelector中 selectImports 的实现

public String[] selectImports(AnnotationMetadata annotationMetadata) {
  if(!this.isEnabled(annotationMetadata)) {
   return NO_IMPORTS;
  } else {
   AutoConfigurationMetadata autoCOnfigurationMetadata= AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
   AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
   List cOnfigurations= this.getCandidateConfigurations(annotationMetadata, attributes);
   cOnfigurations= this.removeDuplicates(configurations);
   Set exclusiOns= this.getExclusions(annotationMetadata, attributes);
   this.checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   cOnfigurations= this.filter(configurations, autoConfigurationMetadata);
   this.fireAutoConfigurationImportEvents(configurations, exclusions);
   return StringUtils.toStringArray(configurations);
  }
 }

代码都写得很清楚。就不解释了。

在@Import中,可以看到 有个链接指向了 ImportBeanDefinitionRegistrar。这同样是一个接口,作用跟 ImportSelector 一样。

public interface ImportBeanDefinitionRegistrar {
 public void registerBeanDefinitions(
   AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

}

在registerBeanDefinitions方法中,可以用BeanDefinitionRegistry 注入我们想要注入的Bean。

代码示例:

使用@Import编写自己的@Enable

1、创建2个测试Bean

public class Role {
}

public class User {
}

2、自定义Enable注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyEnableAutoConfig.class)
public @interface EnableBean {
}

3、实现自己的EnableAutoConfiguration类

public class MyEnableAutoConfig implements ImportSelector{
 @Override
 public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  return new String[]{"com.xhn2.Role","com.xhn2.User"};
 }
}

4、编写启动类

@EnableBean
@ComponentScan("com.xhn2")
public class Main {
 public static void main(String[] args) {
  ConfigurableApplicationContext cOntext= SpringApplication.run(Main.class, args);
  System.out.println(context.getBean(User.class));
  System.out.println(context.getBean(Role.class));
 }
}

5、运行结果

com.xhn2.User@496bc455
com.xhn2.Role@59402b8f

控制台成功打印。

代码示例2,自动装配第3方jar包的Bean

新建maven工程

1、pom.xml

4.0.0

 org.csp
 hello
 1.0.0

 
  1.8
  1.8
  UTF-8
 

 
  
  org.springframework
  spring-context
  4.3.17.RELEASE
  
 

2、编写Configuration

@Configuration
public class MyTest {
 @Bean
 public Runnable runnable() {
  return ()->{};
 }
}

在resources下新建META-INF/spring.factories文件,加入以下配置

org.springframework.boot.autoconfigure.EnableAutoCOnfiguration=com.edu.MyTest

3、将项目安装到本地maven仓库:mvn install

4、主工程引入刚才安装到本地的jar。


   org.csp
   hello
   1.0.0
  

5、获取刚才配置的Runnable

@SpringBootApplication
public class Main {
 public static void main(String[] args) {
  SpringApplication application = new SpringApplication(Main.class);
  ConfigurableApplicationContext cOntext= application.run(args);
  System.out.println(context.getBean(Runnable.class));
 }
}

6、控制台打印

com.edu.MyTest$$Lambda$153/284686302@2c07545f

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
author-avatar
手机用户2502911283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有