其他分享
首页 > 其他分享> > HM-SpringBoot2.6.2【SpringBoot自动配置-自定义starter案例】

HM-SpringBoot2.6.2【SpringBoot自动配置-自定义starter案例】

作者:互联网


 1 实现

 1 package com.haifei.redis.config;
 2 
 3 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 4 import org.springframework.context.annotation.Bean;
 5 import org.springframework.context.annotation.Configuration;
 6 import redis.clients.jedis.Jedis;
 7 
 8 @Configuration
 9 @EnableConfigurationProperties(RedisProperties.class)
10 public class RedisAutoConfiguration {
11 
12     /**
13      * 提供jedis的bean
14      */
15     @Bean
16     public Jedis jedis(RedisProperties redisProperties){
17 //        return new Jedis();
18 //        return new Jedis("localhost", 6379);
19         return new Jedis(redisProperties.getHost(), redisProperties.getPort()); //动态指定参数
20     }
21 
22 }
 1 package com.haifei.redis.config;
 2 
 3 import org.springframework.boot.context.properties.ConfigurationProperties;
 4 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 5 
 6 /*
 7 @ConfigurationProperties 在IDEA中出现红色波浪线问题解决
 8 https://blog.csdn.net/qq_19309473/article/details/106859603
 9 第一步:在pom.xml中增加以下依赖spring-boot-configuration-processor
10 第二步:在@ConfigurationProperties的上方增加一个@EnableConfigurationProperties({当前类.class})
11  */
12 //@EnableConfigurationProperties({RedisProperties.class})
13 //后记:将这个注解加在RedisAutoConfiguration配置类上也行,且不加spring-boot-configuration-processor依赖也行
14 
15 @ConfigurationProperties(prefix = "redis") //与配置文件绑定。配置文件中以redis开头的配置都会与当前实体类中的属性相对应
16 public class RedisProperties {
17 
18     private String host = "localhost"; //默认主机为本机
19     private int port = 6379; //默认端口为6379
20 
21     @Override
22     public String toString() {
23         return "RedisProperties{" +
24                 "host='" + host + '\'' +
25                 ", port=" + port +
26                 '}';
27     }
28 
29     public String getHost() {
30         return host;
31     }
32 
33     public void setHost(String host) {
34         this.host = host;
35     }
36 
37     public int getPort() {
38         return port;
39     }
40 
41     public void setPort(int port) {
42         this.port = port;
43     }
44 }

 

 

 

 

1 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2   com.haifei.redis.config.RedisAutoConfiguration

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 1 package com.haifei.springboot9enable;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.context.ConfigurableApplicationContext;
 6 import redis.clients.jedis.Jedis;
 7 
 8 @SpringBootApplication
 9 public class Springboot9EnableApplication3 {
10 
11     public static void main(String[] args) {
12         ConfigurableApplicationContext context = SpringApplication.run(Springboot9EnableApplication3.class, args);
13         Jedis jedis = context.getBean(Jedis.class);
14         System.out.println(jedis); //BinaryJedis{Connection{DefaultJedisSocketFactory{localhost:6379}}}
15     }
16 
17 }

 

 


 2 优化

(1)

 

 

 

 

 1 package com.haifei.springboot9enable;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.context.ConfigurableApplicationContext;
 6 import redis.clients.jedis.Jedis;
 7 
 8 @SpringBootApplication
 9 public class Springboot9EnableApplication3 {
10 
11     public static void main(String[] args) {
12         ConfigurableApplicationContext context = SpringApplication.run(Springboot9EnableApplication3.class, args);
13         Jedis jedis = context.getBean(Jedis.class);
14         System.out.println(jedis); //BinaryJedis{Connection{DefaultJedisSocketFactory{localhost:6379}}}
15 
16         jedis.set("name", "zhangsan");
17         String name = jedis.get("name");
18         System.out.println(name); //zhangsan
19     }
20 
21 }

 

 

 

 

 

(2) 

验证配置生效

 

 

 

 

(3)

 1 package com.haifei.redis.config;
 2 
 3 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 4 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 5 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 6 import org.springframework.context.annotation.Bean;
 7 import org.springframework.context.annotation.Configuration;
 8 import redis.clients.jedis.Jedis;
 9 
