diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/AuditAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/AuditAutoConfiguration.java index 3fae0dc3efc..8cc038bf6af 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/AuditAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/AuditAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ package org.springframework.boot.actuate.autoconfigure; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.audit.AuditEvent; import org.springframework.boot.actuate.audit.AuditEventRepository; import org.springframework.boot.actuate.audit.InMemoryAuditEventRepository; @@ -40,8 +40,12 @@ import org.springframework.context.annotation.Configuration; @Configuration public class AuditAutoConfiguration { - @Autowired(required = false) - private final AuditEventRepository auditEventRepository = new InMemoryAuditEventRepository(); + private final AuditEventRepository auditEventRepository; + + public AuditAutoConfiguration( + ObjectProvider auditEventRepositoryProvider) { + this.auditEventRepository = auditEventRepositoryProvider.getIfAvailable(); + } @Bean public AuditListener auditListener() throws Exception { @@ -64,10 +68,12 @@ public class AuditAutoConfiguration { @ConditionalOnMissingBean(AuditEventRepository.class) protected static class AuditEventRepositoryConfiguration { + @Bean public InMemoryAuditEventRepository auditEventRepository() throws Exception { return new InMemoryAuditEventRepository(); } + } } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java index 487617b3a9f..7c68ebba45e 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/CrshAutoConfiguration.java @@ -43,6 +43,7 @@ import org.crsh.vfs.spi.AbstractFSDriver; import org.crsh.vfs.spi.FSDriver; import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.actuate.autoconfigure.ShellProperties.CrshShellAuthenticationProperties; @@ -115,34 +116,16 @@ import org.springframework.util.StringUtils; * @see ShellProperties */ @Configuration -@ConditionalOnClass({ PluginLifeCycle.class }) -@EnableConfigurationProperties({ ShellProperties.class }) +@ConditionalOnClass(PluginLifeCycle.class) +@EnableConfigurationProperties(ShellProperties.class) @AutoConfigureAfter({ SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }) public class CrshAutoConfiguration { - @Autowired - private ShellProperties properties; + private final ShellProperties properties; - @Bean - @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "jaas") - @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) - public JaasAuthenticationProperties jaasAuthenticationProperties() { - return new JaasAuthenticationProperties(); - } - - @Bean - @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "key") - @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) - public KeyAuthenticationProperties keyAuthenticationProperties() { - return new KeyAuthenticationProperties(); - } - - @Bean - @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "simple", matchIfMissing = true) - @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) - public SimpleAuthenticationProperties simpleAuthenticationProperties() { - return new SimpleAuthenticationProperties(); + public CrshAutoConfiguration(ShellProperties properties) { + this.properties = properties; } @Bean @@ -153,17 +136,46 @@ public class CrshAutoConfiguration { return bootstrapBean; } + @Configuration + static class CrshAdditionalPropertiesConfiguration { + + @Bean + @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "jaas") + @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) + public JaasAuthenticationProperties jaasAuthenticationProperties() { + return new JaasAuthenticationProperties(); + } + + @Bean + @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "key") + @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) + public KeyAuthenticationProperties keyAuthenticationProperties() { + return new KeyAuthenticationProperties(); + } + + @Bean + @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "simple", matchIfMissing = true) + @ConditionalOnMissingBean(CrshShellAuthenticationProperties.class) + public SimpleAuthenticationProperties simpleAuthenticationProperties() { + return new SimpleAuthenticationProperties(); + } + + } + /** * Class to configure CRaSH to authenticate against Spring Security. */ @Configuration @ConditionalOnProperty(prefix = "shell", name = "auth", havingValue = "spring", matchIfMissing = true) @ConditionalOnBean(AuthenticationManager.class) - @AutoConfigureAfter(CrshAutoConfiguration.class) - public static class AuthenticationManagerAdapterAutoConfiguration { + public static class AuthenticationManagerAdapterConfiguration { - @Autowired(required = false) - private ManagementServerProperties management; + private final ManagementServerProperties management; + + public AuthenticationManagerAdapterConfiguration( + ObjectProvider managementProvider) { + this.management = managementProvider.getIfAvailable(); + } @Bean public AuthenticationManagerAdapter shellAuthenticationManager() { diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java index d20c0173cac..e52e2935684 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java @@ -19,14 +19,13 @@ package org.springframework.boot.actuate.autoconfigure; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import liquibase.integration.spring.SpringLiquibase; import org.flywaydb.core.Flyway; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.endpoint.AutoConfigurationReportEndpoint; import org.springframework.boot.actuate.endpoint.BeansEndpoint; import org.springframework.boot.actuate.endpoint.ConfigurationPropertiesReportEndpoint; @@ -82,20 +81,28 @@ import org.springframework.web.servlet.handler.AbstractHandlerMethodMapping; @EnableConfigurationProperties(EndpointProperties.class) public class EndpointAutoConfiguration { - @Autowired(required = false) - private HealthAggregator healthAggregator = new OrderedHealthAggregator(); + private final HealthAggregator healthAggregator; - @Autowired(required = false) - private Map healthIndicators = new HashMap(); + private final Map healthIndicators; - @Autowired(required = false) - private List infoContributors = new ArrayList(); + private final List infoContributors; - @Autowired(required = false) - private Collection publicMetrics; + private final Collection publicMetrics; - @Autowired(required = false) - private TraceRepository traceRepository = new InMemoryTraceRepository(); + private final TraceRepository traceRepository; + + public EndpointAutoConfiguration( + ObjectProvider healthAggregatorProvider, + ObjectProvider> healthIndicatorsProvider, + ObjectProvider> infoContributorsProvider, + ObjectProvider> publicMetricsProvider, + ObjectProvider traceRepositoryProvider) { + this.healthAggregator = healthAggregatorProvider.getIfAvailable(); + this.healthIndicators = healthIndicatorsProvider.getIfAvailable(); + this.infoContributors = infoContributorsProvider.getIfAvailable(); + this.publicMetrics = publicMetricsProvider.getIfAvailable(); + this.traceRepository = traceRepositoryProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean @@ -106,7 +113,12 @@ public class EndpointAutoConfiguration { @Bean @ConditionalOnMissingBean public HealthEndpoint healthEndpoint() { - return new HealthEndpoint(this.healthAggregator, this.healthIndicators); + return new HealthEndpoint( + this.healthAggregator == null ? new OrderedHealthAggregator() + : this.healthAggregator, + this.healthIndicators == null + ? Collections.emptyMap() + : this.healthIndicators); } @Bean @@ -118,7 +130,8 @@ public class EndpointAutoConfiguration { @Bean @ConditionalOnMissingBean public InfoEndpoint infoEndpoint() throws Exception { - return new InfoEndpoint(this.infoContributors); + return new InfoEndpoint(this.infoContributors == null + ? Collections.emptyList() : this.infoContributors); } @Bean @@ -135,7 +148,8 @@ public class EndpointAutoConfiguration { @Bean @ConditionalOnMissingBean public TraceEndpoint traceEndpoint() { - return new TraceEndpoint(this.traceRepository); + return new TraceEndpoint(this.traceRepository == null + ? new InMemoryTraceRepository() : this.traceRepository); } @Bean diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java index bb88ddced31..9d990a50dfc 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import javax.management.MBeanServer; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration.JmxEnabledCondition; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter; @@ -52,11 +52,15 @@ import org.springframework.util.StringUtils; @EnableConfigurationProperties(EndpointMBeanExportProperties.class) public class EndpointMBeanExportAutoConfiguration { - @Autowired - private EndpointMBeanExportProperties properties = new EndpointMBeanExportProperties(); + private final EndpointMBeanExportProperties properties; - @Autowired(required = false) - private ObjectMapper objectMapper; + private final ObjectMapper objectMapper; + + public EndpointMBeanExportAutoConfiguration(EndpointMBeanExportProperties properties, + ObjectProvider objectMapperProvider) { + this.properties = properties; + this.objectMapper = objectMapperProvider.getIfAvailable(); + } @Bean public EndpointMBeanExporter endpointMBeanExporter(MBeanServer server) { diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java index fac87745bba..c6ee0896202 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java @@ -29,6 +29,7 @@ import org.elasticsearch.client.Client; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.ApplicationHealthIndicator; import org.springframework.boot.actuate.health.CassandraHealthIndicator; @@ -174,8 +175,12 @@ public class HealthIndicatorAutoConfiguration { public static class CassandraHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map cassandraOperations; + private final Map cassandraOperations; + + public CassandraHealthIndicatorConfiguration( + Map cassandraOperations) { + this.cassandraOperations = cassandraOperations; + } @Bean @ConditionalOnMissingBean(name = "cassandraHealthIndicator") @@ -192,8 +197,12 @@ public class HealthIndicatorAutoConfiguration { public static class CouchbaseHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map couchbaseOperations; + private final Map couchbaseOperations; + + public CouchbaseHealthIndicatorConfiguration( + Map couchbaseOperations) { + this.couchbaseOperations = couchbaseOperations; + } @Bean @ConditionalOnMissingBean(name = "couchbaseHealthIndicator") @@ -211,14 +220,19 @@ public class HealthIndicatorAutoConfiguration { CompositeHealthIndicatorConfiguration implements InitializingBean { - @Autowired(required = false) - private Map dataSources; + private final Map dataSources; - @Autowired(required = false) - private Collection metadataProviders; + private final Collection metadataProviders; private DataSourcePoolMetadataProvider poolMetadataProvider; + public DataSourcesHealthIndicatorConfiguration( + ObjectProvider> dataSourcesProvider, + ObjectProvider> metadataProvidersProvider) { + this.dataSources = dataSourcesProvider.getIfAvailable(); + this.metadataProviders = metadataProvidersProvider.getIfAvailable(); + } + @Override public void afterPropertiesSet() throws Exception { this.poolMetadataProvider = new DataSourcePoolMetadataProviders( @@ -250,8 +264,12 @@ public class HealthIndicatorAutoConfiguration { public static class MongoHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map mongoTemplates; + private final Map mongoTemplates; + + public MongoHealthIndicatorConfiguration( + Map mongoTemplates) { + this.mongoTemplates = mongoTemplates; + } @Bean @ConditionalOnMissingBean(name = "mongoHealthIndicator") @@ -267,8 +285,12 @@ public class HealthIndicatorAutoConfiguration { public static class RedisHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map redisConnectionFactories; + private final Map redisConnectionFactories; + + public RedisHealthIndicatorConfiguration( + Map redisConnectionFactories) { + this.redisConnectionFactories = redisConnectionFactories; + } @Bean @ConditionalOnMissingBean(name = "redisHealthIndicator") @@ -284,8 +306,12 @@ public class HealthIndicatorAutoConfiguration { public static class RabbitHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map rabbitTemplates; + private final Map rabbitTemplates; + + public RabbitHealthIndicatorConfiguration( + Map rabbitTemplates) { + this.rabbitTemplates = rabbitTemplates; + } @Bean @ConditionalOnMissingBean(name = "rabbitHealthIndicator") @@ -301,8 +327,11 @@ public class HealthIndicatorAutoConfiguration { public static class SolrHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map solrClients; + private final Map solrClients; + + public SolrHealthIndicatorConfiguration(Map solrClients) { + this.solrClients = solrClients; + } @Bean @ConditionalOnMissingBean(name = "solrHealthIndicator") @@ -336,8 +365,12 @@ public class HealthIndicatorAutoConfiguration { public static class MailHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired(required = false) - private Map mailSenders; + private final Map mailSenders; + + public MailHealthIndicatorConfiguration( + ObjectProvider> mailSendersProvider) { + this.mailSenders = mailSendersProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(name = "mailHealthIndicator") @@ -353,8 +386,12 @@ public class HealthIndicatorAutoConfiguration { public static class JmsHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired(required = false) - private Map connectionFactories; + private final Map connectionFactories; + + public JmsHealthIndicatorConfiguration( + ObjectProvider> connectionFactoriesProvider) { + this.connectionFactories = connectionFactoriesProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(name = "jmsHealthIndicator") @@ -371,11 +408,15 @@ public class HealthIndicatorAutoConfiguration { public static class ElasticsearchHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration { - @Autowired - private Map clients; + private final Map clients; - @Autowired - private ElasticsearchHealthIndicatorProperties properties; + private final ElasticsearchHealthIndicatorProperties properties; + + public ElasticsearchHealthIndicatorConfiguration(Map clients, + ElasticsearchHealthIndicatorProperties properties) { + this.clients = clients; + this.properties = properties; + } @Bean @ConditionalOnMissingBean(name = "elasticsearchHealthIndicator") diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementWebSecurityAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementWebSecurityAutoConfiguration.java index 010ee7dc458..a4f5ab2be85 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementWebSecurityAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementWebSecurityAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import java.util.Set; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping; @@ -108,11 +109,16 @@ public class ManagementWebSecurityAutoConfiguration { protected static class ManagementSecurityPropertiesConfiguration implements SecurityPrerequisite { - @Autowired(required = false) - private SecurityProperties security; + private final SecurityProperties security; - @Autowired(required = false) - private ManagementServerProperties management; + private final ManagementServerProperties management; + + public ManagementSecurityPropertiesConfiguration( + ObjectProvider securityProvider, + ObjectProvider managementProvider) { + this.security = securityProvider.getIfAvailable(); + this.management = managementProvider.getIfAvailable(); + } @PostConstruct public void init() { @@ -232,14 +238,19 @@ public class ManagementWebSecurityAutoConfiguration { protected static class ManagementWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { - @Autowired - private SecurityProperties security; + private final SecurityProperties security; - @Autowired - private ManagementServerProperties management; + private final ManagementServerProperties management; - @Autowired(required = false) - private ManagementContextResolver contextResolver; + private final ManagementContextResolver contextResolver; + + public ManagementWebSecurityConfigurerAdapter(SecurityProperties security, + ManagementServerProperties management, + ObjectProvider contextResolverProvider) { + this.security = security; + this.management = management; + this.contextResolver = contextResolverProvider.getIfAvailable(); + } @Override protected void configure(HttpSecurity http) throws Exception { diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricExportAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricExportAutoConfiguration.java index a92f69d6070..582038b0306 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricExportAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricExportAutoConfiguration.java @@ -21,7 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.actuate.endpoint.MetricsEndpointMetricReader; import org.springframework.boot.actuate.metrics.export.Exporter; @@ -55,22 +55,27 @@ import org.springframework.util.CollectionUtils; @EnableConfigurationProperties public class MetricExportAutoConfiguration { - @Autowired - private MetricExportProperties properties; + private final MetricExportProperties properties; - @Autowired(required = false) - private MetricsEndpointMetricReader endpointReader; + private final MetricsEndpointMetricReader endpointReader; - @Autowired(required = false) - @ExportMetricReader - private List readers; + private final List readers; - @Autowired(required = false) - @ExportMetricWriter - private Map writers = Collections.emptyMap(); + private final Map writers; + + private final Map exporters; - @Autowired(required = false) - private Map exporters = Collections.emptyMap(); + public MetricExportAutoConfiguration(MetricExportProperties properties, + ObjectProvider endpointReaderProvider, + @ExportMetricReader ObjectProvider> readersProvider, + @ExportMetricWriter ObjectProvider> writersProvider, + ObjectProvider> exportersProvider) { + this.properties = properties; + this.endpointReader = endpointReaderProvider.getIfAvailable(); + this.readers = readersProvider.getIfAvailable(); + this.writers = writersProvider.getIfAvailable(); + this.exporters = exportersProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(name = "metricWritersMetricExporter") @@ -81,16 +86,19 @@ public class MetricExportAutoConfiguration { reader = new CompositeMetricReader( this.readers.toArray(new MetricReader[this.readers.size()])); } - if (reader == null && this.exporters.isEmpty()) { + if (reader == null && CollectionUtils.isEmpty(this.exporters)) { return new NoOpSchedulingConfigurer(); } MetricExporters exporters = new MetricExporters(this.properties); if (reader != null) { - writers.putAll(this.writers); + if (!CollectionUtils.isEmpty(this.writers)) { + writers.putAll(this.writers); + } exporters.setReader(reader); exporters.setWriters(writers); } - exporters.setExporters(this.exporters); + exporters.setExporters(this.exporters == null + ? Collections.emptyMap() : this.exporters); return exporters; } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java index 003d372c177..2aa3aa126c0 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.autoconfigure; -import java.util.Collections; import java.util.List; import javax.servlet.Servlet; @@ -24,7 +23,7 @@ import javax.sql.DataSource; import org.apache.catalina.startup.Tomcat; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.cache.CacheStatisticsProvider; import org.springframework.boot.actuate.endpoint.CachePublicMetrics; import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics; @@ -71,9 +70,12 @@ import org.springframework.lang.UsesJava7; IntegrationAutoConfiguration.class }) public class PublicMetricsAutoConfiguration { - @Autowired(required = false) - @ExportMetricReader - private List metricReaders = Collections.emptyList(); + private final List metricReaders; + + public PublicMetricsAutoConfiguration( + @ExportMetricReader ObjectProvider> metricReadersProvider) { + this.metricReaders = metricReadersProvider.getIfAvailable(); + } @Bean public SystemPublicMetrics systemPublicMetrics() { @@ -82,8 +84,10 @@ public class PublicMetricsAutoConfiguration { @Bean public MetricReaderPublicMetrics metricReaderPublicMetrics() { - return new MetricReaderPublicMetrics(new CompositeMetricReader( - this.metricReaders.toArray(new MetricReader[0]))); + return new MetricReaderPublicMetrics( + new CompositeMetricReader(this.metricReaders == null ? new MetricReader[0] + : this.metricReaders + .toArray(new MetricReader[this.metricReaders.size()]))); } @Bean diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointMvcIntegrationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointMvcIntegrationTests.java index ed194491259..e59f3a61160 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointMvcIntegrationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointMvcIntegrationTests.java @@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletResponse; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.EndpointMvcIntegrationTests.Application; import org.springframework.boot.actuate.endpoint.Endpoint; @@ -120,6 +121,13 @@ public class EndpointMvcIntegrationTests { @RestController protected static class Application { + private final List> converters; + + public Application( + ObjectProvider>> convertersProvider) { + this.converters = convertersProvider.getIfAvailable(); + } + @RequestMapping("/{name}/{env}/{bar}") public Map master(@PathVariable String name, @PathVariable String env, @PathVariable String label) { @@ -132,13 +140,11 @@ public class EndpointMvcIntegrationTests { return Collections.singletonMap("foo", (Object) "bar"); } - @Autowired(required = false) - private final List> converters = Collections.emptyList(); - @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters() { - return new HttpMessageConverters(this.converters); + return new HttpMessageConverters(this.converters == null + ? Collections.>emptyList() : this.converters); } @Bean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.java index 59ebd609f5d..396c3bbc408 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package org.springframework.boot.autoconfigure.admin; import javax.management.MalformedObjectNameException; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.admin.SpringApplicationAdminMXBean; import org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -53,11 +53,16 @@ public class SpringApplicationAdminJmxAutoConfiguration { */ private static final String DEFAULT_JMX_NAME = "org.springframework.boot:type=Admin,name=SpringApplication"; - @Autowired(required = false) - private MBeanExporter mbeanExporter; + private final MBeanExporter mbeanExporter; - @Autowired - private Environment environment; + private final Environment environment; + + public SpringApplicationAdminJmxAutoConfiguration( + ObjectProvider mbeanExporterProvider, + Environment environment) { + this.mbeanExporter = mbeanExporterProvider.getIfAvailable(); + this.environment = environment; + } @Bean public SpringApplicationAdminMXBeanRegistrar springApplicationAdminRegistrar() diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java index 1c546386c3a..b583817bf8d 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java @@ -22,7 +22,6 @@ import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFacto import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -39,11 +38,15 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnClass(EnableRabbit.class) class RabbitAnnotationDrivenConfiguration { - @Autowired - private ObjectProvider messageConverter; + private final ObjectProvider messageConverter; - @Autowired - private RabbitProperties properties; + private final RabbitProperties properties; + + RabbitAnnotationDrivenConfiguration(ObjectProvider messageConverter, + RabbitProperties properties) { + this.messageConverter = messageConverter; + this.properties = properties; + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java index c2dad4408be..31e816ea55a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java @@ -27,7 +27,6 @@ import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -144,11 +143,16 @@ public class RabbitAutoConfiguration { @Import(RabbitConnectionFactoryCreator.class) protected static class RabbitTemplateConfiguration { - @Autowired - private ObjectProvider messageConverter; + private final ObjectProvider messageConverter; - @Autowired - private RabbitProperties properties; + private final RabbitProperties properties; + + public RabbitTemplateConfiguration( + ObjectProvider messageConverter, + RabbitProperties properties) { + this.messageConverter = messageConverter; + this.properties = properties; + } @Bean @ConditionalOnSingleCandidate(ConnectionFactory.class) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java index 49b2acfca15..4229b6f8555 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java @@ -28,7 +28,7 @@ import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.support.SimpleJobOperator; import org.springframework.batch.core.repository.JobRepository; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -64,11 +64,15 @@ import org.springframework.util.StringUtils; @EnableConfigurationProperties(BatchProperties.class) public class BatchAutoConfiguration { - @Autowired - private BatchProperties properties; + private final BatchProperties properties; - @Autowired(required = false) - private JobParametersConverter jobParametersConverter; + private final JobParametersConverter jobParametersConverter; + + public BatchAutoConfiguration(BatchProperties properties, + ObjectProvider jobParametersConverterProvider) { + this.properties = properties; + this.jobParametersConverter = jobParametersConverterProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java index a9f38e8c5bf..8ab62b4567d 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java @@ -22,7 +22,7 @@ import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.CaffeineSpec; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; @@ -45,20 +45,27 @@ import org.springframework.util.StringUtils; @Conditional({ CacheCondition.class }) class CaffeineCacheConfiguration { - @Autowired - private CacheProperties cacheProperties; + private final CacheProperties cacheProperties; - @Autowired - private CacheManagerCustomizers customizers; + private final CacheManagerCustomizers customizers; - @Autowired(required = false) - private Caffeine caffeine; + private final Caffeine caffeine; - @Autowired(required = false) - private CaffeineSpec caffeineSpec; + private final CaffeineSpec caffeineSpec; - @Autowired(required = false) - private CacheLoader cacheLoader; + private final CacheLoader cacheLoader; + + CaffeineCacheConfiguration(CacheProperties cacheProperties, + CacheManagerCustomizers customizers, + ObjectProvider> caffeineProvider, + ObjectProvider caffeineSpecProvider, + ObjectProvider> cacheLoaderProvider) { + this.cacheProperties = cacheProperties; + this.customizers = customizers; + this.caffeine = caffeineProvider.getIfAvailable(); + this.caffeineSpec = caffeineSpecProvider.getIfAvailable(); + this.cacheLoader = cacheLoaderProvider.getIfAvailable(); + } @Bean public CaffeineCacheManager caffeineCacheManager() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java index 15012ce9e8a..05fefa6be79 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java @@ -22,7 +22,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilderSpec; import com.google.common.cache.CacheLoader; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; @@ -45,20 +45,27 @@ import org.springframework.util.StringUtils; @Conditional(CacheCondition.class) class GuavaCacheConfiguration { - @Autowired - private CacheProperties cacheProperties; + private final CacheProperties cacheProperties; - @Autowired - private CacheManagerCustomizers customizers; + private final CacheManagerCustomizers customizers; - @Autowired(required = false) - private CacheBuilder cacheBuilder; + private final CacheBuilder cacheBuilder; - @Autowired(required = false) - private CacheBuilderSpec cacheBuilderSpec; + private final CacheBuilderSpec cacheBuilderSpec; - @Autowired(required = false) - private CacheLoader cacheLoader; + private final CacheLoader cacheLoader; + + GuavaCacheConfiguration(CacheProperties cacheProperties, + CacheManagerCustomizers customizers, + ObjectProvider> cacheBuilderProvider, + ObjectProvider cacheBuilderSpecProvider, + ObjectProvider> cacheLoaderProvider) { + this.cacheProperties = cacheProperties; + this.customizers = customizers; + this.cacheBuilder = cacheBuilderProvider.getIfAvailable(); + this.cacheBuilderSpec = cacheBuilderSpecProvider.getIfAvailable(); + this.cacheLoader = cacheLoaderProvider.getIfAvailable(); + } @Bean public GuavaCacheManager cacheManager() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java index 9b95cc4217b..3744091baff 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java @@ -25,7 +25,7 @@ import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.spring.provider.SpringEmbeddedCacheManager; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; @@ -48,14 +48,20 @@ import org.springframework.util.CollectionUtils; @Conditional(CacheCondition.class) public class InfinispanCacheConfiguration { - @Autowired - private CacheProperties cacheProperties; + private final CacheProperties cacheProperties; - @Autowired - private CacheManagerCustomizers customizers; + private final CacheManagerCustomizers customizers; - @Autowired(required = false) - private ConfigurationBuilder defaultConfigurationBuilder; + private final ConfigurationBuilder defaultConfigurationBuilder; + + public InfinispanCacheConfiguration(CacheProperties cacheProperties, + CacheManagerCustomizers customizers, + ObjectProvider defaultConfigurationBuilderProvider) { + this.cacheProperties = cacheProperties; + this.customizers = customizers; + this.defaultConfigurationBuilder = defaultConfigurationBuilderProvider + .getIfAvailable(); + } @Bean public SpringEmbeddedCacheManager cacheManager( diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java index c253d5c5d58..ac54618c093 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java @@ -26,7 +26,7 @@ import javax.cache.Caching; import javax.cache.configuration.MutableConfiguration; import javax.cache.spi.CachingProvider; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -60,17 +60,24 @@ import org.springframework.util.StringUtils; JCacheCacheConfiguration.JCacheAvailableCondition.class }) class JCacheCacheConfiguration { - @Autowired - private CacheProperties cacheProperties; + private final CacheProperties cacheProperties; - @Autowired - private CacheManagerCustomizers customizers; + private final CacheManagerCustomizers customizers; - @Autowired(required = false) - private javax.cache.configuration.Configuration defaultCacheConfiguration; + private final javax.cache.configuration.Configuration defaultCacheConfiguration; - @Autowired(required = false) - private List cacheManagerCustomizers; + private final List cacheManagerCustomizers; + + JCacheCacheConfiguration(CacheProperties cacheProperties, + CacheManagerCustomizers customizers, + ObjectProvider> defaultCacheConfigurationProvider, + ObjectProvider> cacheManagerCustomizersProvider) { + this.cacheProperties = cacheProperties; + this.customizers = customizers; + this.defaultCacheConfiguration = defaultCacheConfigurationProvider + .getIfAvailable(); + this.cacheManagerCustomizers = cacheManagerCustomizersProvider.getIfAvailable(); + } @Bean public JCacheCacheManager cacheManager(CacheManager jCacheCacheManager) { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java index 19254c7f149..22e0b363c2f 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java @@ -16,7 +16,7 @@ package org.springframework.boot.autoconfigure.data.couchbase; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -38,11 +38,15 @@ import org.springframework.data.couchbase.repository.support.IndexManager; @ConditionalOnBean(CouchbaseConfigurer.class) class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfiguration { - @Autowired - private CouchbaseDataProperties properties; + private final CouchbaseDataProperties properties; - @Autowired(required = false) - private CouchbaseConfigurer couchbaseConfigurer; + private final CouchbaseConfigurer couchbaseConfigurer; + + SpringBootCouchbaseDataConfiguration(CouchbaseDataProperties properties, + ObjectProvider couchbaseConfigurerProvider) { + this.properties = properties; + this.couchbaseConfigurer = couchbaseConfigurerProvider.getIfAvailable(); + } @Override protected CouchbaseConfigurer couchbaseConfigurer() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index ad2e94e51f4..5974e6b9a38 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -27,7 +27,7 @@ import javax.sql.DataSource; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.MigrationVersion; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -44,7 +44,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; -import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; @@ -80,21 +79,27 @@ public class FlywayAutoConfiguration { @EnableConfigurationProperties(FlywayProperties.class) public static class FlywayConfiguration { - @Autowired - private FlywayProperties properties = new FlywayProperties(); + private final FlywayProperties properties; - @Autowired - private ResourceLoader resourceLoader = new DefaultResourceLoader(); + private final ResourceLoader resourceLoader; - @Autowired(required = false) - private DataSource dataSource; + private final DataSource dataSource; - @Autowired(required = false) - @FlywayDataSource - private DataSource flywayDataSource; + private final DataSource flywayDataSource; - @Autowired(required = false) - private FlywayMigrationStrategy migrationStrategy; + private final FlywayMigrationStrategy migrationStrategy; + + public FlywayConfiguration(FlywayProperties properties, + ResourceLoader resourceLoader, + ObjectProvider dataSourceProvider, + @FlywayDataSource ObjectProvider flywayDataSourceProvider, + ObjectProvider migrationStrategyProvider) { + this.properties = properties; + this.resourceLoader = resourceLoader; + this.dataSource = dataSourceProvider.getIfUnique(); + this.flywayDataSource = flywayDataSourceProvider.getIfAvailable(); + this.migrationStrategy = migrationStrategyProvider.getIfAvailable(); + } @PostConstruct public void checkLocationExists() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java index db1df79b679..8117d3ea499 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java @@ -26,7 +26,7 @@ import groovy.text.markup.MarkupTemplateEngine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -69,14 +69,19 @@ public class GroovyTemplateAutoConfiguration { @ConditionalOnClass(GroovyMarkupConfigurer.class) public static class GroovyMarkupConfiguration { - @Autowired - private ApplicationContext applicationContext; + private final ApplicationContext applicationContext; - @Autowired - private GroovyTemplateProperties properties; + private final GroovyTemplateProperties properties; + + private final MarkupTemplateEngine templateEngine; - @Autowired(required = false) - private MarkupTemplateEngine templateEngine; + public GroovyMarkupConfiguration(ApplicationContext applicationContext, + GroovyTemplateProperties properties, + ObjectProvider templateEngineProvider) { + this.applicationContext = applicationContext; + this.properties = properties; + this.templateEngine = templateEngineProvider.getIfAvailable(); + } @PostConstruct public void checkTemplateLocationExists() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java index f8520333a55..d909a62bb6a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java @@ -27,7 +27,6 @@ import org.apache.tomcat.jdbc.pool.DataSourceProxy; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -113,8 +112,11 @@ public class DataSourceAutoConfiguration { @Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class) protected static class JdbcTemplateConfiguration { - @Autowired(required = false) - private DataSource dataSource; + private final DataSource dataSource; + + public JdbcTemplateConfiguration(DataSource dataSource) { + this.dataSource = dataSource; + } @Bean @ConditionalOnMissingBean(JdbcOperations.class) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java index 666eccf5182..84cd7222242 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package org.springframework.boot.autoconfigure.jdbc; import javax.sql.DataSource; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -46,14 +45,22 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE) public class DataSourceTransactionManagerAutoConfiguration { - @Autowired(required = false) - private DataSource dataSource; - - @Bean - @ConditionalOnMissingBean(PlatformTransactionManager.class) + @Configuration @ConditionalOnBean(DataSource.class) - public DataSourceTransactionManager transactionManager() { - return new DataSourceTransactionManager(this.dataSource); + static class DataSourceTransactionManagerConfiguration { + + private final DataSource dataSource; + + DataSourceTransactionManagerConfiguration(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Bean + @ConditionalOnMissingBean(PlatformTransactionManager.class) + public DataSourceTransactionManager transactionManager() { + return new DataSourceTransactionManager(this.dataSource); + } + } @ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java index bf6a000ddad..9c31d09851e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java @@ -39,6 +39,7 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; import org.glassfish.jersey.servlet.ServletProperties; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; @@ -88,17 +89,21 @@ public class JerseyAutoConfiguration implements ServletContextAware { private static final Log logger = LogFactory.getLog(JerseyAutoConfiguration.class); - @Autowired - private JerseyProperties jersey; + private final JerseyProperties jersey; - @Autowired - private ResourceConfig config; + private final ResourceConfig config; - @Autowired(required = false) - private List customizers; + private final List customizers; private String path; + public JerseyAutoConfiguration(JerseyProperties jersey, ResourceConfig config, + ObjectProvider> customizersProvider) { + this.jersey = jersey; + this.config = config; + this.customizers = customizersProvider.getIfAvailable(); + } + @PostConstruct public void path() { resolveApplicationPath(); diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java index 6eb600c5ce2..3a3a3a89573 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java @@ -19,7 +19,6 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnJndi; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -44,17 +43,23 @@ import org.springframework.transaction.jta.JtaTransactionManager; @ConditionalOnClass(EnableJms.class) class JmsAnnotationDrivenConfiguration { - @Autowired - private ObjectProvider destinationResolver; + private final ObjectProvider destinationResolver; - @Autowired - private ObjectProvider transactionManager; + private final ObjectProvider transactionManager; - @Autowired - private ObjectProvider messageConverter; + private final ObjectProvider messageConverter; - @Autowired - private JmsProperties properties; + private final JmsProperties properties; + + JmsAnnotationDrivenConfiguration( + ObjectProvider destinationResolver, + ObjectProvider transactionManager, + ObjectProvider messageConverter, JmsProperties properties) { + this.destinationResolver = destinationResolver; + this.transactionManager = transactionManager; + this.messageConverter = messageConverter; + this.properties = properties; + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java index 83b64ccc95b..814bab43384 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java @@ -19,7 +19,6 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -50,14 +49,19 @@ public class JmsAutoConfiguration { @Configuration protected static class JmsTemplateConfiguration { - @Autowired - private JmsProperties properties; + private final JmsProperties properties; - @Autowired - private ObjectProvider destinationResolver; + private final ObjectProvider destinationResolver; - @Autowired - private ObjectProvider messageConverter; + private final ObjectProvider messageConverter; + + public JmsTemplateConfiguration(JmsProperties properties, + ObjectProvider destinationResolver, + ObjectProvider messageConverter) { + this.properties = properties; + this.destinationResolver = destinationResolver; + this.messageConverter = messageConverter; + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java index dc882562add..f7730e8cc25 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ import org.apache.activemq.artemis.jms.server.config.impl.JMSQueueConfigurationI import org.apache.activemq.artemis.jms.server.config.impl.TopicConfigurationImpl; import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -47,17 +47,23 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; @ConditionalOnProperty(prefix = "spring.artemis.embedded", name = "enabled", havingValue = "true", matchIfMissing = true) class ArtemisEmbeddedServerConfiguration { - @Autowired - private ArtemisProperties properties; + private final ArtemisProperties properties; - @Autowired(required = false) - private List configurationCustomizers; + private final List configurationCustomizers; - @Autowired(required = false) - private List queuesConfiguration; + private final List queuesConfiguration; - @Autowired(required = false) - private List topicsConfiguration; + private final List topicsConfiguration; + + ArtemisEmbeddedServerConfiguration(ArtemisProperties properties, + ObjectProvider> configurationCustomizersProvider, + ObjectProvider> queuesConfigurationProvider, + ObjectProvider> topicsConfigurationProvider) { + this.properties = properties; + this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable(); + this.queuesConfiguration = queuesConfigurationProvider.getIfAvailable(); + this.topicsConfiguration = topicsConfigurationProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/hornetq/HornetQEmbeddedServerConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/hornetq/HornetQEmbeddedServerConfiguration.java index 592a7ae75de..319e3a51edd 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/hornetq/HornetQEmbeddedServerConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/hornetq/HornetQEmbeddedServerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ import org.hornetq.jms.server.config.impl.JMSQueueConfigurationImpl; import org.hornetq.jms.server.config.impl.TopicConfigurationImpl; import org.hornetq.jms.server.embedded.EmbeddedJMS; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -47,17 +47,23 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; @ConditionalOnProperty(prefix = "spring.hornetq.embedded", name = "enabled", havingValue = "true", matchIfMissing = true) class HornetQEmbeddedServerConfiguration { - @Autowired - private HornetQProperties properties; + private final HornetQProperties properties; - @Autowired(required = false) - private List configurationCustomizers; + private final List configurationCustomizers; - @Autowired(required = false) - private List queuesConfiguration; + private final List queuesConfiguration; - @Autowired(required = false) - private List topicsConfiguration; + private final List topicsConfiguration; + + HornetQEmbeddedServerConfiguration(HornetQProperties properties, + ObjectProvider> configurationCustomizersProvider, + ObjectProvider> queuesConfigurationProvider, + ObjectProvider> topicsConfigurationProvider) { + this.properties = properties; + this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable(); + this.queuesConfiguration = queuesConfigurationProvider.getIfAvailable(); + this.topicsConfiguration = topicsConfigurationProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java index b3bece7fbd2..d0cb1c30972 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ import org.jooq.impl.DefaultConfiguration; import org.jooq.impl.DefaultDSLContext; import org.jooq.impl.DefaultExecuteListenerProvider; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -81,29 +81,40 @@ public class JooqAutoConfiguration { @EnableConfigurationProperties(JooqProperties.class) public static class DslContextConfiguration { - @Autowired - private JooqProperties properties = new JooqProperties(); + private final JooqProperties properties; - @Autowired - private ConnectionProvider connectionProvider; + private final ConnectionProvider connectionProvider; - @Autowired(required = false) - private TransactionProvider transactionProvider; + private final TransactionProvider transactionProvider; - @Autowired(required = false) - private RecordMapperProvider recordMapperProvider; + private final RecordMapperProvider recordMapperProvider; - @Autowired(required = false) - private Settings settings; + private final Settings settings; - @Autowired(required = false) - private RecordListenerProvider[] recordListenerProviders; + private final RecordListenerProvider[] recordListenerProviders; - @Autowired - private ExecuteListenerProvider[] executeListenerProviders; + private final ExecuteListenerProvider[] executeListenerProviders; - @Autowired(required = false) - private VisitListenerProvider[] visitListenerProviders; + private final VisitListenerProvider[] visitListenerProviders; + + public DslContextConfiguration(JooqProperties properties, + ConnectionProvider connectionProvider, + ObjectProvider transactionProviderProvider, + ObjectProvider recordMapperProviderProvider, + ObjectProvider settingsProvider, + ObjectProvider recordListenerProvidersProvider, + ExecuteListenerProvider[] executeListenerProviders, + ObjectProvider visitListenerProvidersProvider) { + this.properties = properties; + this.connectionProvider = connectionProvider; + this.transactionProvider = transactionProviderProvider.getIfAvailable(); + this.recordMapperProvider = recordMapperProviderProvider.getIfAvailable(); + this.settings = settingsProvider.getIfAvailable(); + this.recordListenerProviders = recordListenerProvidersProvider + .getIfAvailable(); + this.executeListenerProviders = executeListenerProviders; + this.visitListenerProviders = visitListenerProvidersProvider.getIfAvailable(); + } @Bean public DefaultDSLContext dslContext(org.jooq.Configuration configuration) { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java index 7f8a8513e42..f595cb6c017 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import javax.activation.MimeType; import javax.mail.Session; import javax.mail.internet.MimeMessage; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -54,11 +54,15 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; @Import(JndiSessionConfiguration.class) public class MailSenderAutoConfiguration { - @Autowired - private MailProperties properties; + private final MailProperties properties; - @Autowired(required = false) - private Session session; + private final Session session; + + public MailSenderAutoConfiguration(MailProperties properties, + ObjectProvider sessionProvider) { + this.properties = properties; + this.session = sessionProvider.getIfAvailable(); + } @Bean public JavaMailSenderImpl mailSender() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.java index 79b1cdfdcee..fb0363abfb6 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import javax.annotation.PreDestroy; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -45,17 +45,21 @@ import org.springframework.core.env.Environment; @ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory") public class MongoAutoConfiguration { - @Autowired - private MongoProperties properties; + private final MongoProperties properties; - @Autowired(required = false) - private MongoClientOptions options; + private final MongoClientOptions options; - @Autowired - private Environment environment; + private final Environment environment; private MongoClient mongo; + public MongoAutoConfiguration(MongoProperties properties, + ObjectProvider optionsProvider, Environment environment) { + this.properties = properties; + this.options = optionsProvider.getIfAvailable(); + this.environment = environment; + } + @PreDestroy public void close() { if (this.mongo != null) { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java index 9d1cb04db47..cd9257f6648 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java @@ -47,7 +47,6 @@ import de.flapdoodle.embed.process.store.ArtifactStoreBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -83,37 +82,21 @@ public class EmbeddedMongoAutoConfiguration { private static final byte[] IP6_LOOPBACK_ADDRESS = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; - @Autowired - private MongoProperties properties; + private final MongoProperties properties; - @Autowired - private EmbeddedMongoProperties embeddedProperties; + private final EmbeddedMongoProperties embeddedProperties; - @Autowired - private ApplicationContext context; + private final ApplicationContext context; - @Autowired(required = false) - private IRuntimeConfig runtimeConfig; + private final IRuntimeConfig runtimeConfig; - @Bean - @ConditionalOnMissingBean - @ConditionalOnClass(Logger.class) - public IRuntimeConfig embeddedMongoRuntimeConfig() { - Logger logger = LoggerFactory - .getLogger(getClass().getPackage().getName() + ".EmbeddedMongo"); - ProcessOutput processOutput = new ProcessOutput( - Processors.logTo(logger, Slf4jLevel.INFO), - Processors.logTo(logger, Slf4jLevel.ERROR), Processors.named("[console>]", - Processors.logTo(logger, Slf4jLevel.DEBUG))); - return new RuntimeConfigBuilder().defaultsWithLogger(Command.MongoD, logger) - .processOutput(processOutput).artifactStore(getArtifactStore(logger)) - .build(); - } - - private ArtifactStoreBuilder getArtifactStore(Logger logger) { - return new ExtractedArtifactStoreBuilder().defaults(Command.MongoD) - .download(new DownloadConfigBuilder().defaultsForCommand(Command.MongoD) - .progressListener(new Slf4jProgressListener(logger)).build()); + public EmbeddedMongoAutoConfiguration(MongoProperties properties, + EmbeddedMongoProperties embeddedProperties, ApplicationContext context, + IRuntimeConfig runtimeConfig) { + this.properties = properties; + this.embeddedProperties = embeddedProperties; + this.context = context; + this.runtimeConfig = runtimeConfig; } @Bean(initMethod = "start", destroyMethod = "stop") @@ -194,6 +177,33 @@ public class EmbeddedMongoAutoConfiguration { return (Map) propertySource.getSource(); } + @Configuration + @ConditionalOnClass(Logger.class) + @ConditionalOnMissingBean(IRuntimeConfig.class) + static class RuntimeConfigConfiguration { + + @Bean + public IRuntimeConfig embeddedMongoRuntimeConfig() { + Logger logger = LoggerFactory + .getLogger(getClass().getPackage().getName() + ".EmbeddedMongo"); + ProcessOutput processOutput = new ProcessOutput( + Processors.logTo(logger, Slf4jLevel.INFO), + Processors.logTo(logger, Slf4jLevel.ERROR), Processors.named( + "[console>]", Processors.logTo(logger, Slf4jLevel.DEBUG))); + return new RuntimeConfigBuilder().defaultsWithLogger(Command.MongoD, logger) + .processOutput(processOutput).artifactStore(getArtifactStore(logger)) + .build(); + } + + private ArtifactStoreBuilder getArtifactStore(Logger logger) { + return new ExtractedArtifactStoreBuilder().defaults(Command.MongoD) + .download(new DownloadConfigBuilder() + .defaultsForCommand(Command.MongoD) + .progressListener(new Slf4jProgressListener(logger)).build()); + } + + } + /** * Additional configuration to ensure that {@link MongoClient} beans depend on the * {@code embeddedMongoServer} bean. diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/authserver/OAuth2AuthorizationServerConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/authserver/OAuth2AuthorizationServerConfiguration.java index 32f492ec890..0fd08bb1132 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/authserver/OAuth2AuthorizationServerConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/authserver/OAuth2AuthorizationServerConfiguration.java @@ -25,7 +25,7 @@ import javax.annotation.PostConstruct; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -68,17 +68,23 @@ public class OAuth2AuthorizationServerConfiguration private static final Log logger = LogFactory .getLog(OAuth2AuthorizationServerConfiguration.class); - @Autowired - private BaseClientDetails details; + private final BaseClientDetails details; - @Autowired - private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; - @Autowired(required = false) - private TokenStore tokenStore; + private final TokenStore tokenStore; - @Autowired - private AuthorizationServerProperties properties; + private final AuthorizationServerProperties properties; + + public OAuth2AuthorizationServerConfiguration(BaseClientDetails details, + AuthenticationManager authenticationManager, + ObjectProvider tokenStoreProvider, + AuthorizationServerProperties properties) { + this.details = details; + this.authenticationManager = authenticationManager; + this.tokenStore = tokenStoreProvider.getIfAvailable(); + this.properties = properties; + } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfiguration.java index 19fd39cc81f..1f29a0e9903 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfiguration.java @@ -18,14 +18,13 @@ package org.springframework.boot.autoconfigure.security.oauth2.resource; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -67,6 +66,7 @@ import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenCo import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; import org.springframework.social.connect.ConnectionFactoryLocator; import org.springframework.social.connect.support.OAuth2ConnectionFactory; +import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.client.ResourceAccessException; @@ -98,38 +98,43 @@ public class ResourceServerTokenServicesConfiguration { .setAccessTokenUri("Not a URI " + "because there is no client"); } - @Autowired(required = false) - private List customizers = Collections - .emptyList(); + private final List customizers; - @Autowired(required = false) - private OAuth2ProtectedResourceDetails details; + private final OAuth2ProtectedResourceDetails details; - @Autowired(required = false) - private OAuth2ClientContext oauth2ClientContext; + private final OAuth2ClientContext oauth2ClientContext; + + public UserInfoRestTemplateConfiguration( + ObjectProvider> customizersProvider, + ObjectProvider detailsProvider, + ObjectProvider oauth2ClientContextProvider) { + this.customizers = customizersProvider.getIfAvailable(); + this.details = detailsProvider.getIfAvailable(); + this.oauth2ClientContext = oauth2ClientContextProvider.getIfAvailable(); + } @Bean(name = "userInfoRestTemplate") public OAuth2RestTemplate userInfoRestTemplate() { - if (this.details == null) { - this.details = DEFAULT_RESOURCE_DETAILS; - } - OAuth2RestTemplate template = getTemplate(); + OAuth2RestTemplate template = getTemplate( + this.details == null ? DEFAULT_RESOURCE_DETAILS : this.details); template.getInterceptors().add(new AcceptJsonRequestInterceptor()); AuthorizationCodeAccessTokenProvider accessTokenProvider = new AuthorizationCodeAccessTokenProvider(); accessTokenProvider.setTokenRequestEnhancer(new AcceptJsonRequestEnhancer()); template.setAccessTokenProvider(accessTokenProvider); - AnnotationAwareOrderComparator.sort(this.customizers); - for (UserInfoRestTemplateCustomizer customizer : this.customizers) { - customizer.customize(template); + if (!CollectionUtils.isEmpty(this.customizers)) { + AnnotationAwareOrderComparator.sort(this.customizers); + for (UserInfoRestTemplateCustomizer customizer : this.customizers) { + customizer.customize(template); + } } return template; } - private OAuth2RestTemplate getTemplate() { + private OAuth2RestTemplate getTemplate(OAuth2ProtectedResourceDetails details) { if (this.oauth2ClientContext == null) { - return new OAuth2RestTemplate(this.details); + return new OAuth2RestTemplate(details); } - return new OAuth2RestTemplate(this.details, this.oauth2ClientContext); + return new OAuth2RestTemplate(details, this.oauth2ClientContext); } } @@ -164,18 +169,23 @@ public class ResourceServerTokenServicesConfiguration { @Conditional(NotTokenInfoCondition.class) protected static class SocialTokenServicesConfiguration { - @Autowired - private ResourceServerProperties sso; + private final ResourceServerProperties sso; + + private final OAuth2ConnectionFactory connectionFactory; - @Autowired(required = false) - private OAuth2ConnectionFactory connectionFactory; + private final OAuth2RestOperations restTemplate; - @Autowired(required = false) - @Qualifier("userInfoRestTemplate") - private OAuth2RestOperations restTemplate; + private final AuthoritiesExtractor authoritiesExtractor; - @Autowired(required = false) - private AuthoritiesExtractor authoritiesExtractor; + public SocialTokenServicesConfiguration(ResourceServerProperties sso, + ObjectProvider> connectionFactoryProvider, + @Qualifier("userInfoRestTemplate") ObjectProvider restTemplateProvider, + ObjectProvider authoritiesExtractorProvider) { + this.sso = sso; + this.connectionFactory = connectionFactoryProvider.getIfAvailable(); + this.restTemplate = restTemplateProvider.getIfAvailable(); + this.authoritiesExtractor = authoritiesExtractorProvider.getIfAvailable(); + } @Bean @ConditionalOnBean(ConnectionFactoryLocator.class) @@ -206,15 +216,19 @@ public class ResourceServerTokenServicesConfiguration { @Conditional(NotTokenInfoCondition.class) protected static class UserInfoTokenServicesConfiguration { - @Autowired - private ResourceServerProperties sso; + private final ResourceServerProperties sso; - @Autowired(required = false) - @Qualifier("userInfoRestTemplate") - private OAuth2RestOperations restTemplate; + private final OAuth2RestOperations restTemplate; - @Autowired(required = false) - private AuthoritiesExtractor authoritiesExtractor; + private final AuthoritiesExtractor authoritiesExtractor; + + public UserInfoTokenServicesConfiguration(ResourceServerProperties sso, + @Qualifier("userInfoRestTemplate") ObjectProvider restTemplateProvider, + ObjectProvider authoritiesExtractorProvider) { + this.sso = sso; + this.restTemplate = restTemplateProvider.getIfAvailable(); + this.authoritiesExtractor = authoritiesExtractorProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(ResourceServerTokenServices.class) @@ -239,12 +253,15 @@ public class ResourceServerTokenServicesConfiguration { private RestTemplate keyUriRestTemplate = new RestTemplate(); - @Autowired - private ResourceServerProperties resource; + private final ResourceServerProperties resource; - @Autowired(required = false) - private List configurers = Collections - .emptyList(); + private final List configurers; + + public JwtTokenServicesConfiguration(ResourceServerProperties resource, + ObjectProvider> configurersProvider) { + this.resource = resource; + this.configurers = configurersProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(ResourceServerTokenServices.class) @@ -278,9 +295,11 @@ public class ResourceServerTokenServicesConfiguration { if (keyValue != null) { converter.setVerifierKey(keyValue); } - AnnotationAwareOrderComparator.sort(this.configurers); - for (JwtAccessTokenConverterConfigurer configurer : this.configurers) { - configurer.configure(converter); + if (!CollectionUtils.isEmpty(this.configurers)) { + AnnotationAwareOrderComparator.sort(this.configurers); + for (JwtAccessTokenConverterConfigurer configurer : this.configurers) { + configurer.configure(converter); + } } return converter; } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java index 9c6551d82cd..44c00d7c535 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import java.util.List; import org.thymeleaf.spring4.SpringTemplateEngine; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -75,14 +75,20 @@ public class SocialWebAutoConfiguration { protected static class SocialAutoConfigurationAdapter extends SocialConfigurerAdapter { - @Autowired(required = false) - private List> connectInterceptors; + private final List> connectInterceptors; - @Autowired(required = false) - private List> disconnectInterceptors; + private final List> disconnectInterceptors; - @Autowired(required = false) - private List> signInInterceptors; + private final List> signInInterceptors; + + public SocialAutoConfigurationAdapter( + ObjectProvider>> connectInterceptorsProvider, + ObjectProvider>> disconnectInterceptorsProvider, + ObjectProvider>> signInInterceptorsProvider) { + this.connectInterceptors = connectInterceptorsProvider.getIfAvailable(); + this.disconnectInterceptors = disconnectInterceptorsProvider.getIfAvailable(); + this.signInInterceptors = signInInterceptorsProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean(ConnectController.class) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java index f1d8b5fca22..d33b187536b 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.thymeleaf; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; import javax.annotation.PostConstruct; @@ -37,7 +36,7 @@ import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templateresolver.ITemplateResolver; import org.thymeleaf.templateresolver.TemplateResolver; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -54,6 +53,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; +import org.springframework.util.CollectionUtils; import org.springframework.util.MimeType; import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; @@ -79,11 +79,15 @@ public class ThymeleafAutoConfiguration { @ConditionalOnMissingBean(name = "defaultTemplateResolver") public static class DefaultTemplateResolverConfiguration { - @Autowired - private ThymeleafProperties properties; + private final ThymeleafProperties properties; + + private final ApplicationContext applicationContext; - @Autowired - private ApplicationContext applicationContext; + public DefaultTemplateResolverConfiguration(ThymeleafProperties properties, + ApplicationContext applicationContext) { + this.properties = properties; + this.applicationContext = applicationContext; + } @PostConstruct public void checkTemplateLocationExists() { @@ -127,12 +131,16 @@ public class ThymeleafAutoConfiguration { @ConditionalOnMissingBean(SpringTemplateEngine.class) protected static class ThymeleafDefaultConfiguration { - @Autowired - private final Collection templateResolvers = Collections - .emptySet(); + private final Collection templateResolvers; - @Autowired(required = false) - private final Collection dialects = Collections.emptySet(); + private final Collection dialects; + + public ThymeleafDefaultConfiguration( + Collection templateResolvers, + ObjectProvider> dialectsProvider) { + this.templateResolvers = templateResolvers; + this.dialects = dialectsProvider.getIfAvailable(); + } @Bean public SpringTemplateEngine templateEngine() { @@ -140,8 +148,10 @@ public class ThymeleafAutoConfiguration { for (ITemplateResolver templateResolver : this.templateResolvers) { engine.addTemplateResolver(templateResolver); } - for (IDialect dialect : this.dialects) { - engine.addDialect(dialect); + if (!CollectionUtils.isEmpty(this.dialects)) { + for (IDialect dialect : this.dialects) { + engine.addDialect(dialect); + } } return engine; } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java index ba3144eba9c..7cf91c6ad5d 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ import java.util.List; import javax.servlet.MultipartConfigElement; import javax.servlet.ServletRegistration; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureOrder; @@ -79,14 +79,19 @@ public class DispatcherServletAutoConfiguration { @EnableConfigurationProperties(WebMvcProperties.class) protected static class DispatcherServletConfiguration { - @Autowired - private ServerProperties server; + private final ServerProperties server; - @Autowired - private WebMvcProperties webMvcProperties; + private final WebMvcProperties webMvcProperties; - @Autowired(required = false) - private MultipartConfigElement multipartConfig; + private final MultipartConfigElement multipartConfig; + + public DispatcherServletConfiguration(ServerProperties server, + WebMvcProperties webMvcProperties, + ObjectProvider multipartConfigProvider) { + this.server = server; + this.webMvcProperties = webMvcProperties; + this.multipartConfig = multipartConfigProvider.getIfAvailable(); + } @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfiguration.java index 4a9f70d6905..77ccf6a2b13 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfiguration.java @@ -19,7 +19,7 @@ package org.springframework.boot.autoconfigure.web; import java.util.Collections; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -54,13 +54,18 @@ public class HttpMessageConvertersAutoConfiguration { static final String PREFERRED_MAPPER_PROPERTY = "spring.http.converters.preferred-json-mapper"; - @Autowired(required = false) - private final List> converters = Collections.emptyList(); + private final List> converters; + + public HttpMessageConvertersAutoConfiguration( + ObjectProvider>> convertersProvider) { + this.converters = convertersProvider.getIfAvailable(); + } @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters() { - return new HttpMessageConverters(this.converters); + return new HttpMessageConverters(this.converters == null + ? Collections.>emptyList() : this.converters); } @Configuration diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java index 0fbaea52bee..50298b0dc96 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java @@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureOrder; @@ -137,20 +138,27 @@ public class WebMvcAutoConfiguration { private static final Log logger = LogFactory .getLog(WebMvcConfigurerAdapter.class); - @Autowired - private ResourceProperties resourceProperties = new ResourceProperties(); + private final ResourceProperties resourceProperties; - @Autowired - private WebMvcProperties mvcProperties = new WebMvcProperties(); + private final WebMvcProperties mvcProperties; - @Autowired - private ListableBeanFactory beanFactory; + private final ListableBeanFactory beanFactory; - @Autowired - private HttpMessageConverters messageConverters; + private final HttpMessageConverters messageConverters; - @Autowired(required = false) - ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; + final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; + + public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, + WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, + HttpMessageConverters messageConverters, + ObjectProvider resourceHandlerRegistrationCustomizerProvider) { + this.resourceProperties = resourceProperties; + this.mvcProperties = mvcProperties; + this.beanFactory = beanFactory; + this.messageConverters = messageConverters; + this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider + .getIfAvailable(); + } @Override public void configureMessageConverters(List> converters) { @@ -329,11 +337,16 @@ public class WebMvcAutoConfiguration { @Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration { - @Autowired(required = false) - private WebMvcProperties mvcProperties; + private final WebMvcProperties mvcProperties; - @Autowired - private ListableBeanFactory beanFactory; + private final ListableBeanFactory beanFactory; + + public EnableWebMvcConfiguration( + ObjectProvider mvcPropertiesProvider, + ListableBeanFactory beanFactory) { + this.mvcProperties = mvcPropertiesProvider.getIfAvailable(); + this.beanFactory = beanFactory; + } @Bean @Override diff --git a/spring-boot-samples/spring-boot-sample-devtools/src/main/java/sample/devtools/SampleDevToolsApplication.java b/spring-boot-samples/spring-boot-sample-devtools/src/main/java/sample/devtools/SampleDevToolsApplication.java index 8d2c1e47005..e10f482e0d6 100644 --- a/spring-boot-samples/spring-boot-sample-devtools/src/main/java/sample/devtools/SampleDevToolsApplication.java +++ b/spring-boot-samples/spring-boot-sample-devtools/src/main/java/sample/devtools/SampleDevToolsApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,9 @@ package sample.devtools; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter; @SpringBootApplication -public class SampleDevToolsApplication extends WebMvcAutoConfigurationAdapter { +public class SampleDevToolsApplication { public static void main(String[] args) { SpringApplication.run(SampleDevToolsApplication.class, args);