场景:在项目中想在当前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. 【HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...

  2. python学习之内置函数(一)

    4.7 内置函数 4.7.1 内置函数(1) eval 执行字符串类型的代码,并返回最终结果. eval('2 + 2') # 4 n=81 eval("n + 4") # 85 ...

  3. 【转】应用宝基于Robotium自动化测试

    (转载:http://tmq.qq.com/2016/05/robotium_for_app_test/) 1 背景目的应用宝项目组采用FT(Feature Team)模式,整个项目组分为多个FT,而 ...

  4. 第七周&实验报告五

    实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...

  5. bi的tableau

    参考: 官网: https://help.tableau.com/current/server-linux/zh-cn/get_started_server.htm 可视化分析最佳做法: 实用指南 h ...

  6. 使用render函数渲染组件

    使用render函数渲染组件:https://www.jianshu.com/p/27ec4467a66b

  7. POJ 2253 Frogger(dijkstra 最短路

    POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...

  8. Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]

    题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...

  9. Android 之 悬浮窗口

    1. 创建并设置  WindowManager  类 WindowManager mWindowManager; // 取得系统窗体 mWindowManager = (WindowManager) ...

  10. 如何解决 u盘 错误0x80071AC3:请运行chkdsk并重试

    windows: 一.win+R 打开 cmd 二.确认好U盘在电脑上显示的盘符,输入代码:chkdsk G:/f (G为U盘所在盘符) Bonus:U盘一般会有文件系统,主要有NTFS.FAT16. ...