10 @ConditionalOnClass(Jedis.class) //加条件:保证Jedis存在的时候才可以加在下面配置的这个jedis的bean
11 
12 @Configuration
13 @EnableConfigurationProperties(RedisProperties.class)
14 public class RedisAutoConfiguration {
15 
16     /**
17      * 提供jedis的bean
18      */
19     @Bean
20     @ConditionalOnMissingBean(name = "jedis")
21     //加条件:若用户自己也定义了一个叫jedis的bean,则就用用户自己定义的,若没有一个叫jedis的bean时,我们才向用户提供该bean
22     public Jedis jedis(RedisProperties redisProperties){
23 //        return new Jedis();
24 //        return new Jedis("localhost", 6379);
25 
26         System.out.println("RedisAutoConfiguration....");
27         return new Jedis(redisProperties.getHost(), redisProperties.getPort()); //动态指定参数
28     }
29 
30 }

 

 

 1 package com.haifei.springboot9enable;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.context.ConfigurableApplicationContext;
 6 import redis.clients.jedis.Jedis;
 7 
 8 @SpringBootApplication
 9 public class Springboot9EnableApplication3 {
10 
11     public static void main(String[] args) {
12         ConfigurableApplicationContext context = SpringApplication.run(Springboot9EnableApplication3.class, args);
13         Jedis jedis = context.getBean(Jedis.class);
14         System.out.println(jedis); //BinaryJedis{Connection{DefaultJedisSocketFactory{localhost:6379}}}
15 
16         jedis.set("name", "zhangsan");
17         String name = jedis.get("name");
18         System.out.println(name); //zhangsan
19     }
20 
21 }

 

 

 

 

 1 package com.haifei.springboot9enable;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.context.ConfigurableApplicationContext;
 6 import org.springframework.context.annotation.Bean;
 7 import redis.clients.jedis.Jedis;
 8 
 9 @SpringBootApplication
10 public class Springboot9EnableApplication3 {
11 
12     public static void main(String[] args) {
13         ConfigurableApplicationContext context = SpringApplication.run(Springboot9EnableApplication3.class, args);
14         Jedis jedis = context.getBean(Jedis.class);
15         System.out.println(jedis); //BinaryJedis{Connection{DefaultJedisSocketFactory{localhost:6379}}}
16 
17         jedis.set("name", "zhangsan");
18         String name = jedis.get("name");
19         System.out.println(name); //zhangsan
20     }
21 
22     @Bean
23     public Jedis jedis(){
24         System.out.println("Springboot9EnableApplication3....");
25         return new Jedis("localhost", 6379);
26     }
27 
28 }

 

 

 

 


3 查看官方实现

 

 

 

 

 1 //
 2 // Source code recreated from a .class file by IntelliJ IDEA
 3 // (powered by Fernflower decompiler)
 4 //
 5 
 6 package org.springframework.boot.autoconfigure.data.redis;
 7 
 8 import java.net.UnknownHostException;
 9 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
