栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springBoot @Enable* 注解的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 {
 
 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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/140760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号