场景:在项目中想在当前maven项目中自动装配其他自定义的Maven项目,例如,创建数据库配置中心,被夺多个maven引用,希望简单配置,就实现springboot自动装配数据库配置类。

由此我们联想到,我们新建项目是如何装配第三方jar的?跟踪springboot源码得知,方法其实非常简单。springboot通过@EableAutoConfiguration注解,来实现这个目的。

原理:注解@EnableAutoConfiguration引用了@Import({AutoConfigurationImportSelector.class})注解,在AutoConfigurationImportSelector类中定义了getCandidateConfigurations方法加载自定义配置类。

 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}

由该方法提示的信息可以看到,如果自定义了需要装配的包,则需要在 META-INF/spring.factories文件中定义。如何定义呢?依葫芦画瓢,找到导入包中org/springframework/boot/spring-boot-autoconfigure/2.1.5.RELEASE/spring-boot-autoconfigure-2.1.5.RELEASE.jar!/META-INF/spring.factories文件(我当前使用的是2.1.5.版本,根据实际使用的版本不同,找到对应的方法即可)

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration

看到了 Auto Configure,这就我们需要配置的内容,在我们需要的导入到当前maven项目的文件resources\META-INF\spring.factories中添加需要装配的配置类的全路径,如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.boot.config.core.config.BeanConfiguration #需要装配的配置类的全路径

至此,在当前项目块的配置类实例。

原理至此,上代码

准备两个需要被引用的maven项目

第一个项目bean-core,代码结构

(1)在domain中定义了2个bean类--Order和Product,没有属性和方法,也不用添加注解。再新建BeanConfiguration配置类如下

 package com.boot.config.core.config;

 import com.boot.config.core.domain.Order;
import com.boot.config.core.domain.Product;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class BeanConfiguration { @Bean
public Order creatOrder() {
return new Order();
} @Bean
public Product createProduct() {
return new Product();
}
}

BeanConfiguration.java

(2)在spring.factories文件中添加以下内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.boot.config.core.config.BeanConfiguration #BeanConfiguration类全路径

同理在confing-core项目中,做相同的处理。

第二个项目

(1)定义数据源bean类

 package com.boot.config.core;

 /**
* 数据源属性类
*
*/
public class DatasourceProperties
{
private String driverClassName;
private String url;
private String userName;
private String password; public String getDriverClassName() {
return driverClassName;
} public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

DatasourceProperties.java

(2)定义数据源配置类

 package com.boot.config.core;

 import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class DatasourceConfig { @Bean
@ConfigurationProperties(prefix = "jdbc")
public DatasourceProperties createDatasourceProperties() {
return new DatasourceProperties();
}
}

DatasourceConfig.java

(3)配置资源文件spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.boot.config.core.DatasourceConfig

第三个项目,引用了 第一、二项目

(1)pom.xml文件中引用第三方jar包依赖

        <dependency>
<groupId>com.boot.config.core</groupId>
<artifactId>bean-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.boot.config.core</groupId>
<artifactId>config-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

(2)application.properties文件中设置数据源配置

jdbc.driverClassName=com.mySql.jdbc.mySqlDriver
jdbc.userName=root
jdbc.password=root.123
jdbc.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bookstore

(3)main方法中打印第三方配置信息

 package com.boot.auto.bootauto;

 import com.boot.config.core.DatasourceProperties;
import com.boot.config.core.config.BeanConfiguration;
import com.boot.config.core.domain.Order;
import com.boot.config.core.domain.Product;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan; //设置不装配的配置类
//@EnableAutoConfiguration(exclude= {BeanConfiguration.class})
@EnableAutoConfiguration
@ComponentScan
public class BootAutoApplication { public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(BootAutoApplication.class, args);
System.out.println(context.getBean(Order.class));
System.out.println(context.getBean(Product.class)); DatasourceProperties jdbcBean = context.getBean(DatasourceProperties.class); System.out.println(jdbcBean.getDriverClassName());
System.out.println(jdbcBean.getUrl());
System.out.println(jdbcBean.getUserName());
System.out.println(jdbcBean.getPassword()); context.close();
} }

BootAutoApplication.java

(4)打印结果