10 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
11 import org.springframework.boot.context.properties.EnableConfigurationProperties;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.context.annotation.Configuration;
14 import org.springframework.context.annotation.Import;
15 import org.springframework.data.redis.connection.RedisConnectionFactory;
16 import org.springframework.data.redis.core.RedisOperations;
17 import org.springframework.data.redis.core.RedisTemplate;
18 import org.springframework.data.redis.core.StringRedisTemplate;
19 
20 @Configuration
21 @ConditionalOnClass({RedisOperations.class})
22 @EnableConfigurationProperties({RedisProperties.class})
23 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
24 public class RedisAutoConfiguration {
25     public RedisAutoConfiguration() {
26     }
27 
28     @Bean
29     @ConditionalOnMissingBean(
30         name = {"redisTemplate"}
31     )
32     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
33         RedisTemplate<Object, Object> template = new RedisTemplate();
34         template.setConnectionFactory(redisConnectionFactory);
35         return template;
36     }
37 
38     @Bean
39     @ConditionalOnMissingBean
40     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
41         StringRedisTemplate template = new StringRedisTemplate();
42         template.setConnectionFactory(redisConnectionFactory);
43         return template;
44     }
45 }
View Code
  1 //
  2 // Source code recreated from a .class file by IntelliJ IDEA
  3 // (powered by Fernflower decompiler)
  4 //
  5 
  6 package org.springframework.boot.autoconfigure.data.redis;
  7 
  8 import java.time.Duration;
  9 import java.util.List;
 10 import org.springframework.boot.context.properties.ConfigurationProperties;
 11 
 12 @ConfigurationProperties(
 13     prefix = "spring.redis"
 14 )
 15 public class RedisProperties {
 16     private int database = 0;
 17     private String url;
 18     private String host = "localhost";
 19     private String password;
 20     private int port = 6379;
 21     private boolean ssl;
 22     private Duration timeout;
 23     private RedisProperties.Sentinel sentinel;
 24     private RedisProperties.Cluster cluster;
 25     private final RedisProperties.Jedis jedis = new RedisProperties.Jedis();
 26     private final RedisProperties.Lettuce lettuce = new RedisProperties.Lettuce();
 27 
 28     public RedisProperties() {
 29     }
 30 
 31     public int getDatabase() {
 32         return this.database;
 33     }
 34 
 35     public void setDatabase(int database) {
 36         this.database = database;
 37     }
 38 
 39     public String getUrl() {
 40         return this.url;
 41     }
 42 
 43     public void setUrl(String url) {
 44         this.url = url;
 45     }
 46 
 47     public String getHost() {
 48         return this.host;
 49     }
 50 
 51     public void setHost(String host) {
 52         this.host = host;
 53     }
 54 
 55     public String getPassword() {
 56         return this.password;
 57     }
 58 
 59     public void setPassword(String password) {
 60         this.password = password;
 61     }
 62 
 63     public int getPort() {
 64         return this.port;
 65     }
 66 
 67     public void setPort(int port) {
 68         this.port = port;
 69     }
 70 
 71     public boolean isSsl() {
 72         return this.ssl;
 73     }
 74 
 75     public void setSsl(boolean ssl) {
 76         this.ssl = ssl;
 77     }
 78 
 79     public void setTimeout(Duration timeout) {
 80         this.timeout = timeout;
 81     }
 82 
 83     public Duration getTimeout() {
 84         return this.timeout;
 85     }
 86 
 87     public RedisProperties.Sentinel getSentinel() {
 88         return this.sentinel;
 89     }
 90 
 91     public void setSentinel(RedisProperties.Sentinel sentinel) {
 92         this.sentinel = sentinel;
 93     }
 94 
 95     public RedisProperties.Cluster getCluster() {
 96         return this.cluster;
 97     }
 98 
 99     public void setCluster(RedisProperties.Cluster cluster) {
100         this.cluster = cluster;
101     }
102 
103     public RedisProperties.Jedis getJedis() {
104         return this.jedis;
105     }
106 
107     public RedisProperties.Lettuce getLettuce() {
108         return this.lettuce;
109     }
110 
111     public static class Lettuce {
112         private Duration shutdownTimeout = Duration.ofMillis(100L);
113         private RedisProperties.Pool pool;
114 
115         public Lettuce() {
116         }
117 
118         public Duration getShutdownTimeout() {
119             return this.shutdownTimeout;
120         }
121 
122         public void setShutdownTimeout(Duration shutdownTimeout) {
123             this.shutdownTimeout = shutdownTimeout;
124         }
125 
126         public RedisProperties.Pool getPool() {
127             return this.pool;
128         }
129 
130         public void setPool(RedisProperties.Pool pool) {
131             this.pool = pool;
132         }
133     }
134 
135     public static class Jedis {
136         private RedisProperties.Pool pool;
137 
138         public Jedis() {
139         }
140 
141         public RedisProperties.Pool getPool() {
142             return this.pool;
143         }
144 
145         public void setPool(RedisProperties.Pool pool) {
146             this.pool = pool;
147         }
148     }
149 
150     public static class Sentinel {
151         private String master;
152         private List<String> nodes;
153 
154         public Sentinel() {
155         }
156 
157         public String getMaster() {
158             return this.master;
159         }
160 
161         public void setMaster(String master) {
162             this.master = master;
163         }
164 
165         public List<String> getNodes() {
166             return this.nodes;
167         }
168 
169         public void setNodes(List<String> nodes) {
170             this.nodes = nodes;
171         }
172     }
173 
174     public static class Cluster {
175         private List<String> nodes;
176         private Integer maxRedirects;
177 
178         public Cluster() {
179         }
180 
181         public List<String> getNodes() {
182             return this.nodes;
183         }
184 
185         public void setNodes(List<String> nodes) {
186             this.nodes = nodes;
187         }
188 
189         public Integer getMaxRedirects() {
190             return this.maxRedirects;
191         }
192 
193         public void setMaxRedirects(Integer maxRedirects) {
194             this.maxRedirects = maxRedirects;
195         }
196     }
197 
198     public static class Pool {
199         private int maxIdle = 8;
200         private int minIdle = 0;
201         private int maxActive = 8;
202         private Duration maxWait = Duration.ofMillis(-1L);
203         private Duration timeBetweenEvictionRuns;
204 
205         public Pool() {
206         }
207 
208         public int getMaxIdle() {
209             return this.maxIdle;
210         }
211 
212         public void setMaxIdle(int maxIdle) {
213             this.maxIdle = maxIdle;
214         }
215 
216         public int getMinIdle() {
217             return this.minIdle;
218         }
219 
220         public void setMinIdle(int minIdle) {
221             this.minIdle = minIdle;
222         }
223 
224         public int getMaxActive() {
225             return this.maxActive;
226         }
227 
228         public void setMaxActive(int maxActive) {
229             this.maxActive = maxActive;
230         }
231 
232         public Duration getMaxWait() {
233             return this.maxWait;
234         }
235 
236         public void setMaxWait(Duration maxWait) {
237             this.maxWait = maxWait;
238         }
239 
240         public Duration getTimeBetweenEvictionRuns() {
241             return this.timeBetweenEvictionRuns;
242         }
243 
244         public void setTimeBetweenEvictionRuns(Duration timeBetweenEvictionRuns) {
245             this.timeBetweenEvictionRuns = timeBetweenEvictionRuns;
246         }
247     }
248 }
View Code

 

标签:SpringBoot2.6,return,SpringBoot,自定义,springframework,class,org,import,public
来源: https://www.cnblogs.com/yppah/p/15089914.html