服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - springBoot @Enable* 注解的使用

springBoot @Enable* 注解的使用

2021-05-07 13:16心无私天地宽 Java教程

这篇文章主要介绍了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加载配置

?
1
2
3
4
5
6
7
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@autoconfigurationpackage
@import({autoconfigurationimportselector.class})
public @interface enableautoconfiguration

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

?
1
2
3
4
5
6
7
8
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 的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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<string> configurations = this.getcandidateconfigurations(annotationmetadata, attributes);
   configurations = this.removeduplicates(configurations);
   set<string> 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 一样。

?
1
2
3
4
5
public interface importbeandefinitionregistrar {
 public void registerbeandefinitions(
   annotationmetadata importingclassmetadata, beandefinitionregistry registry);
 
}

在registerbeandefinitions方法中,可以用beandefinitionregistry 注入我们想要注入的bean。

代码示例:

使用@import编写自己的@enable

1、创建2个测试bean

?
1
2
3
4
5
public class role {
}
 
public class user {
}

2、自定义enable注解

?
1
2
3
4
5
6
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@import(myenableautoconfig.class)
public @interface enablebean {
}

3、实现自己的enableautoconfiguration类

?
1
2
3
4
5
6
public class myenableautoconfig implements importselector{
 @override
 public string[] selectimports(annotationmetadata importingclassmetadata) {
  return new string[]{"com.xhn2.role","com.xhn2.user"};
 }
}

4、编写启动类

?
1
2
3
4
5
6
7
8
9
@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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<modelversion>4.0.0</modelversion>
 
 <groupid>org.csp</groupid>
 <artifactid>hello</artifactid>
 <version>1.0.0</version>
 
 <properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <project.build.sourceencoding>utf-8</project.build.sourceencoding>
 </properties>
 
 <dependencies>
  <dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-context</artifactid>
  <version>4.3.17.release</version>
  </dependency>
 </dependencies>

2、编写configuration

?
1
2
3
4
5
6
7
@configuration
public class mytest {
 @bean
 public runnable runnable() {
  return ()->{};
 }
}

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

?
1
org.springframework.boot.autoconfigure.enableautoconfiguration=com.edu.mytest

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

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

?
1
2
3
4
5
<dependency>
   <groupid>org.csp</groupid>
   <artifactid>hello</artifactid>
   <version>1.0.0</version>
  </dependency>

5、获取刚才配置的runnable

?
1
2
3
4
5
6
7
8
@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

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

原文链接:https://segmentfault.com/a/1190000015188776

延伸 · 阅读

精彩推荐
  • Java教程Java实现简易Web服务器

    Java实现简易Web服务器

    这篇文章主要为大家详细介绍了Java实现简易Web服务器的相关方法,想要制作Web服务器的朋友可以参考本文 ...

    蒋固金4412020-04-02
  • Java教程Spring根据URL参数进行路由的方法详解

    Spring根据URL参数进行路由的方法详解

    这篇文章主要给大家介绍了关于Spring根据URL参数进行路由的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    木杉7702021-02-25
  • Java教程Java TreeSet 添加失败的解决

    Java TreeSet 添加失败的解决

    这篇文章主要介绍了Java TreeSet 添加失败的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    予悦君兮善窈窕5482020-09-29
  • Java教程Java构建对象常用3种方法解析

    Java构建对象常用3种方法解析

    这篇文章主要介绍了Java构建对象常用3种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考...

    码农小胖哥2912020-09-08
  • Java教程Spring Boot下的Job定时任务

    Spring Boot下的Job定时任务

    编写Job定时执行任务十分有用,能解决很多问题,这次实习的项目里做了一下系统定时更新三方系统订单状态的功能,这里用到了Spring的定时任务使用的非常方...

    说话的方式简单点丶5162020-10-21
  • Java教程Spring Boot 整合mybatis 与 swagger2

    Spring Boot 整合mybatis 与 swagger2

    之前使用springMVC+spring+mybatis,总是被一些繁琐的xml配置,还经常出错,下面把以前的一些ssm项目改成了spring boot + mybatis,相对于来说优点太明显了,具体内容...

    也许明天11202020-12-09
  • Java教程String类的获取功能、转换功能

    String类的获取功能、转换功能

    这篇文章给大家介绍了String类的获取功能:String类的基本获取功能、获取功能的举例子、String类的基本转换功能、转换功能的举例子。具体详情大家参考下...

    cmm040111222021-04-21
  • Java教程java 获取路径的各种方法(总结)

    java 获取路径的各种方法(总结)

    下面小编就为大家带来一篇java 获取路径的各种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian5232020-06-03