com.boot.config.core.domain.Order@3a71c100
com.boot.config.core.domain.Product@5b69fd74
com.mySql.jdbc.mySqlDriver
jdbc:mysql://localhost:3306/bookstore
root
root.123

由此可以看到我们在其他(第三方)的配置类成功装配到我们当前项目中来。

总结

1、被引用的第三方maven项目(A)中定义了配置类

2、在A项目的META_INFO/spring.properties文件中添加需要装配的配置类的全路径

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.boot.config.core.config.BeanConfiguration

3、引用项目(B)在pom.xml中添加对A的jar引用

4、使用@EnableAutoConfiguration,从而在ConfigurableApplicationContext的实例对A项目的配置进行访问操作。

github源码:https://github.com/LF20160912/boot-proj

SpringBoot框架(5)-- @EableAutoConfiguration项目应用的更多相关文章

  1. springboot框架实现启动项目执行指定代码

    说明: 当有写代码需要在项目启动时执行的时候(即项目启动完成前),可以使用这个方法. 步骤: 创建一个启动类并在类上打上@Component注解 让这个类实现CommandLineRunner接口 重 ...

  2. 小程序后端项目【Springboot框架】部署到阿里云服务器【支持https访问】

    前言: 我的后端项目是Java写的,用的Springboot框架.在部署服务器并配置https访问过程中,因为做了一些令人窒息的操作(事后发现),所以老是不能成功. 不成功具体点说就是:域名地址可以正 ...

  3. 纯手写SpringMVC到SpringBoot框架项目实战

    引言 Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 通过这种方式,springboot ...

  4. IDEA+SpringBoot+Mybatis+maven分布式项目框架的搭建

    参考文章:https://blog.csdn.net/qq_34410726/article/details/98214992 一.maven分布式工程的基本架构 demo  #父工程模块,主要用来定 ...

  5. Springboot框架

    本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...

  6. Springboot 框架学习

    Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等 ...

  7. Spring-Boot构建多模块项目

    Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...

  8. springBoot框架的搭建

    1新建一个项目: 2.注意选择JDK1.8,和选择spring initializr加载springBoot相关jar包: 3.下一步next: 4.下一步next,选择Web和MyBatis然后ne ...

  9. SpringBoot框架的权限管理系统

    springBoot框架的权限管理系统,支持操作权限和数据权限,后端采用springBoot,MyBatis,Shiro,前端使用adminLTE,Vue.js,bootstrap-table.tre ...

随机推荐

  1. Java学习之==>条件判断、循环控制

    一.条件判断 1.if-else 示例: /** * 第1种,1个分支 */ public void case1() { int age = 15; if (age > 18) { System ...

  2. nginx启动用户和nginx工作用户要一致

    [root@bogon default]# ps aux | grep "nginx: worker process" | awk '{print $1}'rootrootroot ...

  3. mysql 各数据类型的大小及长度

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...

  4. python学习之数据类型(tuple)

    3.6 元组 v = (11,22,33,'asd','汉字') 元组就是不可变的列表,又叫制度列表,属性特征与字符串相似,里边可以存放任何类型的元素. 1.元组的元素 这里元组的不可变的意思是⼦元素 ...

  5. Kaggle试水之泰坦尼克灾难

    比赛地址:https://www.kaggle.com/c/titanic 再次想吐槽CSDN,编辑界面经常卡死,各种按钮不能点,注释的颜色不能改,很难看清.写了很多卡死要崩溃. 我也是第一次参加这个 ...

  6. ubuntu系统熄屏无法唤醒

    ubuntu系统熄屏无法唤醒 解决办法:重启后,安装laptop-mode-tools工具包. 1.检查是否安装了grep laptop-mode-tools 工具包 $ dpkg -l | grep ...

  7. HDU 2100 Lovekey (26进制大数、字符串)

    Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. 开发完成的springboot项目扩展 swagger

    第一步:pom.xml 引入 swagger 配置 <swagger.version>2.9.2</swagger.version> <!--swagger start- ...

  9. Mybatis(二) SQL映射文件

    SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...

  10. A Dangerous Maze (期望值)

    https://vjudge.net/problem/LightOJ-1027?tdsourcetag=s_pctim_aiomsg [被满为姐姐碾压 降智打击题]