SPI机制:为某个接口寻找服务实现的机制
java SPI就是提供这样的一个机制 ,需要在META-INF目录中设置接口的实现,以实现服务接口与实现的解耦。第三方服务厂商或者插件服务,可以依据SPI机制,实现功能扩展。
在Spring中也有一种类似与Java SPI的加载机制。它在META-INF/springfactories文件中配置接口的实现类,我们成为Spring factories机制,基于此我们可以自定义stater或SDK供他人使用,项目只在pomxml中引入SDK,无须配置即可实现功能集成。
最近的需求为例,需要实现授权功能SDK,以供其他产品使用
项目目录结构如下
第一步:在包名root目录下创建自动配置类 EsbrSdkAutoConfig
内容如下:添加
@Configuration
@ComponentScan(basePackageClasses = EsbrSdkAutoConfigclass)
标识此类为配置类,并配置扫描路径为当前类
第二步; 在resources/META-IN目录下,创建springfactories文件
内容如下:
将orgspringframeworkbootautoconfigureEnableAutoConfiguration的自动配置为值设置为第一步的EsbrSdkAutoConfig的全限定类名(包名+类名)
第三步:编写SDK的Service
通过以上三步,即可基于Spring factories机制完成自定义Starter,在其他项目pomxml中引入该starter即可
是不是很简单,下面讲解下原理
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/springfactories文件中的配置,
并通过 loadFactoryNames方法() 获取其接口类的名称
在这个方法中会遍历整个ClassLoader中所有jar包下的springfactories文件。也就是说我们可以在自己的jar中配置springfactories文件,不会影响到其它地方的配置,也不会被别人的配置覆盖。
将orgspringframeworkbootautoconfigureEnableAutoConfiguration=cnorgbjcaesbrsdkEsbrSdkAutoConfig
基于springboot自动配置,会扫描并初始化EsbrSdkAutoConfig类,并将EsbrSdkAutoConfig作为basepackage,扫描改类及其该类子包下的类,加载到spring容器。
Spring Boot极大的简化了java项目的开发,在之前如果想要开发一个java项目,需要安装tomcat或者其他容器插件。但是Spring Boot内部已经集成了tomcat,因此项目的启动异常的方便。而且Spring Boot的开发中有很多默认的配置,帮助我们省去了相当多的时间。
在idea中,File-->New-->Project
选择Spring Initializr
填写你的maven项目的groupId和artifact等项目基本信息之后,在依赖中选择Web-->Web之后finish。
目录结构如下:
直接运行DemoApplicationjava就可以运行项目了。
你也可以使用官方模板快速开始Spring Boot项目
接下来我们分析一下pomxml中的依赖。
Spring Boot中还有一个很重要的文件:applicationproperties/yml/yaml文件。
项目中的配置不再是以前的xml形式,而是写在这个文件中。Spring Boot已经为我们提供了很多默认的配置。
以上我们搭建了一个完全没有进行任何 *** 作的Spring Boot框架,下一节我们将继续为我们的项目添砖加瓦一步步深入了解Spring Boot。Spring Boot从入门到精通-初识注解、接口
我想问的是从官方网站download下来的spring 的source code,他的目录结构是这样的
E:\workspaces\spring-framework-305RELEASE\projects\orgspringframeworkaop\src\main\java\org\springframework\aop\aspectj
不是我们一般的src/org/springframework/java 这样的package,
如果你们在download source code后怎么看
怎么转化成可以直接看到的package
怎么转换成 E:\workspaces\spring-framework-305RELEASE\src\org\springframework\aop\aspectj
在一个Web应用中,通常会采用MVC设计模式实现对应的模型、视图和控制器,其中,视图是用户看到并与之交互的界面。对最初的Web应用来说,视图是由HTML元素组成的静态界面;而后期的Web应用更倾向于使用动态模板技术,从而实现前后端分离和页面的动态数据展示。Spring Boot框架为简化项目的整体开发,提供了一些视图技术支持,并主要推荐整合模板引擎技术实现前端页面的动态化内容。本文对SpringBoot常用的Thymeleaf进行整合。
Thymeleaf是一种现代的基于服务器端的Java模板引擎技术,也是一个优秀的面向Java的XML、XHTML、HTML5页面模板,它具有丰富的标签语言、函数和表达式,在使用Spring Boot框架进行页面设计时,一般会选择 Thymeleaf模板。我们在这里学习Thymeleaf 常用的标签、表达式。
Thymeleaf标签
使用标签只需要加上一个命名空间就可以了。 即修改原html的第二行就可以了。
变量表达式${}主要用于获取上下文中的变量值,示例代码如下。
这是标题
- 使用了Thymeleaf模板的变量表达式${}用来动态获取p标签中的内容 - 如果当前程序没有启动或者当前上下文中不存在title变量,该片段会显示标签默认值“这是标题”; - 如果当前上下文中存在title 变量并且程序已经启动,当前p标签中的默认文本内容将会被tite变量的值所替换,从而达到模板引擎页面数据动态替换的效果。
Thymeleaf为变量所在域提供了一些内置对象
结合上述内置对象的说明,假设要在Thymeleaf模板擎页面中动态获取当前国家信息,可以使用#locale内置对象
选择交量表达式和变量表达式用法类似,一般用于从被选定对象而不是上下文中获取属性值,如果没有选定对象,则和变量表达式一样,示例代码如下。
消息表达式#{}主要用于Thymeleaf模板页面国际化内容的动态替换和展示。使用消息表这式#{}进行国际化设置时,还需要提供一些国际化配置文件。关于消息表达式的使用,下文写国际化时会详细说明。
链接表达式@{}一般用于页面跳转或者资源的引入,在Web开发中占据着非常重要的地位,并且使用也非常频繁。
片段表达式~{}是一种用来将标记片段移动到模板中的方法。其中,最常见的用法是使用th:insert或th:replace 属性插入片段
Spring Boot默认设置了静态资源的访问路径,默认将/所有访问映射到以下目录。
我们创建一个springboot项目用于本次实验。项目名为springboot_01_thyme。java8,springboot266
创建一个LoginController类用于数据替换效果测试。
我们写一个loginhtml进行测试。我们导入一个bootstrap的样式到static/login里面,并且自己定义一些css。
最后我们通过访问>
目前都配置了相同的bean,期望是以后能配置5个不同的数据源
可以看到bean被覆盖了4次,只有一个bean生效
所有该类型的bean在声明时候被声明为primary
发生异常,可以看到不同id的bean由于都被设置成primary导致异常
很容易理解,primary对于不同ID相同的Class实例来说只能有一个,对于相同的ID实例则会直接覆盖
正常启动,可以看到创建了两个相同类型的实例
可以看到发生覆盖情况,因此可以总结出
bean是否发生覆盖只跟beanId有关而跟bean的类型无关
当两个相同的类型的bean都被配置成primary时会发生异常
当需要配置多数据源时,需要为每个子系统的bean配置不同的ID,以防发生覆盖
下面再接着说一下Springboot对properties文件的读取
我们知道在使用springboot的脚手架建立项目时默认会有applicationproperties的配置文件
Springboot读取properties文件的读取顺序如下所示
其中需要注意的是Springboot对于同文件名只读取一次,高优先级覆盖低优先级
以上是错误的解读,实际上SpringBoot是对相同的属性以先读取的为主,文件仍然会读取多次
如果上面的图容易产生混乱的话看下面的顺序就好理解了
通俗的说SpringBoot默认只加载application-{profile}properites
当没有指定Profile时会默认加载applicationproperties文件
而当指定了SpringBoot的Profile时则会默认加载application-{profile}properties文件
当然也可以让SpringBoot除了加载默认文件以外也可以人为指定加载额外的properties文件
在我们的项目中则是通过这种方式进行
这样SpringBoot会去同时检索application-{profile}和application文件
检索顺序如上面的图所示
接下面我们进行验证
配置两个bean
第一个bean
这里的属性通过主项目的application-devproperties文件进行注入
第二个bean
属性通过子项目的applicationproperties文件进行注入
子项目目录结构
可以看出并没有符合规范结构
我们让主项目引用子项目的jar包
运行结果
启动报错,没有读取成功
接下来我们修改子项目的结构
可以看到现在已经符合规范结构,重新打包编译再进行验证
正常启动,说明此时属性注入正常,applicationproperties被成功读取
然后我们修改applicationproperties文件名为application-dev
预期结果会出现覆盖现象
正常启动,打脸了,翻阅资料发现
文件的读取是多次的,对相同的属性值来说以先读取的为标准,但是不同的属性依然可以正常读取
通过验证发现,想要在子项目配置多个子项目的情况下每个项目想引用不同的数据源首先需要保证
1每个子项目必须配置不同ID的bean,否则出现覆盖现象,需要注意的是各个子系统中的sqlSessionFactiory所指定的mapperxml路径不要出现重复,否则会造成一条SQL被多个bean命中切面
2子系统所指定的properties文件中与主系统properties文件名相同时,若出现相同属性,以先读取的为主
3除非特殊设置读取路径,否则需要按照规范放在指定路径下容器才能读取properties文件
模板引擎这个词,咋听起来,有点高大上的意味。
实际上,模板引擎是非常平易近人的技术。譬如大家可能都比较熟悉的 JSP ,就是一种比较典型的模板引擎。
当浏览器将请求抛给控制器,控制器处理好数据后,就跳转 JSP 等模板引擎页面。注意在跳转的同时,还会将数据组装好,也交给模板引擎处理。
模板引擎会根据数据,和模板引擎的规则,动态生成 HTML 页面,最后返回给浏览器显示。
我们使用 Spring Boot 开发 Web 项目,大体上有两种方式。
第一种方式,是后端服务化的方式,也是当前的主流方式。前端是静态的 HTML 页面,通过 Ajax 请求 Spring Boot 的后端接口。 Spring Boot 返回数据一般采用 JSON 格式,前端接收后将数据显示。
第二种方式,是采取模板引擎的方式。前端的请求,到达 Spring Boot 的控制器后,控制器处理请求,然后将返回数据交给模板引擎。模板引擎负责根据数据生成 HTML 页面,最后将 HTML 返回给浏览器。
我个人比较推荐第一种方式,说一下该方式的几个优点:
本篇是讲模板引擎,也得说说模板引擎的优点,王婆卖瓜不能光夸草莓啊。模板引擎开发的页面,对搜索引擎 SEO 比较友好;还有就是简单的页面,如果用模板引擎开发速度比较快,毕竟模板化的方法,目的就是减少重复提高效率。
Spring Boot 支持的模板引擎种类很多,常见的有 FreeMarker 、 Thymeleaf 、 JSP 。
因为这些模板引擎使用的用户都不少,所以我们逐一介绍下其实现过程。
至于孰优孰劣,请各位看官自行评价。正所谓:尺有所短,寸有所长,各取所爱,万物生长!
本篇我们开发一个商品浏览项目实例。
此处说一个我个人的经验:在做一个项目或一个模块的时候,不要一开始就动手写代码,最好是谋定而后动。
我们作为程序员,实际上是整个程序世界的总指挥。应该先整体规划,再实现局部。这种总分型的开发方法便于我们理顺思路,提高编码效率!
好的,我们来思考下,实现商品浏览项目实例的整体流程:
整体流程
可以看到,我们是先建立了控制器方法和页面,再去实现其中的具体细节。这样可以让我们的思维保持连贯性和整体性,在做一些页面和方法较多的项目时,会感觉更加顺畅。
我们按整体流程,使用 FreeMarker 模板引擎,来实现商品浏览功能。
使用 Spring Initializr 创建项目,Spring Boot 版本选择 225 , Group 为 comimooc , Artifact 为 spring-boot-freemarker ,生成项目后导入 Eclipse 开发环境。
引入 Web 项目及 FreeMarker 模板相关的依赖项,代码如下:
实例:
创建控制器类,由于是商品相关的控制器,所以命名为 GoodsController ,代码如下:
实例:
我们具体解释下该类的作用。
我们 resource/templates 目录下新建商品页面 goodsftl ,先不必实现具体功能,代码如下:
实例:
此时我们启动项目,然后访问 >
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。
请参阅 下载,下载 Spring 框架和 Apache Ant,运行本系列的示例应用程序需要它们。
Spring 框架
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。
图 1 Spring 框架的 7 个模块
Spring 框架图示
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
回页首
IOC 和 AOP
控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。
在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。
类型 1 服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)
类型 2 通过 JavaBean 的属性(例如 setter 方法)分配依赖性
类型 3 依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开
Spring 框架的 IOC 容器采用类型 2 和类型3 实现。
面向方面的编程
面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。
回页首
IOC 容器
Spring 设计的核心是 orgspringframeworkbeans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型。
单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。
BeanFactory 接口
因为 orgspringframeworkbeansfactoryBeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。
清单 1 XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybeanxml"));
在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。
清单 2 getBean()
MyBean mybean = (MyBean) factorygetBean("mybean");
每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。
回页首
IOC 示例
理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。
我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:
信用级别评定服务,查询用户的信用历史信息。
远程信息链接服务,插入客户信息,将客户信息与xyk和银行信息连接起来,以进行自动借记(如果需要的话)。
电子邮件服务,向用户发送有关xyk状态的电子邮件。
回页首
三个接口
对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。
清单 3 CreditRatingInterface
public interface CreditRatingInterface {
public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}
清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。
清单 4 CreditLinkingInterface
public interface CreditLinkingInterface {
public String getUrl();
public void setUrl(String url);
public void linkCreditBankAccount() throws Exception ;
}
信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的xyk信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。
清单 5 EmailInterface
public interface EmailInterface {
public void sendEmail(ICustomer iCustomer);
public String getFromEmail();
public void setFromEmail(String fromEmail) ;
public String getPassword();
public void setPassword(String password) ;
public String getSmtpHost() ;
public void setSmtpHost(String smtpHost);
public String getUserId() ;
public void setUserId(String userId);
}
EmailInterface 负责向客户发送关于客户xyk状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。
回页首
Spring 使其保持松散
这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到xyk帐户用例的实现。
注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单 7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。
回页首
运行应用程序
要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:\,这会创建 C:\spring-framework-12-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的 *** 作之前,还必须下载和释放 Apache Ant。
接下来,将源代码释放到文件夹,例如 c:\ 盘,然后创建 SpringProject。将 Spring 库(即 C:\spring-framework-12-rc2\dist 下的 springjar 和 C:\spring-framework-12-rc2\lib\jakarta-commons 下的 commons-loggingjar)复制到 SpringProject\lib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。
打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令:build。
这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接xyk帐户。CreateCreditAccountClient 还会通过 ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。
清单 8 装入 Spring 配置文件
ClassPathXmlApplicationContext appContext =
new ClassPathXmlApplicationContext(new String[] {
"springexample-creditaccountxml"
});
CreateCreditCardAccountInterface creditCardAccount =
(CreateCreditCardAccountInterface)
appContextgetBean("createCreditCard");
回页首
结束语
在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。
由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式 (像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的xyk帐户应用程序,要比从头开始构建它们容易得多。
只要你用Springboot,一定会用到各种spring-boot-starter。其实写一个spring-boot-starter,仅需4步。下面我们就写一个starter,它将实现,在日志中打印方法执行时间。
在使用spring-boot-starter,会发现,有的项目名称是 XX-spring-boot-starter,有的是spring-boot-starter-XX,这个项目的名称有什么讲究呢?从springboot官方文档摘录如下:
从这段话可以看出spring-boot-starter命名的潜规则。
命名潜规则
spring-boot-starter-XX是springboot官方的starter
XX-spring-boot-starter是第三方扩展的starter
打印方法执行时间的功能,需要用到aop,咱们的项目就叫做 aspectlog-spring-boot-starter 吧。
项目的pom文件如下:
关于spring-boot-configuration-processor的说明,引自springBoot官方文档:
简单说就是:写starter时,在pom中配置spring-boot-autoconfigure-processor,在编译时会自动收集配置类的条件,写到一个 META-INF/spring-autoconfigure-metadataproperties 中。
本次我们就选用@ConditionalOnProperty。即配置文件中有aspectLogenable=true,才加载我们的配置类。
下面开始写自动配置类
配置类简要说明:
当配置文件有 aspectLogenable=true 时开启,如果配置文件没有设置 aspectLogenable 也开启。
META-INF/springfactories 是spring的工厂机制,在这个文件中定义的类,都会被自动加载。多个配置使用逗号分割,换行用\
如果有兴趣可以查看这2篇blog:
@Enable 驱动原理(设置连接)
@EnableAutoConfiguration 处理逻辑(设置连接)
这是我们最终的目录结构
在IDEA中,进行mvn intall
打包完成后,在其他项目中的pom中引入进行测试
以上就是关于基于spring factories机制开发SDK全部的内容,包括:基于spring factories机制开发SDK、Spring Boot从入门到精通-项目搭建、download下来的spring 的source code,怎么看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)