Springboot自定义starter
1、问题描述
在做springboot项目中,我们会发现经常依赖spring-boot-starter-xxx的pom,知道这种starter为了解决某种业务场景的问题内部其实做了很多maven依赖的封装,使得引用者不需要配置繁杂的pom,带着好奇心研究了下这个技术,网上找到一些资料,这里摘抄一段:SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。(引用https://www.cnblogs.com/hello-shf/p/10864977.html )
命名规则:SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。SpringBoot提供的常见的starter有:(参考:https://www.cnblogs.com/selfchange/p/10014312.html)
- spring-boot-starter
- spring-boot-starter-activemq
- spring-boot-starter-amqp
- spring-boot-starter-aop
- spring-boot-starter-cache
- spring-boot-starter-data-elasticsearch
- spring-boot-starter-data-jdbc
- spring-boot-starter-data-mongodb
- spring-boot-starter-data-redis
2、操作方法
1、demo思路
通过封装一个邮件发送的starter,可以支持国外常见的AWS SES, SendGrid两种方式,通过引用email-springboot-starter后能够自动装载配置的方式实例化对象供外部直接调用。
2、pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>email-springboot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>email-springboot-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 自定义配置包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!--添加了该模块以来的模块,再配置yml时候会有本模块配置属性的提示信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--阿里json操作-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
</project>
3、配置实体类
@ConfigurationProperties(prefix = "email")这个会自动对应到email开头的配置项目
package email.starter.properties;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @Description: 配置信息实体
*/
@ConfigurationProperties(prefix = "email")
public class EmailProperties {
private MailConfig awsSesConfig = new MailConfig();
private MailConfig sendGridConfig = new MailConfig();
public MailConfig getAwsSesConfig() {
return awsSesConfig;
}
public MailConfig getSendGridConfig() {
return sendGridConfig;
}
@Getter
@Setter
@ToString
public class MailConfig{
private String userName;
private String password;
private String sender;
}
}
4、定义一个接口
package email.starter.service;
/**
* Email接口
*/
public interface EmailService {
boolean sendMail(String message);
}
5、AWS SES实现类
package email.starter.service;
import email.starter.properties.EmailProperties;
import org.springframework.beans.factory.annotation.Autowired;
/**
* AWS SES邮件发送实现
*/
public class AwsSesEmailServiceImpl implements EmailService{
private EmailProperties.MailConfig mailConfig;
public AwsSesEmailServiceImpl(EmailProperties.MailConfig mailConfig) {
this.mailConfig = mailConfig;
}
@Override
public boolean sendMail(String message) {
System.out.println(mailConfig.toString()+" SendEmail->message:"+message);
return true;
}
}
6、SendGrid实现类
package email.starter.service;
import email.starter.properties.EmailProperties;
import org.springframework.beans.factory.annotation.Autowired;
/**
* SendGrid邮件发送实现
*/
public class SendGridEmailServiceImpl implements EmailService{
private EmailProperties.MailConfig mailConfig;
public SendGridEmailServiceImpl(EmailProperties.MailConfig mailConfig) {
this.mailConfig = mailConfig;
}
@Override
public boolean sendMail(String message) {
System.out.println(mailConfig.toString()+" SendEmail->message:"+message);
return true;
}
}
7、装载配置并实例化服务类
@Configuration :声明这是一个配置对象
@EnableConfigurationProperties(EmailProperties.class) :使EmailProperties对象生效,将其注入IOC容器之中。
package email.starter.config;
import email.starter.properties.EmailProperties;
import email.starter.service.AwsSesEmailServiceImpl;
import email.starter.service.SendGridEmailServiceImpl;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(EmailProperties.class)
public class EmailAutoConfiguration {
@Bean
public AwsSesEmailServiceImpl getAwsSesEmailServiceImpl(EmailProperties emailProperties){
return new AwsSesEmailServiceImpl(emailProperties.getAwsSesConfig());
}
@Bean
public SendGridEmailServiceImpl getSendGridEmailServiceImpl(EmailProperties emailProperties){
return new SendGridEmailServiceImpl(emailProperties.getSendGridConfig());
}
}
8、maven install
9、调用方引用
<dependency>
<groupId>com.demo</groupId>
<artifactId>email-springboot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
10、配置文件
email:
aws-ses-config:
sender: 'mao2080@sina.com'
password: 'admin'
user-name: 'AwsSes'
send-grid-config:
sender: 'mao2080@sina.com'
password: 'admin'
user-name: 'SendGrid'
11、调用代码
package email;
import email.starter.service.AwsSesEmailServiceImpl;
import email.starter.service.EmailService;
import email.starter.service.SendGridEmailServiceImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
EmailService awsSesEmailService = applicationContext.getBean(AwsSesEmailServiceImpl.class);
awsSesEmailService.sendMail("Hello World !");
EmailService sendGridEmailService = applicationContext.getBean(SendGridEmailServiceImpl.class);
sendGridEmailService.sendMail("Hello World !");
}
}
12、执行效果
这样就很简单的可以使用email-springboot-starter调用邮件发送接口了。
"C:\Program Files (x86)\Java\jdk1.8.0_192\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51328 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:F:\work\ideaIU-2018.1.6.win\lib\idea_rt.jar=51329:F:\work\ideaIU-2018.1.6.win\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\access-bridge-32.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_192\jre\lib\rt.jar;F:\work\workspace-demo\email-springboot-test\target\classes;F:\work\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;F:\work\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;F:\work\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;F:\work\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;F:\work\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\work\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\work\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;F:\work\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;F:\work\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;F:\work\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;F:\work\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\work\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;F:\work\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar;F:\work\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;F:\work\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;F:\work\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;F:\work\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;F:\work\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;F:\work\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;F:\work\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;F:\work\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;F:\work\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;F:\work\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;F:\work\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;F:\work\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;F:\work\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;F:\work\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;F:\work\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;F:\work\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;F:\work\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;F:\work\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;F:\work\workspace-demo\email-springboot-starter\target\classes;F:\work\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;F:\work\repository\com\alibaba\fastjson\1.2.73\fastjson-1.2.73.jar" email.Application . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.4.1) 2022-03-05 10:22:26.041 INFO 3552 --- [ main] email.Application : Starting Application using Java 1.8.0_192 on PC-20220219NVTS with PID 3552 (F:\work\workspace-demo\email-springboot-test\target\classes started by MAO in F:\work\workspace-demo) 2022-03-05 10:22:26.041 INFO 3552 --- [ main] email.Application : No active profile set, falling back to default profiles: default 2022-03-05 10:22:26.682 INFO 3552 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-03-05 10:22:26.697 INFO 3552 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-03-05 10:22:26.697 INFO 3552 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] 2022-03-05 10:22:26.760 INFO 3552 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-03-05 10:22:26.760 INFO 3552 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 688 ms 2022-03-05 10:22:26.916 INFO 3552 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2022-03-05 10:22:27.041 INFO 3552 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-03-05 10:22:27.041 INFO 3552 --- [ main] email.Application : Started Application in 1.36 seconds (JVM running for 2.26) EmailProperties.MailConfig(userName=AwsSes, password=admin, sender=mao2080@sina.com) SendEmail->message:Hello World ! EmailProperties.MailConfig(userName=SendGrid, password=admin, sender=mao2080@sina.com) SendEmail->message:Hello World !
13、源码下载
https://github.com/mao2080/email-springboot-starter
3、参考网站
https://www.cnblogs.com/hello-shf/p/10864977.html

浙公网安备 33010602011771号