Skip to content

Commit ad87539

Browse files
vpavicwilkinsona
authored andcommitted
Rework Spring Session auto-configuration to use customizers
This commit reworks Spring Session auto-configuration to avoid extending Spring Session's configuration classes. Instead, those configuration classes are now imported and customizations are applied using dedicated (Reactive)SessionRepositoryCustomizer beans. See gh-32554
1 parent a9c1b4a commit ad87539

File tree

8 files changed

+133
-115
lines changed

8 files changed

+133
-115
lines changed

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

Lines changed: 19 additions & 15 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

@@ -47,19 +48,22 @@
4748
class HazelcastSessionConfiguration {
4849

4950
@Configuration(proxyBeanMethods = false)
50-
public static class SpringBootHazelcastHttpSessionConfiguration extends HazelcastHttpSessionConfiguration {
51+
@Import(HazelcastHttpSessionConfiguration.class)
52+
static class SpringBootHazelcastHttpSessionConfiguration {
5153

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());
54+
@Bean
55+
SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> springBootSessionRepositoryCustomizer(
56+
SessionProperties sessionProperties, HazelcastSessionProperties hazelcastSessionProperties,
57+
ServerProperties serverProperties) {
58+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
59+
return (sessionRepository) -> {
60+
map.from(sessionProperties
61+
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
62+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
63+
map.from(hazelcastSessionProperties::getMapName).to(sessionRepository::setSessionMapName);
64+
map.from(hazelcastSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
65+
map.from(hazelcastSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
66+
};
6367
}
6468

6569
}

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

Lines changed: 17 additions & 15 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;
@@ -65,20 +64,23 @@ JdbcSessionDataSourceScriptDatabaseInitializer jdbcSessionDataSourceScriptDataba
6564
}
6665

6766
@Configuration(proxyBeanMethods = false)
68-
static class SpringBootJdbcHttpSessionConfiguration extends JdbcHttpSessionConfiguration {
67+
@Import(JdbcHttpSessionConfiguration.class)
68+
static class SpringBootJdbcHttpSessionConfiguration {
6969

70-
@Autowired
71-
void customize(SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties,
70+
@Bean
71+
SessionRepositoryCustomizer<JdbcIndexedSessionRepository> springBootSessionRepositoryCustomizer(
72+
SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties,
7273
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());
74+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
75+
return (sessionRepository) -> {
76+
map.from(sessionProperties
77+
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
78+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
79+
map.from(jdbcSessionProperties::getTableName).to(sessionRepository::setTableName);
80+
map.from(jdbcSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
81+
map.from(jdbcSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
82+
map.from(jdbcSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
83+
};
8284
}
8385

8486
}

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

Lines changed: 17 additions & 12 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,6 +36,7 @@
3536
*
3637
* @author Andy Wilkinson
3738
* @author Weix Sun
39+
* @author Vedran Pavic
3840
*/
3941
@Configuration(proxyBeanMethods = false)
4042
@ConditionalOnClass({ ReactiveMongoOperations.class, ReactiveMongoSessionRepository.class })
@@ -44,17 +46,20 @@
4446
class MongoReactiveSessionConfiguration {
4547

4648
@Configuration(proxyBeanMethods = false)
47-
static class SpringBootReactiveMongoWebSessionConfiguration extends ReactiveMongoWebSessionConfiguration {
49+
@Import(ReactiveMongoWebSessionConfiguration.class)
50+
static class SpringBootMongoWebSessionConfiguration {
4851

49-
@Autowired
50-
void customize(SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
52+
@Bean
53+
ReactiveSessionRepositoryCustomizer<ReactiveMongoSessionRepository> springBootSessionRepositoryCustomizer(
54+
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
5155
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());
56+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
57+
return (sessionRepository) -> {
58+
map.from(sessionProperties
59+
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
60+
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
61+
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
62+
};
5863
}
5964

6065
}

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

Lines changed: 17 additions & 12 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,6 +36,7 @@
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 })
@@ -44,17 +46,20 @@
4446
class MongoSessionConfiguration {
4547

4648
@Configuration(proxyBeanMethods = false)
47-
public static class SpringBootMongoHttpSessionConfiguration extends MongoHttpSessionConfiguration {
49+
@Import(MongoHttpSessionConfiguration.class)
50+
static class SpringBootMongoHttpSessionConfiguration {
4851

49-
@Autowired
50-
public void customize(SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
52+
@Bean
53+
SessionRepositoryCustomizer<MongoIndexedSessionRepository> springBootSessionRepositoryCustomizer(
54+
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
5155
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());
56+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
57+
return (sessionRepository) -> {
58+
map.from(sessionProperties
59+
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
60+
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
61+
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
62+
};
5863
}
5964

6065
}

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

Lines changed: 18 additions & 13 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,6 +36,7 @@
3536
*
3637
* @author Andy Wilkinson
3738
* @author Weix Sun
39+
* @author Vedran Pavic
3840
*/
3941
@Configuration(proxyBeanMethods = false)
4042
@ConditionalOnClass({ ReactiveRedisConnectionFactory.class, ReactiveRedisSessionRepository.class })
@@ -44,18 +46,21 @@
4446
class RedisReactiveSessionConfiguration {
4547

4648
@Configuration(proxyBeanMethods = false)
47-
static class SpringBootRedisWebSessionConfiguration extends RedisWebSessionConfiguration {
49+
@Import(RedisWebSessionConfiguration.class)
50+
static class SpringBootRedisWebSessionConfiguration {
4851

49-
@Autowired
50-
void customize(SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
52+
@Bean
53+
ReactiveSessionRepositoryCustomizer<ReactiveRedisSessionRepository> springBootSessionRepositoryCustomizer(
54+
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
5155
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());
56+
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
57+
return (sessionRepository) -> {
58+
map.from(sessionProperties
59+
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
60+
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
61+
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
62+
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
63+
};
5964
}
6065

6166
}

0 commit comments

Comments
 (0)