下面是关于“springboot 自定义启动器的实现”的攻略,包含两个示例:
一、为什么要自定义启动器
Spring Boot是一款非常流行的Java Web框架,它极大地提高了我们的开发效率。而自定义启动器则是在Spring Boot框架下进行自定义的一种方式。通常情况下,我们会将一系列相关的模块封装进一个自定义的启动器中,以便于其他项目能够更加方便的使用这些模块。而Spring Boot的自动配置机制则会在项目启动时自动加载这些模块的配置,从而降低了我们的开发难度。
二、自定义启动器的实现步骤
1.创建一个自定义的starter项目
第一步,我们需要创建一个新的Maven项目,并将其打包方式修改为pom。可以通过以下的命令快速创建一个新项目:
mvn archetype:generate -DgroupId=com.example -DartifactId=my-spring-boot-starter -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2.添加依赖
在pom.xml文件中添加以下依赖:
-
spring-boot-starter-parent:Spring Boot的parent pom文件,可以方便的继承Spring Boot的各种功能。
-
spring-boot-autoconfigure:Spring Boot的自动化配置模块,用于自动化配置应用程序上下文。
-
spring-boot-starter:Spring Boot的基础模块,包含了 Spring 和 Spring MVC 所需的模块。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
</dependencies>
3.编写自动配置类
编写一个AutoConfiguration
类,该类用于自动化配置应用程序上下文,并在Spring Boot启动时加载对应的配置。我们可以在自动配置类中定义一些Bean,以便其他项目可以进行依赖注入。
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Autowired
private MyProperties myProperties;
@Bean
@ConditionalOnMissingBean(MyService.class)
public MyService myService() {
MyService service = new MyService();
service.setPrefix(myProperties.getPrefix());
service.setSuffix(myProperties.getSuffix());
return service;
}
}
-
@Configuration:将该类定义为配置文件类。
-
@ConditionalOnClass:指定当类路径下存在指定的类时,该配置才会生效。
-
@EnableConfigurationProperties:启用对指定自定义属性类的支持。
-
@Autowired:自动注入MyProperties类。
-
@Bean:定义一个Bean,Bean的名称默认为方法名。
-
@ConditionalOnMissingBean:指定当没有指定名称的Bean时,才会创建该Bean。
4.编写自定义属性类
创建一个用于封装自定义属性的类,用于向用户暴露可配置的选项。
@ConfigurationProperties(prefix = "my.service")
public class MyProperties {
private String prefix;
private String suffix;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
- @ConfigurationProperties:指定前缀,将其与多个配置属性进行绑定。
5.创建启动器
创建一个用于引入以上两个类的启动器和Demo类。
public class MySpringBootStarter {
public static void main(String[] args) {
SpringApplication.run(MySpringBootStarter.class,args);
}
}
6.测试启动器
编写一个测试类来测试启动器是否工作。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTests {
@Autowired(required=false)
private MyService myService;
@Test
public void contextLoads() {
assertThat(myService, instanceOf(MyService.class));
assertEquals("hellomy spring boot", myService.wrap("spring boot"));
}
}
三、应用实例1
需求:创建一个自定义启动器,封装Redis操作,使得其他项目可以更加方便的使用Redis。
1.创建一个新的Maven项目,并将其打包方式修改为pom。
2.在pom.xml文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
3.编写自动配置类
RedisAutoConfiguration.java
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass({JedisCluster.class, RedisTemplate.class})
@ConditionalOnBean(RedisProperties.class)
public class RedisAutoConfiguration {
@Autowired
private RedisProperties redisProperties;
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(redisProperties.getHost());
configuration.setPort(redisProperties.getPort());
configuration.setDatabase(redisProperties.getDatabase());
configuration.setPassword(redisProperties.getPassword());
JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
jedisClientConfiguration.connectTimeout(Duration.ofMillis(redisProperties.getTimeout()));
return new JedisConnectionFactory(configuration, jedisClientConfiguration.build());
}
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
public RedisLockAspect redisLockAspect(RedisTemplate<String, Object> redisTemplate) {
return new RedisLockAspect(redisTemplate);
}
}
4.编写自定义属性类
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
private String host;
private int port;
private int timeout;
private String password;
private int database = 0;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getDatabase() {
return database;
}
public void setDatabase(int database) {
this.database = database;
}
}
5.创建启动器
public class RedisStarter {
public static void main(String[] args) {
SpringApplication.run(RedisStarter.class, args);
}
}
四、应用实例2
需求:创建一个自定义启动器,封装常用的通用异常信息。
1.创建一个新的Maven项目,并将其打包方式修改为pom。
2.在pom.xml文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
3.编写自动配置类
@Configuration
@EnableConfigurationProperties(ExceptionProperties.class)
public class ExceptionAutoConfiguration {
@Autowired
private ExceptionProperties exceptionProperties;
@Bean
public CommonExceptionHandler commonExceptionHandler() {
return new CommonExceptionHandler(exceptionProperties.getBasePackage());
}
}
4.编写自定义属性类
@ConfigurationProperties(prefix = "spring.exception")
public class ExceptionProperties {
private String basePackage = "";
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
}
5.创建启动器
public class ExceptionStarter {
public static void main(String[] args) {
SpringApplication.run(ExceptionStarter.class, args);
}
}
五、总结
以上是Spring Boot自定义启动器的整个过程,其核心是自动化配置类,该类包含一些Bean定义和属性自动装配。自定义启动器可以方便地对一些功能进行封装,方便其他项目复用。如果您刚开始学习Spring Boot,我建议您先尝试完成一个简单的示例,从而熟悉Spring Boot的有关概念和技术。如果您在实践过程中遇到问题,可以查找相关文档或在社区中询问,不要放弃。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 自定义启动器的实现 - Python技术站