概念
springboot auto configuration的本質就是自動配置spring的各種bean。然后使應用可以通過@Autowired等注入方式來直接使用bean。
比如自動配置redisTemplate,jdbcTemplate等bean。
原理
1. 開啟@EnableAutoConfiguration注解
如果寫了@SpringBootApplication注解,不必再寫@EnableAutoConfiguration。\
@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan
@SpringCloudApplication = @SpringBootApplication + @EnableDiscoveryClient + @EnableCircuitBreaker
2. 開啟@EnableAutoConfiguration注解后,會自動引入一個AutoConfigurationImportSelector類
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * Exclude specific auto-configuration classes such that they will never be applied. * @return the classes to exclude */ Class<?>[] exclude() default {}; /** * Exclude specific auto-configuration class names such that they will never be * applied. * @return the class names to exclude * @since 1.3.0 */ String[] excludeName() default {}; }
其會去掃描classpath下所有jar包內的META-INF/spring.factories文件
3. spring.factories文件
spring-boot-autoconfigure.jar的spring.factories文件
spring.factories文件內會有一個org.springframework.boot.autoconfigure.EnableAutoConfiguration的key
configure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\ org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\ org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
spring boot 會自動配置org.springframework.boot.autoconfigure.EnableAutoConfiguration的key下所有自動配置類。
可以看到這里面包含RabbitMq,MongoDB,Redis,JdbcTemplate,Thymeleaf,WebFlux,WebSocket等等模塊的自動配置類。
4. 一般自動配置類都有@Configuration注解,相當於一個spring的xml文件,里面可以通過@Bean注解配置bean
@Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } }
@ConditionalOnXXX:
- @ConditionalOnBean(僅僅在當前上下文中存在某個對象時,才會實例化一個Bean
- @ConditionalOnClass(某個class位於類路徑上,才會實例化一個Bean)
- @ConditionalOnExpression(當表達式為true的時候,才會實例化一個Bean)
- @ConditionalOnMissingBean(僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean)
- @ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean)
- @ConditionalOnProperty(value = “spring.cloud.config.enabled”, matchIfMissing = true)(當某個配置的值為一定條件時,才會實例化一個Bean)
5. 配置bean的時候,少不了要獲取properties或者yml文件的屬性
5.1 通過@ConfigurationProperties(prefix=”xxxx”)映射配置文件的值到POJO
application.yml
test: id: 1 name: test
隨意一個POJO類,例:Properties.java,類名隨意,通過prefix指定配置屬性的前綴
@ConfigurationProperties(prefix="test") public class Properties { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
5.2 將配置文件的POJO類轉化為spring的bean
5.2.1. 在要使用配置的地方使用@EnableConfigurationProperties(Properties.class)將其轉化為spring的bean
@RestController @EnableConfigurationProperties(Properties.class) public class CommonController extends BaseController { //轉化為spring的bean后,就可以注入使用了 @Autowired private Properties properties; @RequestMapping(value = "/properties", method = RequestMethod.GET) public Properties getProperties() { log.info(properties.toString()); return properties; } }
如果直接寫@EnableConfigurationProperties不指定Properties類的話,必須在同一目錄或者子目錄下才行。
5.2.2. 通過@Bean配置將其轉化為spring的bean
@Configuration public class MyConfiguration { @Bean public Properties properties() { return new Properties(); } }
5.2.3. 通過@Component配置將其轉化為spring的bean
@Component @ConfigurationProperties(prefix="test") public class Properties { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
轉化為spring的bean后,就可以在想用的地方通過任意注入方式注入bean來使用了。
5.2.4. 總結
在寫spring boot starter的時候,因為所有類都不在啟動的@ComponentScan目錄下,所以使用一般使用 5.2.1 或者 5.2.2 的方式獲取配置文件信息
在寫具體的spring boot應用服務時,配置類都在啟動的@ComponentScan目錄下,使用 5.2.3 的方式比較方便
原文地址:https://blog.csdn.net/ifrozen/article/details/79931143
實戰--springboot配置 rocketmq
starters項目
1.pom.xml
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>ons-client</artifactId> <version>1.8.4.Final</version> </dependency>
2.resources->META-INF->spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.bjgxzd.boot.config.MqAutoConfiguration
3.MqAutoConfiguration
@Configuration @ImportAutoConfiguration(value = {MqConfiguration.class}) public class MqAutoConfiguration { @Bean public CommandLineRunner logRunner (){ return args -> { System.out.println("==== GX rocket MQ loaded ===="); }; } }
4.MqConfiguration
@Configuration @EnableConfigurationProperties({MqProperties.class}) public class MqConfiguration { @Autowired private MqProperties mqProperties; @Bean(initMethod = "start", destroyMethod = "shutdown") @ConditionalOnMissingBean(ProducerBean.class) public ProducerBean buildProducer() { ProducerBean producer = new ProducerBean(); producer.setProperties(getMqProperties()); return producer; } private Properties getMqProperties(){ Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.AccessKey, mqProperties.getAccessKey()); properties.setProperty(PropertyKeyConst.SecretKey, mqProperties.getSecretKey()); properties.setProperty(PropertyKeyConst.ONSAddr, mqProperties.getOnsAddr()); return properties; } @ConditionalOnMissingBean(OrderProducerBean.class) @Bean(initMethod = "start", destroyMethod = "shutdown") public OrderProducerBean buildOrderProducer() { OrderProducerBean orderProducerBean = new OrderProducerBean(); orderProducerBean.setProperties(getMqProperties()); return orderProducerBean; } }
5.MqProperties
@Data @ConfigurationProperties(prefix = "mq.rocketmq") public class MqProperties { private String accessKey; private String secretKey; private String onsAddr; }
syncsrv項目
application.yml
mq: rocketmq: access-key: 62f49160c57b4f158a8ab3ebd2ff66cc secret-key: J8H3v+Go55DIimy6gbKu3Bbnc0U= ons-addr: http://172.169.101.121:8080/rocketmq/nsaddr4broker-internal
pom.xml
mq 集成好了,直接依賴 <dependency> <groupId>com.bjgxzd</groupId> <artifactId>gx-mq-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
啟動類 QfjsSyncApplication
@SpringBootApplication public class QfjsSyncApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(QfjsSyncApplication.class, args); } @Override public void run(String... args) throws Exception { } }
使用
直接注入就可以發消息了
private final ProducerBean producer; public TestController(ProducerBean producer) { this.producer = producer; }