Spring Starter组件开发
前言
在我开始接触JAVA开发时候,Spring生态已经发展比较完善。从繁琐的XML配置转变约定大于设计的配置方式,Spring没有改变简化企业化开发的初衷,并一直向着这个目标努力。
spring核心思想
(1)基于POJO的轻量级和最小侵入性编程。
(2)通过依赖注入和面向接口实现松耦合。
(3)基于切面和惯性进行声明式编程。
(4)通过切面和模板减少样板式代码。
spring实现方式
(1)Bean(BOP)
(2)依赖注入(DI)
(3)面向切面(AOP)
Spring组件
Sring的易用性让企业开发真正来到了春天,如雨后春笋般的Spring插件不断地简化我们开发流程,让程序员可以更关心业务。比如数据库操作有Mybaits,Sharing,Codis,服务注册有Eurka和Nacos,服务熔断有Hystrix,服务限流Sentinel,分布式配置Apollo,工具类Guava。
这些组件继承了Spring的设计思想,也使Spring生态不断日渐壮大。
那么我们如何加入Spring 组件的开发?
实现原理
spring加载jar包是会读取META-INF下的spring.factories文件,通过该文件配置可在容器启动时加载指定的Bean
# 配置解析
org.springframework.boot.env.PropertySourceLoader
# 生命周期监听
org.springframework.boot.SpringApplicationRunListener
# 错误报告
org.springframework.boot.SpringBootExceptionReporter
# 容器初始化
org.springframework.context.ApplicationContextInitializer
spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lokey.starter.web.configuration.StaterConfiguration
starter包pom配置,最少依赖原则,启动需要忽略Main方法加载
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
StaterConfiguration类
@Configuration
public class StaterConfiguration {
@Bean
public void test(){
System.out.println("Bean is created!");
}
@PostConstruct
private void starter(){
System.out.println("My Starter is Running!");
}
}
通过maven install在本地,在另一个项目中引入
<dependency>
<groupId>com.lokey.starter</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
启动项目,控制台输出
My Starter is Running!
Bean is created!
补充
Spring Bean的init()和destory()方法
因为对象的生命周期都交给了Spring管理,所以Spring提供了init()和destory()函数让开发可以感知对象的创建与回收。另外@PostConstruct注解修饰的方法也会在对象创建之前执行,早于init()。
@Conditional
Conditional注解可以根据根据不同条件来决定是否加载Bean,列举几个常用的
@ConditionalOnProperty 根据参数加载
@ConditionalOnProperty(value = "xxx",havingValue = "true",matchIfMissing = true)
@ConditionalOnBean 和 ConditionalOnMissingBean Bean存在(不存在)时加载
@ConditionalOnBean(Object.class)
@ConditionalOnClass 和 @ConditionalOnMissingClass 类是否被加载
@ConditionalOnClass (Object.class)
Maven SNAPSHOT和Release
既然动手开始造轮子就要准守一些造轮子的约定
名称 | SNAPSHOT | Release |
---|---|---|
解释 | 不稳定版本 | 发行版 |
版本号 | 可重复 | 不可重复 |