Start自定义组件简介
步骤
创建 Maven 项目, 目录结构如下
添加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 要求制定的资源存在
可以通过必须某类的实例来控制组件是否自动加载,
在主项目启动类上加自定义注解,注解作用是实例化某类,去掉注解就不自动加载组件了。