Start自定义组件简介

步骤

创建 Maven 项目, 目录结构如下

springboot组件制作 springboot组件开发_spring boot


添加pom.xml依赖(可以根据组件功能添加其他依赖)

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>1.5.6.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.7</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
配置自定义组件启动类

spring.factories文件(文件名称不能变)
注意:META-INF是自己手动创建的目录,spring.factories也是手动创建的文件,在该文件中配置自己的自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.space.assembly.cache.RedisAutoConfigure

启动类 RedisAutoConfigure.java
启动类内部可以配置需要bean ,把bean实例化等操作

@EnableCaching
@EnableNacosConfig
@EnableConfigurationProperties({RedisProperties.class, RedisPoolProperties.class, CacheManagerProperties.class})
public class RedisAutoConfigure {
    @Autowired
    private CacheManagerProperties cacheManagerProperties;
    @Autowired
    public RedisProperties redisProperties;
    @Autowired
    public RedisPoolProperties redisPoolProperties;

    public RedisAutoConfigure() {
    }
 	@Bean
    @ConditionalOnMissingBean(RedisRepository.class)  // 当容器中没有指定Bean的情况下,自动配置RedisRepository类
    public RedisRepository redisRepository(){
        RedisRepository redisRepository= new RedisRepository(redisPoolProperties);
        return redisRepository;
    }

    @Bean(name = "poolConfig")
    public JedisPoolConfig poolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(this.redisPoolProperties.getMaxIdle());
        poolConfig.setMaxWaitMillis(this.redisPoolProperties.getMaxWait());
        poolConfig.setMaxTotal(this.redisPoolProperties.getMaxTotal());
        poolConfig.setTestOnBorrow(this.redisPoolProperties.isTestOnBorrow());
        return poolConfig;
    }
    ....
    ....

可以拿组件的配置参数(非必须)

@ConfigurationProperties(
        prefix = "spring.redis"
)
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;
    private int port = 6379;
    private boolean ssl;
    private int timeout;
    private org.springframework.boot.autoconfigure.data.redis.RedisProperties.Pool pool;
    private org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel sentinel;
    private org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster cluster;

最后将项目打包 mvn clean install

在另一个项目中添加这个主键依赖,组件的类就实例化了可以调其中的方法
<dependency>
	<groupId>cn.space</groupId>
    <artifactId>assembly-cache-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
测试组件使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisRepositoryTests {
	@Autowired
	@SuppressWarnings("ALL")
	private RedisRepository redisRepository ;

	@Test
	public void testGet() {
		RedisRepository.get("startKey");
	}

}
在application.properties加配置

使用Spring官方的Starter时通常可以在application.properties中来配置参数覆盖掉默认的值。

spring.redis.url = xxxxx

spring.redis.host = xxxxx

spring.redis.password= xxxxx

spring.redis.port = xxxxx

补充

可以通过注解条件来控制组件是否初始化,初始化动作

@ConditionalOnSingleCandidate	当给定类型的bean存在并且指定为Primary的给定类型存在时,返回true
@ConditionalOnMissingBean	当给定的类型、类名、注解、昵称在beanFactory中不存在时返回true.各类型间是or的关系
@ConditionalOnBean	与上面相反,要求bean存在
@ConditionalOnMissingClass	当给定的类名在类路径上不存在时返回true,各类型间是and的关系
@ConditionalOnClass	与上面相反,要求类存在
@ConditionalOnCloudPlatform	当所配置的CloudPlatform为激活时返回true
@ConditionalOnExpression	spel表达式执行为true
@ConditionalOnJava	运行时的java版本号是否包含给定的版本号.如果包含,返回匹配,否则,返回不匹配
@ConditionalOnProperty	要求配置属性匹配条件
@ConditionalOnJndi	给定的jndi的Location 必须存在一个.否则,返回不匹配
@ConditionalOnNotWebApplication	web环境不存在时
@ConditionalOnWebApplication	web环境存在时
@ConditionalOnResource	要求制定的资源存在

可以通过必须某类的实例来控制组件是否自动加载,
在主项目启动类上加自定义注解,注解作用是实例化某类,去掉注解就不自动加载组件了。