Skip to content

Commit 479bd17

Browse files
committed
Merge pull request #32554 from vpavic
* gh-32554: Polish "Rework Spring Session auto-configuration to use customizers" Rework Spring Session auto-configuration to use customizers Closes gh-32554
2 parents a9c1b4a + 7e47d3b commit 479bd17

File tree

8 files changed

+131
-155
lines changed

8 files changed

+131
-155
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HazelcastSessionConfiguration.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19-
import java.time.Duration;
20-
2119
import com.hazelcast.core.HazelcastInstance;
2220

23-
import org.springframework.beans.factory.annotation.Autowired;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2522
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2623
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2724
import org.springframework.boot.autoconfigure.web.ServerProperties;
2825
import org.springframework.boot.context.properties.EnableConfigurationProperties;
26+
import org.springframework.boot.context.properties.PropertyMapper;
27+
import org.springframework.context.annotation.Bean;
2928
import org.springframework.context.annotation.Configuration;
29+
import org.springframework.context.annotation.Import;
3030
import org.springframework.session.SessionRepository;
31+
import org.springframework.session.config.SessionRepositoryCustomizer;
3132
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
3233
import org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration;
3334

@@ -44,24 +45,21 @@
4445
@ConditionalOnMissingBean(SessionRepository.class)
4546
@ConditionalOnBean(HazelcastInstance.class)
4647
@EnableConfigurationProperties(HazelcastSessionProperties.class)
48+
@Import(HazelcastHttpSessionConfiguration.class)
4749
class HazelcastSessionConfiguration {
4850

49-
@Configuration(proxyBeanMethods = false)
50-
public static class SpringBootHazelcastHttpSessionConfiguration extends HazelcastHttpSessionConfiguration {
51-
52-
@Autowired
53-
public void customize(SessionProperties sessionProperties,
54-
HazelcastSessionProperties hazelcastSessionProperties, ServerProperties serverProperties) {
55-
Duration timeout = sessionProperties
56-
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout());
57-
if (timeout != null) {
58-
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
59-
}
60-
setSessionMapName(hazelcastSessionProperties.getMapName());
61-
setFlushMode(hazelcastSessionProperties.getFlushMode());
62-
setSaveMode(hazelcastSessionProperties.getSaveMode());
63-
}
64-
51+
@Bean
52+
SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> springBootSessionRepositoryCustomizer(
53+
SessionProperties sessionProperties, HazelcastSessionProperties hazelcastSessionProperties,
54+
ServerProperties serverProperties) {
55+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
56+
return (sessionRepository) -> {
57+
map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
58+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
59+
map.from(hazelcastSessionProperties::getMapName).to(sessionRepository::setSessionMapName);
60+
map.from(hazelcastSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
61+
map.from(hazelcastSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
62+
};
6563
}
6664

6765
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,24 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19-
import java.time.Duration;
20-
2119
import javax.sql.DataSource;
2220

2321
import org.springframework.beans.factory.ObjectProvider;
24-
import org.springframework.beans.factory.annotation.Autowired;
2522
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2623
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2724
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2825
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
2926
import org.springframework.boot.autoconfigure.web.ServerProperties;
3027
import org.springframework.boot.context.properties.EnableConfigurationProperties;
28+
import org.springframework.boot.context.properties.PropertyMapper;
3129
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
3230
import org.springframework.context.annotation.Bean;
3331
import org.springframework.context.annotation.Conditional;
3432
import org.springframework.context.annotation.Configuration;
3533
import org.springframework.context.annotation.Import;
3634
import org.springframework.jdbc.core.JdbcTemplate;
3735
import org.springframework.session.SessionRepository;
36+
import org.springframework.session.config.SessionRepositoryCustomizer;
3837
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
3938
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
4039
import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration;
@@ -51,7 +50,7 @@
5150
@ConditionalOnMissingBean(SessionRepository.class)
5251
@ConditionalOnBean(DataSource.class)
5352
@EnableConfigurationProperties(JdbcSessionProperties.class)
54-
@Import(DatabaseInitializationDependencyConfigurer.class)
53+
@Import({ DatabaseInitializationDependencyConfigurer.class, JdbcHttpSessionConfiguration.class })
5554
class JdbcSessionConfiguration {
5655

5756
@Bean
@@ -64,22 +63,19 @@ JdbcSessionDataSourceScriptDatabaseInitializer jdbcSessionDataSourceScriptDataba
6463
return new JdbcSessionDataSourceScriptDatabaseInitializer(dataSourceToInitialize, properties);
6564
}
6665

67-
@Configuration(proxyBeanMethods = false)
68-
static class SpringBootJdbcHttpSessionConfiguration extends JdbcHttpSessionConfiguration {
69-
70-
@Autowired
71-
void customize(SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties,
72-
ServerProperties serverProperties) {
73-
Duration timeout = sessionProperties
74-
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout());
75-
if (timeout != null) {
76-
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
77-
}
78-
setTableName(jdbcSessionProperties.getTableName());
79-
setCleanupCron(jdbcSessionProperties.getCleanupCron());
80-
setFlushMode(jdbcSessionProperties.getFlushMode());
81-
setSaveMode(jdbcSessionProperties.getSaveMode());
82-
}
66+
@Bean
67+
SessionRepositoryCustomizer<JdbcIndexedSessionRepository> springBootSessionRepositoryCustomizer(
68+
SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties,
69+
ServerProperties serverProperties) {
70+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
71+
return (sessionRepository) -> {
72+
map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
73+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
74+
map.from(jdbcSessionProperties::getTableName).to(sessionRepository::setTableName);
75+
map.from(jdbcSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
76+
map.from(jdbcSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
77+
map.from(jdbcSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
78+
};
8379

8480
}
8581

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/MongoReactiveSessionConfiguration.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19-
import java.time.Duration;
20-
21-
import org.springframework.beans.factory.annotation.Autowired;
2219
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2320
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2522
import org.springframework.boot.autoconfigure.web.ServerProperties;
2623
import org.springframework.boot.context.properties.EnableConfigurationProperties;
24+
import org.springframework.boot.context.properties.PropertyMapper;
25+
import org.springframework.context.annotation.Bean;
2726
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.context.annotation.Import;
2828
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
2929
import org.springframework.session.ReactiveSessionRepository;
30+
import org.springframework.session.config.ReactiveSessionRepositoryCustomizer;
3031
import org.springframework.session.data.mongo.ReactiveMongoSessionRepository;
3132
import org.springframework.session.data.mongo.config.annotation.web.reactive.ReactiveMongoWebSessionConfiguration;
3233

@@ -35,28 +36,26 @@
3536
*
3637
* @author Andy Wilkinson
3738
* @author Weix Sun
39+
* @author Vedran Pavic
3840
*/
3941
@Configuration(proxyBeanMethods = false)
4042
@ConditionalOnClass({ ReactiveMongoOperations.class, ReactiveMongoSessionRepository.class })
4143
@ConditionalOnMissingBean(ReactiveSessionRepository.class)
4244
@ConditionalOnBean(ReactiveMongoOperations.class)
4345
@EnableConfigurationProperties(MongoSessionProperties.class)
46+
@Import(ReactiveMongoWebSessionConfiguration.class)
4447
class MongoReactiveSessionConfiguration {
4548

46-
@Configuration(proxyBeanMethods = false)
47-
static class SpringBootReactiveMongoWebSessionConfiguration extends ReactiveMongoWebSessionConfiguration {
48-
49-
@Autowired
50-
void customize(SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
51-
ServerProperties serverProperties) {
52-
Duration timeout = sessionProperties
53-
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout());
54-
if (timeout != null) {
55-
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
56-
}
57-
setCollectionName(mongoSessionProperties.getCollectionName());
58-
}
59-
49+
@Bean
50+
ReactiveSessionRepositoryCustomizer<ReactiveMongoSessionRepository> springBootSessionRepositoryCustomizer(
51+
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
52+
ServerProperties serverProperties) {
53+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
54+
return (sessionRepository) -> {
55+
map.from(sessionProperties.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
56+
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
57+
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
58+
};
6059
}
6160

6261
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/MongoSessionConfiguration.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19-
import java.time.Duration;
20-
21-
import org.springframework.beans.factory.annotation.Autowired;
2219
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2320
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2522
import org.springframework.boot.autoconfigure.web.ServerProperties;
2623
import org.springframework.boot.context.properties.EnableConfigurationProperties;
24+
import org.springframework.boot.context.properties.PropertyMapper;
25+
import org.springframework.context.annotation.Bean;
2726
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.context.annotation.Import;
2828
import org.springframework.data.mongodb.core.MongoOperations;
2929
import org.springframework.session.SessionRepository;
30+
import org.springframework.session.config.SessionRepositoryCustomizer;
3031
import org.springframework.session.data.mongo.MongoIndexedSessionRepository;
3132
import org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration;
3233

@@ -35,28 +36,26 @@
3536
*
3637
* @author Eddú Meléndez
3738
* @author Stephane Nicoll
39+
* @author Vedran Pavic
3840
*/
3941
@Configuration(proxyBeanMethods = false)
4042
@ConditionalOnClass({ MongoOperations.class, MongoIndexedSessionRepository.class })
4143
@ConditionalOnMissingBean(SessionRepository.class)
4244
@ConditionalOnBean(MongoOperations.class)
4345
@EnableConfigurationProperties(MongoSessionProperties.class)
46+
@Import(MongoHttpSessionConfiguration.class)
4447
class MongoSessionConfiguration {
4548

46-
@Configuration(proxyBeanMethods = false)
47-
public static class SpringBootMongoHttpSessionConfiguration extends MongoHttpSessionConfiguration {
48-
49-
@Autowired
50-
public void customize(SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
51-
ServerProperties serverProperties) {
52-
Duration timeout = sessionProperties
53-
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout());
54-
if (timeout != null) {
55-
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
56-
}
57-
setCollectionName(mongoSessionProperties.getCollectionName());
58-
}
59-
49+
@Bean
50+
SessionRepositoryCustomizer<MongoIndexedSessionRepository> springBootSessionRepositoryCustomizer(
51+
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
52+
ServerProperties serverProperties) {
53+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
54+
return (sessionRepository) -> {
55+
map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
56+
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
57+
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
58+
};
6059
}
6160

6261
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisReactiveSessionConfiguration.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19-
import java.time.Duration;
20-
21-
import org.springframework.beans.factory.annotation.Autowired;
2219
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2320
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2522
import org.springframework.boot.autoconfigure.web.ServerProperties;
2623
import org.springframework.boot.context.properties.EnableConfigurationProperties;
24+
import org.springframework.boot.context.properties.PropertyMapper;
25+
import org.springframework.context.annotation.Bean;
2726
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.context.annotation.Import;
2828
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
2929
import org.springframework.session.ReactiveSessionRepository;
30+
import org.springframework.session.config.ReactiveSessionRepositoryCustomizer;
3031
import org.springframework.session.data.redis.ReactiveRedisSessionRepository;
3132
import org.springframework.session.data.redis.config.annotation.web.server.RedisWebSessionConfiguration;
3233

@@ -35,29 +36,27 @@
3536
*
3637
* @author Andy Wilkinson
3738
* @author Weix Sun
39+
* @author Vedran Pavic
3840
*/
3941
@Configuration(proxyBeanMethods = false)
4042
@ConditionalOnClass({ ReactiveRedisConnectionFactory.class, ReactiveRedisSessionRepository.class })
4143
@ConditionalOnMissingBean(ReactiveSessionRepository.class)
4244
@ConditionalOnBean(ReactiveRedisConnectionFactory.class)
4345
@EnableConfigurationProperties(RedisSessionProperties.class)
46+
@Import(RedisWebSessionConfiguration.class)
4447
class RedisReactiveSessionConfiguration {
4548

46-
@Configuration(proxyBeanMethods = false)
47-
static class SpringBootRedisWebSessionConfiguration extends RedisWebSessionConfiguration {
48-
49-
@Autowired
50-
void customize(SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
51-
ServerProperties serverProperties) {
52-
Duration timeout = sessionProperties
53-
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout());
54-
if (timeout != null) {
55-
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
56-
}
57-
setRedisNamespace(redisSessionProperties.getNamespace());
58-
setSaveMode(redisSessionProperties.getSaveMode());
59-
}
60-
49+
@Bean
50+
ReactiveSessionRepositoryCustomizer<ReactiveRedisSessionRepository> springBootSessionRepositoryCustomizer(
51+
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
52+
ServerProperties serverProperties) {
53+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
54+
return (sessionRepository) -> {
55+
map.from(sessionProperties.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
56+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
57+
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
58+
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
59+
};
6160
}
6261

6362
}

0 commit comments

Comments
 (0)