This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-3719
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit d87c804c4b1d864702314d068466d1ca834f8fec
Author: danhaywood <[email protected]>
AuthorDate: Tue Apr 9 11:53:18 2024 +0200

    CAUSEWAY-3719: adds AutoConfiguration for all value semantics
---
 .../metamodel/CausewayModuleCoreMetamodel.java     | 74 +++++++++++-----------
 .../ApplicationFeatureIdValueSemantics.java        | 15 ++++-
 .../valuesemantics/BigDecimalValueSemantics.java   | 14 +++-
 .../valuesemantics/BigIntegerValueSemantics.java   | 15 ++++-
 .../valuesemantics/BookmarkValueSemantics.java     | 14 +++-
 .../valuesemantics/BooleanValueSemantics.java      | 16 ++++-
 .../BufferedImageValueSemantics.java               | 14 +++-
 .../valuesemantics/ByteValueSemantics.java         | 14 +++-
 .../valuesemantics/ChangesDtoValueSemantics.java   | 14 +++-
 .../valuesemantics/CharacterValueSemantics.java    | 16 ++++-
 .../valuesemantics/ClobValueSemantics.java         | 15 ++++-
 .../valuesemantics/CommandDtoValueSemantics.java   | 14 +++-
 .../valuesemantics/DoubleValueSemantics.java       | 14 +++-
 .../valuesemantics/EnumValueSemanticsAbstract.java |  4 ++
 .../valuesemantics/FloatValueSemantics.java        | 14 +++-
 .../IdStringifierForSerializable.java              |  3 +
 .../valuesemantics/IntValueSemantics.java          | 14 +++-
 .../InteractionDtoValueSemantics.java              | 14 +++-
 .../LocalResourcePathValueSemantics.java           | 14 +++-
 .../valuesemantics/LocaleValueSemantics.java       | 14 +++-
 .../valuesemantics/LongValueSemantics.java         | 14 +++-
 .../valuesemantics/MarkupValueSemantics.java       | 14 +++-
 .../valuesemantics/OidDtoValueSemantics.java       | 14 +++-
 .../valuesemantics/PasswordValueSemantics.java     | 14 +++-
 .../valuesemantics/ShortValueSemantics.java        | 15 ++++-
 .../valuesemantics/StringValueSemantics.java       | 14 +++-
 .../valuesemantics/TreeNodeValueSemantics.java     | 14 +++-
 .../valuesemantics/TreePathValueSemantics.java     | 20 ++++--
 .../valuesemantics/URLValueSemantics.java          | 15 ++++-
 .../valuesemantics/UUIDValueSemantics.java         | 14 +++-
 .../valuesemantics/XmlValueSemanticsAbstract.java  | 14 ++++
 .../temporal/LocalDateTimeValueSemantics.java      | 15 ++++-
 .../temporal/LocalDateValueSemantics.java          | 14 +++-
 .../temporal/LocalTimeValueSemantics.java          | 14 +++-
 .../temporal/OffsetDateTimeValueSemantics.java     | 14 +++-
 .../temporal/OffsetTimeValueSemantics.java         | 14 +++-
 .../temporal/ZonedDateTimeValueSemantics.java      | 14 +++-
 .../temporal/legacy/JavaSqlDateValueSemantics.java | 16 ++++-
 .../legacy/JavaSqlTimeStampValueSemantics.java     | 14 +++-
 .../temporal/legacy/JavaSqlTimeValueSemantics.java | 16 ++++-
 .../legacy/JavaUtilDateValueSemantics.java         | 14 +++-
 .../commandlog/jpa/dom/CommandLogEntryPK.java      | 17 ++++-
 .../executionlog/jdo/dom/ExecutionLogEntryPK.java  | 17 ++++-
 .../executionlog/jpa/dom/ExecutionLogEntryPK.java  | 17 ++++-
 .../jdo/dom/ExecutionOutboxEntryPK.java            | 17 ++++-
 .../jpa/dom/ExecutionOutboxEntryPK.java            | 17 ++++-
 .../sessionlog/jpa/dom/SessionLogEntryPK.java      | 17 ++++-
 .../applib/value/CalendarEventSemantics.java       | 25 ++++++--
 .../CausewayModulePersistenceJdoDatanucleus.java   | 36 +++++------
 .../valuetypes/DnByteIdValueSemantics.java         | 17 ++++-
 .../valuetypes/DnCharIdValueSemantics.java         | 16 ++++-
 .../DnDatastoreIdImplValueSemantics.java           | 16 ++++-
 .../DnDatastoreUniqueLongIdValueSemantics.java     | 17 ++++-
 .../valuetypes/DnIntIdValueSemantics.java          | 16 ++++-
 .../valuetypes/DnLongIdValueSemantics.java         | 16 ++++-
 .../valuetypes/DnObjectIdValueSemantics.java       | 16 ++++-
 .../valuetypes/DnScoidValueSemantics.java          | 17 ++++-
 .../valuetypes/DnShortIdValueSemantics.java        | 17 ++++-
 .../valuetypes/DnStringIdValueSemantics.java       | 17 ++++-
 .../valuetypes/JdoByteIdentityValueSemantics.java  | 17 ++++-
 .../valuetypes/JdoCharIdentityValueSemantics.java  | 17 ++++-
 .../valuetypes/JdoDatastoreIdValueSemantics.java   | 17 ++++-
 .../valuetypes/JdoIntIdentityValueSemantics.java   | 17 ++++-
 .../valuetypes/JdoLongIdentityValueSemantics.java  | 17 ++++-
 .../JdoObjectIdentityValueSemantics.java           | 17 ++++-
 .../valuetypes/JdoShortIdentityValueSemantics.java | 17 ++++-
 .../JdoStringIdentityValueSemantics.java           | 17 ++++-
 .../metamodel/src/main/java/module-info.java       |  1 +
 .../CausewayModuleValAsciidocMetaModel.java        |  2 +-
 .../semantics/AsciiDocValueSemantics.java          | 15 ++++-
 .../integration/src/main/java/module-info.java     |  1 +
 .../CausewayModuleValJodatimeIntegration.java      |  8 +--
 .../valuesemantics/JodaDateTimeValueSemantics.java | 16 ++++-
 .../JodaLocalDateTimeValueSemantics.java           | 14 +++-
 .../JodaLocalDateValueSemantics.java               | 16 ++++-
 .../JodaLocalTimeValueSemantics.java               | 16 ++++-
 .../metamodel/src/main/java/module-info.java       |  1 +
 .../CausewayModuleValMarkdownMetaModel.java        |  2 +-
 .../semantics/MarkdownValueSemantics.java          | 15 ++++-
 .../vega/metamodel/src/main/java/module-info.java  |  1 +
 .../metamodel/CausewayModuleValVegaMetaModel.java  |  2 +-
 .../metamodel/semantics/VegaValueSemantics.java    | 16 +++++
 82 files changed, 1074 insertions(+), 149 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
index b9e2e59397..bd6c9ad3c8 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
@@ -135,47 +135,47 @@ import lombok.NonNull;
         ValueSemanticsResolverDefault.class,
 
         // Value Semantics (built-in defaults)
-        BooleanValueSemantics.class,
-        ByteValueSemantics.class,
-        ShortValueSemantics.class,
-        IntValueSemantics.class,
-        LongValueSemantics.class,
-        DoubleValueSemantics.class,
-        FloatValueSemantics.class,
-        BigDecimalValueSemantics.class,
-        BigIntegerValueSemantics.class,
-        CharacterValueSemantics.class,
-        StringValueSemantics.class,
-        PasswordValueSemantics.class,
-        BufferedImageValueSemantics.class,
+        BooleanValueSemantics.AutoConfiguration.class,
+        ByteValueSemantics.AutoConfiguration.class,
+        ShortValueSemantics.AutoConfiguration.class,
+        IntValueSemantics.AutoConfiguration.class,
+        LongValueSemantics.AutoConfiguration.class,
+        DoubleValueSemantics.AutoConfiguration.class,
+        FloatValueSemantics.AutoConfiguration.class,
+        BigDecimalValueSemantics.AutoConfiguration.class,
+        BigIntegerValueSemantics.AutoConfiguration.class,
+        CharacterValueSemantics.AutoConfiguration.class,
+        StringValueSemantics.AutoConfiguration.class,
+        PasswordValueSemantics.AutoConfiguration.class,
+        BufferedImageValueSemantics.AutoConfiguration.class,
         BlobValueSemantics.AutoConfiguration.class,
-        ClobValueSemantics.class,
-        MarkupValueSemantics.class,
-        URLValueSemantics.class,
-        LocalResourcePathValueSemantics.class,
-        BookmarkValueSemantics.class,
-        OidDtoValueSemantics.class,
-        UUIDValueSemantics.class,
-        LocaleValueSemantics.class,
-        TreePathValueSemantics.class,
-        TreeNodeValueSemantics.class,
-        ChangesDtoValueSemantics.class,
-        CommandDtoValueSemantics.class,
-        InteractionDtoValueSemantics.class,
+        ClobValueSemantics.AutoConfiguration.class,
+        MarkupValueSemantics.AutoConfiguration.class,
+        URLValueSemantics.AutoConfiguration.class,
+        LocalResourcePathValueSemantics.AutoConfiguration.class,
+        BookmarkValueSemantics.AutoConfiguration.class,
+        OidDtoValueSemantics.AutoConfiguration.class,
+        UUIDValueSemantics.AutoConfiguration.class,
+        LocaleValueSemantics.AutoConfiguration.class,
+        TreePathValueSemantics.AutoConfiguration.class,
+        TreeNodeValueSemantics.AutoConfiguration.class,
+        ChangesDtoValueSemantics.AutoConfiguration.class,
+        CommandDtoValueSemantics.AutoConfiguration.class,
+        InteractionDtoValueSemantics.AutoConfiguration.class,
         // Value Semantics (temporal)
-        LocalDateTimeValueSemantics.class,
-        LocalDateValueSemantics.class,
-        LocalTimeValueSemantics.class,
-        OffsetDateTimeValueSemantics.class,
-        OffsetTimeValueSemantics.class,
-        ZonedDateTimeValueSemantics.class,
+        LocalDateTimeValueSemantics.AutoConfiguration.class,
+        LocalDateValueSemantics.AutoConfiguration.class,
+        LocalTimeValueSemantics.AutoConfiguration.class,
+        OffsetDateTimeValueSemantics.AutoConfiguration.class,
+        OffsetTimeValueSemantics.AutoConfiguration.class,
+        ZonedDateTimeValueSemantics.AutoConfiguration.class,
         // Value Semantics (temporal legacy)
-        JavaSqlDateValueSemantics.class,
-        JavaSqlTimeValueSemantics.class,
-        JavaSqlTimeStampValueSemantics.class,
-        JavaUtilDateValueSemantics.class,
+        JavaSqlDateValueSemantics.AutoConfiguration.class,
+        JavaSqlTimeValueSemantics.AutoConfiguration.class,
+        JavaSqlTimeStampValueSemantics.AutoConfiguration.class,
+        JavaUtilDateValueSemantics.AutoConfiguration.class,
         // Value Semantics (meta-model)
-        ApplicationFeatureIdValueSemantics.class,
+        ApplicationFeatureIdValueSemantics.AutoConfiguration.class,
         // fallback IdStringifier
         IdStringifierForSerializable.class,
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ApplicationFeatureIdValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ApplicationFeatureIdValueSemantics.java
index 0ace27a19f..c3785ba963 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ApplicationFeatureIdValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ApplicationFeatureIdValueSemantics.java
@@ -21,7 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.appfeat.ApplicationFeatureId;
@@ -36,7 +38,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.ApplicationFeatureIdValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class ApplicationFeatureIdValueSemantics
@@ -45,6 +46,16 @@ implements
     Parser<ApplicationFeatureId>,
     Renderer<ApplicationFeatureId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ApplicationFeatureIdValueSemantics.class)
+        public ApplicationFeatureIdValueSemantics 
defaultApplicationFeatureIdValueSemantics() {
+            return new ApplicationFeatureIdValueSemantics();
+        }
+    }
+
     @Override
     public Class<ApplicationFeatureId> getCorrespondingClass() {
         return ApplicationFeatureId.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
index 0df8eade1e..34c2457996 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
@@ -28,6 +28,9 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -49,7 +52,6 @@ import lombok.NonNull;
 import lombok.Setter;
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.BigDecimalValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class BigDecimalValueSemantics
@@ -60,6 +62,16 @@ implements
     Renderer<BigDecimal>,
     IdStringifier.EntityAgnostic<BigDecimal> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(BigDecimalValueSemantics.class)
+        public BigDecimalValueSemantics defaultBigDecimalValueSemantics() {
+            return new BigDecimalValueSemantics();
+        }
+    }
+
     @Setter @Inject
     private SpecificationLoader specificationLoader;
     @Setter @Inject
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
index bbea83b61b..16998f8d7d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
@@ -24,7 +24,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.bookmark.IdStringifier;
@@ -39,7 +41,6 @@ import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 
 import lombok.NonNull;
 
-@Component
 @Named("causeway.metamodel.value.BigIntegerValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class BigIntegerValueSemantics
@@ -50,6 +51,16 @@ implements
     Renderer<BigInteger>,
     IdStringifier.EntityAgnostic<BigInteger> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(BigIntegerValueSemantics.class)
+        public BigIntegerValueSemantics defaultBigIntegerValueSemantics() {
+            return new BigIntegerValueSemantics();
+        }
+    }
+
     @Override
     public Class<BigInteger> getCorrespondingClass() {
         return BigInteger.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BookmarkValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BookmarkValueSemantics.java
index c550f0e835..49716ea9fb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BookmarkValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BookmarkValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -37,7 +40,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.BookmarkValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class BookmarkValueSemantics
@@ -47,6 +49,16 @@ implements
     Parser<Bookmark>,
     Renderer<Bookmark> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(BookmarkValueSemantics.class)
+        public BookmarkValueSemantics defaultBookmarkValueSemantics() {
+            return new BookmarkValueSemantics();
+        }
+    }
+
     @Override
     public Class<Bookmark> getCorrespondingClass() {
         return Bookmark.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BooleanValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BooleanValueSemantics.java
index edc8aac0d3..319d00c3ed 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BooleanValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BooleanValueSemantics.java
@@ -23,7 +23,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import 
org.apache.causeway.applib.exceptions.recoverable.TextEntryParseException;
@@ -43,7 +45,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.BooleanValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class BooleanValueSemantics
@@ -53,6 +54,17 @@ implements
     Parser<Boolean>,
     Renderer<Boolean> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(BooleanValueSemantics.class)
+        public BooleanValueSemantics defaultBooleanValueSemantics() {
+            return new BooleanValueSemantics();
+        }
+    }
+
+
     @Override
     public Class<Boolean> getCorrespondingClass() {
         return Boolean.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
index 7bdfc017c2..897bbdcb97 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -41,7 +44,6 @@ import org.apache.causeway.schema.common.v2.BlobDto;
 import org.apache.causeway.schema.common.v2.ValueType;
 import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 
-@Component
 @Named("causeway.metamodel.value.BufferedImageValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class BufferedImageValueSemantics
@@ -50,6 +52,16 @@ implements
     ImageValueSemantics,
     OrderRelation<BufferedImage, Void> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(BufferedImageValueSemantics.class)
+        public BufferedImageValueSemantics 
defaultBufferedImageValueSemantics() {
+            return new BufferedImageValueSemantics();
+        }
+    }
+
     @Override
     public Class<BufferedImage> getCorrespondingClass() {
         return BufferedImage.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ByteValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ByteValueSemantics.java
index 40f9b4346b..138f9d82af 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ByteValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ByteValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -45,7 +48,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.ByteValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class ByteValueSemantics
@@ -56,6 +58,16 @@ implements
     Renderer<Byte>,
     IdStringifier.EntityAgnostic<Byte> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ByteValueSemantics.class)
+        public ByteValueSemantics defaultByteValueSemantics() {
+            return new ByteValueSemantics();
+        }
+    }
+
     @Override
     public Class<Byte> getCorrespondingClass() {
         return Byte.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
index 85cfa4c38b..46cce91a6d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -28,12 +31,21 @@ import 
org.apache.causeway.applib.util.schema.ChangesDtoUtils;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.schema.chg.v2.ChangesDto;
 
-@Component
 @Named("causeway.metamodel.value.ChangesDtoValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class ChangesDtoValueSemantics
 extends XmlValueSemanticsAbstract<ChangesDto> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ChangesDtoValueSemantics.class)
+        public ChangesDtoValueSemantics defaultChangesDtoValueSemantics() {
+            return new ChangesDtoValueSemantics();
+        }
+    }
+
     @Override
     public final Class<ChangesDto> getCorrespondingClass() {
         return ChangesDto.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CharacterValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CharacterValueSemantics.java
index f2be09b592..5fcadb3793 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CharacterValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CharacterValueSemantics.java
@@ -26,7 +26,9 @@ import java.util.stream.Collectors;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.exceptions.recoverable.InvalidEntryException;
@@ -47,7 +49,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.CharacterValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class CharacterValueSemantics
@@ -58,6 +59,17 @@ implements
     Renderer<Character>,
     IdStringifier.EntityAgnostic<Character> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(CharacterValueSemantics.class)
+        public CharacterValueSemantics defaultCharacterValueSemantics() {
+            return new CharacterValueSemantics();
+        }
+    }
+
+
     @Override
     public Class<Character> getCorrespondingClass() {
         return Character.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ClobValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ClobValueSemantics.java
index 5dc3795146..3b9c5c59db 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ClobValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ClobValueSemantics.java
@@ -23,7 +23,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.util.schema.CommonDtoUtils;
@@ -36,7 +38,6 @@ import 
org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.ClobValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class ClobValueSemantics
@@ -44,6 +45,16 @@ extends ValueSemanticsAbstract<Clob>
 implements
     Renderer<Clob> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ClobValueSemantics.class)
+        public ClobValueSemantics defaultClobValueSemantics() {
+            return new ClobValueSemantics();
+        }
+    }
+
     @Override
     public Class<Clob> getCorrespondingClass() {
         return Clob.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
index b16d69e391..ea9c9949eb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -28,12 +31,21 @@ import 
org.apache.causeway.applib.util.schema.CommandDtoUtils;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.schema.cmd.v2.CommandDto;
 
-@Component
 @Named("causeway.metamodel.value.CommandDtoValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class CommandDtoValueSemantics
 extends XmlValueSemanticsAbstract<CommandDto> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(CommandDtoValueSemantics.class)
+        public CommandDtoValueSemantics defaultCommandDtoValueSemantics() {
+            return new CommandDtoValueSemantics();
+        }
+    }
+
     @Override
     public final Class<CommandDto> getCorrespondingClass() {
         return CommandDto.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/DoubleValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/DoubleValueSemantics.java
index 97253eafd7..7b7f2f7a18 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/DoubleValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/DoubleValueSemantics.java
@@ -23,6 +23,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -39,7 +42,6 @@ import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.DoubleValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class DoubleValueSemantics
@@ -49,6 +51,16 @@ implements
     Parser<Double>,
     Renderer<Double> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DoubleValueSemantics.class)
+        public DoubleValueSemantics defaultDoubleValueSemantics() {
+            return new DoubleValueSemantics();
+        }
+    }
+
     @Override
     public Class<Double> getCorrespondingClass() {
         return Double.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
index 0bec4adf8c..fe759e3b58 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
@@ -48,6 +48,10 @@ import org.apache.causeway.schema.common.v2.EnumDto;
 import org.apache.causeway.schema.common.v2.ValueType;
 import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
 import lombok.Getter;
 import lombok.val;
 import lombok.experimental.Accessors;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/FloatValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/FloatValueSemantics.java
index 93b44fdf04..93ad247e79 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/FloatValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/FloatValueSemantics.java
@@ -23,6 +23,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -39,7 +42,6 @@ import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.FloatValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class FloatValueSemantics
@@ -49,6 +51,16 @@ implements
     Parser<Float>,
     Renderer<Float> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(FloatValueSemantics.class)
+        public FloatValueSemantics defaultFloatValueSemantics() {
+            return new FloatValueSemantics();
+        }
+    }
+
     @Override
     public Class<Float> getCorrespondingClass() {
         return Float.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IdStringifierForSerializable.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IdStringifierForSerializable.java
index dafa7a82f8..55809f3057 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IdStringifierForSerializable.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IdStringifierForSerializable.java
@@ -24,6 +24,9 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IntValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IntValueSemantics.java
index 0b1edc0dce..f3eed4933e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IntValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/IntValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -45,7 +48,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.IntValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class IntValueSemantics
@@ -56,6 +58,16 @@ implements
     Renderer<Integer>,
     IdStringifier.EntityAgnostic<Integer>{
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(IntValueSemantics.class)
+        public IntValueSemantics defaultIntValueSemantics() {
+            return new IntValueSemantics();
+        }
+    }
+
     @Override
     public Class<Integer> getCorrespondingClass() {
         return Integer.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
index e8978b1c63..febee888c9 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -28,12 +31,21 @@ import 
org.apache.causeway.applib.util.schema.InteractionDtoUtils;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.schema.ixn.v2.InteractionDto;
 
-@Component
 @Named("causeway.metamodel.value.InteractionDtoValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class InteractionDtoValueSemantics
 extends XmlValueSemanticsAbstract<InteractionDto> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(InteractionDtoValueSemantics.class)
+        public InteractionDtoValueSemantics 
defaultInteractionDtoValueSemantics() {
+            return new InteractionDtoValueSemantics();
+        }
+    }
+
     @Override
     public final Class<InteractionDto> getCorrespondingClass() {
         return InteractionDto.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
index ac5bb45f24..84458c69b4 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
@@ -23,6 +23,9 @@ import java.nio.file.InvalidPathException;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -37,7 +40,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.LocalResourcePathValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class LocalResourcePathValueSemantics
@@ -46,6 +48,16 @@ implements
     Parser<LocalResourcePath>,
     Renderer<LocalResourcePath> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LocalResourcePathValueSemantics.class)
+        public LocalResourcePathValueSemantics 
defaultLocalResourcePathValueSemantics() {
+            return new LocalResourcePathValueSemantics();
+        }
+    }
+
     @Override
     public Class<LocalResourcePath> getCorrespondingClass() {
         return LocalResourcePath.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocaleValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocaleValueSemantics.java
index bdd33fbd8f..221a46c51a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocaleValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LocaleValueSemantics.java
@@ -23,6 +23,9 @@ import java.util.Locale;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -38,7 +41,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.LocaleValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class LocaleValueSemantics
@@ -47,6 +49,16 @@ implements
     Parser<Locale>,
     Renderer<Locale> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LocaleValueSemantics.class)
+        public LocaleValueSemantics defaultLocaleValueSemantics() {
+            return new LocaleValueSemantics();
+        }
+    }
+
     @Override
     public Class<Locale> getCorrespondingClass() {
         return Locale.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LongValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LongValueSemantics.java
index fcf82e0428..69ca6b9d66 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LongValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/LongValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -45,7 +48,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.LongValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class LongValueSemantics
@@ -56,6 +58,16 @@ implements
     Renderer<Long>,
     IdStringifier.EntityAgnostic<Long>{
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LongValueSemantics.class)
+        public LongValueSemantics defaultLongValueSemantics() {
+            return new LongValueSemantics();
+        }
+    }
+
     @Override
     public Class<Long> getCorrespondingClass() {
         return Long.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/MarkupValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/MarkupValueSemantics.java
index 482387eba5..3690172cca 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/MarkupValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/MarkupValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,7 +37,6 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.hardening._Hardening;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.MarkupValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class MarkupValueSemantics
@@ -43,6 +45,16 @@ implements
     Parser<Markup>,
     Renderer<Markup> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(MarkupValueSemantics.class)
+        public MarkupValueSemantics defaultMarkupValueSemantics() {
+            return new MarkupValueSemantics();
+        }
+    }
+
     @Override
     public Class<Markup> getCorrespondingClass() {
         return Markup.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/OidDtoValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/OidDtoValueSemantics.java
index d57aec6ca5..f5e4d89826 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/OidDtoValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/OidDtoValueSemantics.java
@@ -22,6 +22,9 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -32,7 +35,6 @@ import 
org.apache.causeway.core.metamodel.CausewayModuleCoreMetamodel;
 import org.apache.causeway.core.metamodel.valuetypes.ValueSemanticsAdapter;
 import org.apache.causeway.schema.common.v2.OidDto;
 
-@Component
 @Named(OidDtoValueSemantics.LOGICAL_TYPE_NAME)
 @Priority(PriorityPrecedence.LATE)
 public class OidDtoValueSemantics
@@ -40,6 +42,16 @@ extends ValueSemanticsAdapter<OidDto, Bookmark, Void> {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleCoreMetamodel.NAMESPACE_VALUE + ".OidDtoValueSemantics";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(OidDtoValueSemantics.class)
+        public OidDtoValueSemantics defaultOidDtoValueSemantics() {
+            return new OidDtoValueSemantics();
+        }
+    }
+
     @Inject BookmarkValueSemantics bookmarkValueSemantics;
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/PasswordValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/PasswordValueSemantics.java
index bb34371e79..47837df7c2 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/PasswordValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/PasswordValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -35,7 +38,6 @@ import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.schema.common.v2.ValueType;
 import org.apache.causeway.schema.common.v2.ValueWithTypeDto;
 
-@Component
 @Named("causeway.metamodel.value.PasswordValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class PasswordValueSemantics
@@ -44,6 +46,16 @@ implements
     Parser<Password>,
     Renderer<Password> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(PasswordValueSemantics.class)
+        public PasswordValueSemantics defaultPasswordValueSemantics() {
+            return new PasswordValueSemantics();
+        }
+    }
+
     @Override
     public Class<Password> getCorrespondingClass() {
         return Password.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ShortValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ShortValueSemantics.java
index b29f4d641d..4918245b9f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ShortValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/ShortValueSemantics.java
@@ -24,7 +24,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import 
org.apache.causeway.applib.exceptions.recoverable.TextEntryParseException;
@@ -45,7 +47,6 @@ import lombok.val;
 /**
  * due to auto-boxing also handles the primitive variant
  */
-@Component
 @Named("causeway.metamodel.value.ShortValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class ShortValueSemantics
@@ -56,6 +57,16 @@ implements
     Renderer<Short>,
     IdStringifier.EntityAgnostic<Short> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ShortValueSemantics.class)
+        public ShortValueSemantics defaultShortValueSemantics() {
+            return new ShortValueSemantics();
+        }
+    }
+
     @Override
     public Class<Short> getCorrespondingClass() {
         return Short.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/StringValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/StringValueSemantics.java
index e2d1afe459..f1ac62b7ec 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/StringValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/StringValueSemantics.java
@@ -25,6 +25,9 @@ import java.util.function.UnaryOperator;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -39,7 +42,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.NonNull;
 
-@Component
 @Named("causeway.metamodel.value.StringValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class StringValueSemantics
@@ -49,6 +51,16 @@ implements
     Renderer<String>,
     IdStringifier.EntityAgnostic<String> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(StringValueSemantics.class)
+        public StringValueSemantics defaultStringValueSemantics() {
+            return new StringValueSemantics();
+        }
+    }
+
     @Override
     public Class<String> getCorrespondingClass() {
         return String.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
index 1dff074f2d..878765daf5 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
@@ -24,6 +24,9 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -43,7 +46,6 @@ import 
org.apache.causeway.commons.internal.memento._Mementos.Memento;
 import 
org.apache.causeway.commons.internal.memento._Mementos.SerializingAdapter;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.TreeNodeValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class TreeNodeValueSemantics
@@ -51,6 +53,16 @@ extends ValueSemanticsAbstract<TreeNode<?>>
 implements
     Renderer<TreeNode<?>> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(TreeNodeValueSemantics.class)
+        public TreeNodeValueSemantics defaultTreeNodeValueSemantics() {
+            return new TreeNodeValueSemantics();
+        }
+    }
+
     @Inject UrlEncodingService urlEncodingService;
     @Inject SerializingAdapter serializingAdapter;
     @Inject FactoryService factoryService;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreePathValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreePathValueSemantics.java
index a9ae584914..31b1f1e3eb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreePathValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/TreePathValueSemantics.java
@@ -21,6 +21,9 @@ package org.apache.causeway.core.metamodel.valuesemantics;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -39,7 +42,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.TreePathValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class TreePathValueSemantics
@@ -49,6 +51,16 @@ implements
     Renderer<TreePath>,
     IdStringifier.EntityAgnostic<TreePath> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(TreePathValueSemantics.class)
+        public TreePathValueSemantics defaultCharacterValueSemantics() {
+            return new TreePathValueSemantics();
+        }
+    }
+
     @Override
     public Class<TreePath> getCorrespondingClass() {
         return TreePath.class;
@@ -121,17 +133,17 @@ implements
     }
 
     // -- HELPER
-    
+
     private static String canonicalStringify(@Nullable TreePath treePath) {
         return treePath!=null
                 ? treePath.stringify("/")
                 : null;
     }
-    
+
     private static TreePath canonicalDestringify(@Nullable String input) {
         return input!=null
                 ? TreePath.parse(input, "/")
                 : null;
     }
-    
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
index ac3e2f2965..f5ec8a5dab 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java
@@ -23,7 +23,9 @@ import java.net.URL;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.value.semantics.Parser;
@@ -38,7 +40,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 
 import lombok.SneakyThrows;
 
-@Component
 @Named("causeway.metamodel.value.URLValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class URLValueSemantics
@@ -47,6 +48,16 @@ implements
     Parser<java.net.URL>,
     Renderer<java.net.URL> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(URLValueSemantics.class)
+        public URLValueSemantics defaultUrlValueSemantics() {
+            return new URLValueSemantics();
+        }
+    }
+
     @Override
     public Class<java.net.URL> getCorrespondingClass() {
         return java.net.URL.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/UUIDValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/UUIDValueSemantics.java
index a3854cc896..dafb961e88 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/UUIDValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/UUIDValueSemantics.java
@@ -23,6 +23,9 @@ import java.util.UUID;
 import javax.annotation.Priority;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -39,7 +42,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Named("causeway.metamodel.value.UUIDValueSemantics")
 @Priority(PriorityPrecedence.LATE)
 public class UUIDValueSemantics
@@ -49,6 +51,16 @@ implements
     Renderer<UUID>,
     IdStringifier.EntityAgnostic<UUID> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(UUIDValueSemantics.class)
+        public UUIDValueSemantics defaultUUIDValueSemantics() {
+            return new UUIDValueSemantics();
+        }
+    }
+
     @Override
     public Class<UUID> getCorrespondingClass() {
         return UUID.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/XmlValueSemanticsAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/XmlValueSemanticsAbstract.java
index 5c16f7beeb..b3859f3c7f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/XmlValueSemanticsAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/XmlValueSemanticsAbstract.java
@@ -26,6 +26,10 @@ import 
org.apache.causeway.applib.value.semantics.ValueDecomposition;
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.causeway.schema.common.v2.ValueType;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
 import lombok.NonNull;
 import lombok.val;
 
@@ -35,6 +39,16 @@ implements
     OrderRelation<T, Void>,
     Renderer<T> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(CharacterValueSemantics.class)
+        public CharacterValueSemantics defaultCharacterValueSemantics() {
+            return new CharacterValueSemantics();
+        }
+    }
+
     @Override
     public final ValueType getSchemaValueType() {
         return ValueType.STRING;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
index 995f146977..67b4c09ea0 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
@@ -24,15 +24,16 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
-import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.OrderRelation;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.LocalDateTimeValueSemantics")
 //@Log4j2
 public class LocalDateTimeValueSemantics
@@ -42,6 +43,16 @@ implements OrderRelation<LocalDateTime, Duration> {
     public static final int MAX_LENGTH = 36;
     public static final int TYPICAL_LENGTH = 22;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LocalDateTimeValueSemantics.class)
+        public LocalDateTimeValueSemantics 
defaultLocalDateTimeValueSemantics() {
+            return new LocalDateTimeValueSemantics();
+        }
+    }
+
     @Override
     public Class<LocalDateTime> getCorrespondingClass() {
         return LocalDateTime.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
index f2d8051159..ca1dea2173 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -32,7 +35,6 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.LocalDateValueSemantics")
 //@Log4j2
 public class LocalDateValueSemantics
@@ -42,6 +44,16 @@ implements OrderRelation<LocalDate, Duration> {
     public static final int MAX_LENGTH = 12;
     public static final int TYPICAL_LENGTH = MAX_LENGTH;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LocalDateValueSemantics.class)
+        public LocalDateValueSemantics defaultLocalDateValueSemantics() {
+            return new LocalDateValueSemantics();
+        }
+    }
+
     @Override
     public Class<LocalDate> getCorrespondingClass() {
         return LocalDate.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
index ca1b7d3728..93a081a9cb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -31,7 +34,6 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.LocalTimeValueSemantics")
 //@Log4j2
 public class LocalTimeValueSemantics
@@ -40,6 +42,16 @@ extends TemporalValueSemanticsProvider<LocalTime> {
     public static final int MAX_LENGTH = 12;
     public static final int TYPICAL_LENGTH = MAX_LENGTH;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(LocalTimeValueSemantics.class)
+        public LocalTimeValueSemantics defaultLocalTimeValueSemantics() {
+            return new LocalTimeValueSemantics();
+        }
+    }
+
     @Override
     public Class<LocalTime> getCorrespondingClass() {
         return LocalTime.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
index cf4e83d689..5d8d84461a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -32,7 +35,6 @@ import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.OffsetDateTimeValueSemantics")
 //@Log4j2
 public class OffsetDateTimeValueSemantics
@@ -41,6 +43,16 @@ extends TemporalValueSemanticsProvider<OffsetDateTime> {
     public static final int MAX_LENGTH = 36;
     public static final int TYPICAL_LENGTH = 22;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(OffsetDateTimeValueSemantics.class)
+        public OffsetDateTimeValueSemantics 
defaultOffsetDateTimeValueSemantics() {
+            return new OffsetDateTimeValueSemantics();
+        }
+    }
+
     @Override
     public Class<OffsetDateTime> getCorrespondingClass() {
         return OffsetDateTime.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
index 0b4593fe72..049a4634e7 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -32,7 +35,6 @@ import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.OffsetTimeValueSemantics")
 //@Log4j2
 public class OffsetTimeValueSemantics
@@ -41,6 +43,16 @@ extends TemporalValueSemanticsProvider<OffsetTime> {
     public static final int MAX_LENGTH = 12;
     public static final int TYPICAL_LENGTH = MAX_LENGTH;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(OffsetTimeValueSemantics.class)
+        public OffsetTimeValueSemantics defaultOffsetTimeValueSemantics() {
+            return new OffsetTimeValueSemantics();
+        }
+    }
+
     @Override
     public Class<OffsetTime> getCorrespondingClass() {
         return OffsetTime.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
index fdbd616400..8614ac1409 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
@@ -24,6 +24,9 @@ import java.util.Optional;
 
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
@@ -32,7 +35,6 @@ import org.apache.causeway.commons.functional.Either;
 import org.apache.causeway.commons.internal.base._Temporals;
 import org.apache.causeway.schema.common.v2.ValueType;
 
-@Component
 @Named("causeway.metamodel.value.ZonedDateTimeValueSemantics")
 //@Log4j2
 public class ZonedDateTimeValueSemantics
@@ -41,6 +43,16 @@ extends TemporalValueSemanticsProvider<ZonedDateTime> {
     public static final int MAX_LENGTH = 36;
     public static final int TYPICAL_LENGTH = 22;
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(ZonedDateTimeValueSemantics.class)
+        public ZonedDateTimeValueSemantics 
defaultZonedDateTimeValueSemantics() {
+            return new ZonedDateTimeValueSemantics();
+        }
+    }
+
     @Override
     public Class<ZonedDateTime> getCorrespondingClass() {
         return ZonedDateTime.class;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
index 7e391b64ad..4f722b93e1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
@@ -24,6 +24,11 @@ import java.time.LocalDate;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -37,11 +42,20 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
  * @see JavaUtilDateValueSemantics
  * @see JavaSqlTimeValueSemantics
  */
-@Component
 @Named("causeway.metamodel.value.JavaSqlDateValueSemantics")
 public class JavaSqlDateValueSemantics
 extends TemporalSemanticsAdapter<Date, LocalDate> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JavaSqlDateValueSemantics.class)
+        public JavaSqlDateValueSemantics defaultJavaSqlDateValueSemantics() {
+            return new JavaSqlDateValueSemantics();
+        }
+    }
+
     @Inject LocalDateValueSemantics localDateValueSemantics;
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
index bad63ca76f..c55f53ef1d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
@@ -24,6 +24,9 @@ import java.time.LocalDateTime;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -31,11 +34,20 @@ import org.apache.causeway.commons.collections.Can;
 import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 
-@Component
 @Named("causeway.metamodel.value.JavaSqlTimeStampValueSemantics")
 public class JavaSqlTimeStampValueSemantics
 extends TemporalSemanticsAdapter<Timestamp, LocalDateTime> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JavaSqlTimeStampValueSemantics.class)
+        public JavaSqlTimeStampValueSemantics 
defaultJavaSqlTimeStampValueSemantics() {
+            return new JavaSqlTimeStampValueSemantics();
+        }
+    }
+
     @Inject LocalDateTimeValueSemantics localDateTimeValueSemantics;
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
index b156ad2df8..b6764fcb9e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
@@ -24,6 +24,11 @@ import java.time.LocalTime;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -35,11 +40,20 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
  * Treats {@link java.sql.Time} as a time-only value type.
  *
  */
-@Component
 @Named("causeway.metamodel.value.JavaSqlTimeValueSemantics")
 public class JavaSqlTimeValueSemantics
 extends TemporalSemanticsAdapter<Time, LocalTime>  {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JavaSqlTimeValueSemantics.class)
+        public JavaSqlTimeValueSemantics defaultJavaSqlTimeValueSemantics() {
+            return new JavaSqlTimeValueSemantics();
+        }
+    }
+
     @Inject LocalTimeValueSemantics localTimeValueSemantics;
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
index dce7b4e182..a692d568c6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
@@ -25,6 +25,9 @@ import java.util.Date;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -39,11 +42,20 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
  * @see JavaSqlDateValueSemantics
  * @see JavaSqlTimeValueSemantics
  */
-@Component
 @Named("causeway.metamodel.value.JavaUtilDateValueSemantics")
 public class JavaUtilDateValueSemantics
 extends TemporalSemanticsAdapter<java.util.Date, LocalDateTime>  {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JavaUtilDateValueSemantics.class)
+        public JavaUtilDateValueSemantics defaultJavaUtilDateValueSemantics() {
+            return new JavaUtilDateValueSemantics();
+        }
+    }
+
     @Inject LocalDateTimeValueSemantics localDateTimeValueSemantics;
 
     @Override
diff --git 
a/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
 
b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
index 4c9525f36f..a0171e10f2 100644
--- 
a/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
+++ 
b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
@@ -27,6 +27,11 @@ import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Embeddable;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -62,11 +67,21 @@ public class CommandLogEntryPK implements Serializable {
         return interactionId != null ? interactionId.toString() : null;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<CommandLogEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultCommandLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(CommandLogEntryPK.class);
         }
diff --git 
a/extensions/core/executionlog/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionlog/jdo/dom/ExecutionLogEntryPK.java
 
b/extensions/core/executionlog/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionlog/jdo/dom/ExecutionLogEntryPK.java
index 02fb85187e..52cbcad1a1 100644
--- 
a/extensions/core/executionlog/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionlog/jdo/dom/ExecutionLogEntryPK.java
+++ 
b/extensions/core/executionlog/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionlog/jdo/dom/ExecutionLogEntryPK.java
@@ -24,6 +24,11 @@ import java.util.UUID;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -60,11 +65,21 @@ public class ExecutionLogEntryPK implements Serializable {
         return interactionId + SEPARATOR + sequence;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<ExecutionLogEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultExecutionLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(ExecutionLogEntryPK.class);
         }
diff --git 
a/extensions/core/executionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionlog/jpa/dom/ExecutionLogEntryPK.java
 
b/extensions/core/executionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionlog/jpa/dom/ExecutionLogEntryPK.java
index 0f925c7314..b5805a1973 100644
--- 
a/extensions/core/executionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionlog/jpa/dom/ExecutionLogEntryPK.java
+++ 
b/extensions/core/executionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionlog/jpa/dom/ExecutionLogEntryPK.java
@@ -27,6 +27,11 @@ import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Embeddable;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -73,11 +78,21 @@ public class ExecutionLogEntryPK implements Serializable {
         return interactionId + SEPARATOR + sequence;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<ExecutionLogEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultExecutionLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(ExecutionLogEntryPK.class);
         }
diff --git 
a/extensions/core/executionoutbox/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionoutbox/jdo/dom/ExecutionOutboxEntryPK.java
 
b/extensions/core/executionoutbox/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionoutbox/jdo/dom/ExecutionOutboxEntryPK.java
index 702cce8396..9494508400 100644
--- 
a/extensions/core/executionoutbox/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionoutbox/jdo/dom/ExecutionOutboxEntryPK.java
+++ 
b/extensions/core/executionoutbox/persistence-jdo/src/main/java/org/apache/causeway/extensions/executionoutbox/jdo/dom/ExecutionOutboxEntryPK.java
@@ -24,6 +24,11 @@ import java.util.UUID;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -60,11 +65,21 @@ public class ExecutionOutboxEntryPK implements Serializable 
{
         return interactionId + SEPARATOR + sequence;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<ExecutionOutboxEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultExecutionLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(ExecutionOutboxEntryPK.class);
         }
diff --git 
a/extensions/core/executionoutbox/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionoutbox/jpa/dom/ExecutionOutboxEntryPK.java
 
b/extensions/core/executionoutbox/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionoutbox/jpa/dom/ExecutionOutboxEntryPK.java
index ad78df5d0e..abe6a34271 100644
--- 
a/extensions/core/executionoutbox/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionoutbox/jpa/dom/ExecutionOutboxEntryPK.java
+++ 
b/extensions/core/executionoutbox/persistence-jpa/src/main/java/org/apache/causeway/extensions/executionoutbox/jpa/dom/ExecutionOutboxEntryPK.java
@@ -27,6 +27,11 @@ import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Embeddable;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -71,11 +76,21 @@ public class ExecutionOutboxEntryPK implements Serializable 
{
         return interactionId + SEPARATOR + sequence;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<ExecutionOutboxEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultExecutionLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(ExecutionOutboxEntryPK.class);
         }
diff --git 
a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
 
b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
index 44d88882dc..e83fbaf7ea 100644
--- 
a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
+++ 
b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/causeway/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
@@ -28,6 +28,11 @@ import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Embeddable;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -64,11 +69,21 @@ public class SessionLogEntryPK implements Serializable {
                 : null;
     }
 
-    @Component
     @Priority(PriorityPrecedence.MIDPOINT)
     public static class Semantics
     extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<SessionLogEntryPK> {
 
+        @Configuration
+        public static class AutoConfiguration {
+
+            @Bean
+            @ConditionalOnMissingBean(Semantics.class)
+            public Semantics defaultSessionLogEntryPKSemantics() {
+                return new Semantics();
+            }
+        }
+
+
         public Semantics() {
             super(SessionLogEntryPK.class);
         }
diff --git 
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/causeway/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
 
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/causeway/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
index 4adde41059..351100f9cc 100644
--- 
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/causeway/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
+++ 
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/causeway/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
@@ -29,16 +29,18 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
-import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.PrecedingParamsPolicy;
 import org.apache.causeway.applib.annotation.MemberSupport;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
+import org.apache.causeway.applib.annotation.PrecedingParamsPolicy;
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -61,17 +63,26 @@ import lombok.Value;
 import lombok.val;
 import lombok.experimental.Accessors;
 
-@Component
-@Import({
-    // mixins
-    CalendarEventSemantics.CalendarEvent_default.class
-})
 public class CalendarEventSemantics
 extends ValueSemanticsAbstract<CalendarEvent>
 implements
     DefaultsProvider<CalendarEvent>,
     Renderer<CalendarEvent> {
 
+    @Import({
+        // mixins
+        CalendarEventSemantics.CalendarEvent_default.class
+    })
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(CalendarEventSemantics.class)
+        public CalendarEventSemantics defaultCalendarEventSemantics() {
+            return new CalendarEventSemantics();
+        }
+    }
+
     @Inject private TemporalValueSemantics<ZonedDateTime> 
zonedDateTimeValueSemantics;
 
     @Override
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/CausewayModulePersistenceJdoDatanucleus.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/CausewayModulePersistenceJdoDatanucleus.java
index faa4da52c1..92c6c17994 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/CausewayModulePersistenceJdoDatanucleus.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/CausewayModulePersistenceJdoDatanucleus.java
@@ -91,24 +91,24 @@ import lombok.extern.log4j.Log4j2;
     // @Component's
     DnEntityStateProvider.class,
 
-    DnDatastoreIdImplValueSemantics.class, // datastore identity
-    DnDatastoreUniqueLongIdValueSemantics.class,
-    JdoDatastoreIdValueSemantics.class,
-    JdoShortIdentityValueSemantics.class, // application-defined PK, 
javax.jdo.identity
-    JdoLongIdentityValueSemantics.class,
-    JdoIntIdentityValueSemantics.class,
-    JdoByteIdentityValueSemantics.class,
-    JdoCharIdentityValueSemantics.class,
-    JdoStringIdentityValueSemantics.class,
-    JdoObjectIdentityValueSemantics.class,
-    DnShortIdValueSemantics.class,  // application-defined PK, 
org.datanucleus.identity
-    DnLongIdValueSemantics.class,
-    DnIntIdValueSemantics.class,
-    DnByteIdValueSemantics.class,
-    DnCharIdValueSemantics.class,
-    DnStringIdValueSemantics.class,
-    DnObjectIdValueSemantics.class,
-    DnScoidValueSemantics.class, // in support of 
@PersistenceCapable(identityType=IdentityType.NONDURABLE)
+    DnDatastoreIdImplValueSemantics.AutoConfiguration.class, // datastore 
identity
+    DnDatastoreUniqueLongIdValueSemantics.AutoConfiguration.class,
+    JdoDatastoreIdValueSemantics.AutoConfiguration.class,
+    JdoShortIdentityValueSemantics.AutoConfiguration.class, // 
application-defined PK, javax.jdo.identity
+    JdoLongIdentityValueSemantics.AutoConfiguration.class,
+    JdoIntIdentityValueSemantics.AutoConfiguration.class,
+    JdoByteIdentityValueSemantics.AutoConfiguration.class,
+    JdoCharIdentityValueSemantics.AutoConfiguration.class,
+    JdoStringIdentityValueSemantics.AutoConfiguration.class,
+    JdoObjectIdentityValueSemantics.AutoConfiguration.class,
+    DnShortIdValueSemantics.AutoConfiguration.class,  // application-defined 
PK, org.datanucleus.identity
+    DnLongIdValueSemantics.AutoConfiguration.class,
+    DnIntIdValueSemantics.AutoConfiguration.class,
+    DnByteIdValueSemantics.AutoConfiguration.class,
+    DnCharIdValueSemantics.AutoConfiguration.class,
+    DnStringIdValueSemantics.AutoConfiguration.class,
+    DnObjectIdValueSemantics.AutoConfiguration.class,
+    DnScoidValueSemantics.AutoConfiguration.class, // in support of 
@PersistenceCapable(identityType=IdentityType.NONDURABLE)
 
     // @Service's
     JdoSupportServiceDefault.class,
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnByteIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnByteIdValueSemantics.java
index 10a11d377b..3a8bb6d2bd 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnByteIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnByteIdValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.ByteId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,15 +39,25 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnByteIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<ByteId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnByteIdValueSemantics.class)
+        public DnByteIdValueSemantics defaultDnByteIdValueSemantics() {
+            return new DnByteIdValueSemantics();
+        }
+    }
+
     public DnByteIdValueSemantics() {
         super(ByteId.class);
     }
 
+
     // -- COMPOSER
 
     @Override
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnCharIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnCharIdValueSemantics.java
index 145156b126..c8ef5056d4 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnCharIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnCharIdValueSemantics.java
@@ -21,8 +21,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.inject.Inject;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.CharId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -37,11 +42,20 @@ import lombok.Builder;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnCharIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<CharId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnCharIdValueSemantics.class)
+        public DnCharIdValueSemantics defaultDnCharIdValueSemantics() {
+            return new DnCharIdValueSemantics();
+        }
+    }
+
     @Inject IdStringifier<Character> idStringifierForCharacter;
 
     public DnCharIdValueSemantics() {
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreIdImplValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreIdImplValueSemantics.java
index d1fe779831..c5193fec01 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreIdImplValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreIdImplValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.DatastoreIdImpl;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -35,13 +40,22 @@ import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnDatastoreIdImplValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<DatastoreIdImpl> {
 
     public static final String STRING_DELIMITER = "[OID]"; // as
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnDatastoreIdImplValueSemantics.class)
+        public DnDatastoreIdImplValueSemantics 
defaultDnDatastoreIdImplValueSemantics() {
+            return new DnDatastoreIdImplValueSemantics();
+        }
+    }
+
     public DnDatastoreIdImplValueSemantics() {
         super(DatastoreIdImpl.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreUniqueLongIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreUniqueLongIdValueSemantics.java
index a26bc64782..fb166f5202 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreUniqueLongIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnDatastoreUniqueLongIdValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.DatastoreUniqueLongId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -32,11 +37,21 @@ import lombok.NonNull;
 /**
  * @implNote has no targetEntityClass support
  */
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnDatastoreUniqueLongIdValueSemantics
 extends 
ValueSemanticsBasedOnIdStringifierEntityAgnostic<DatastoreUniqueLongId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnDatastoreUniqueLongIdValueSemantics.class)
+        public DnDatastoreUniqueLongIdValueSemantics 
defaultDnDatastoreUniqueLongIdValueSemantics() {
+            return new DnDatastoreUniqueLongIdValueSemantics();
+        }
+    }
+
+
     public DnDatastoreUniqueLongIdValueSemantics() {
         super(DatastoreUniqueLongId.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnIntIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnIntIdValueSemantics.java
index cb8d6cca8d..81c64e1665 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnIntIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnIntIdValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.IntId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,7 +39,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnIntIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<IntId> {
@@ -43,6 +47,16 @@ extends ValueSemanticsBasedOnIdStringifier<IntId> {
         super(IntId.class);
     }
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnIntIdValueSemantics.class)
+        public DnIntIdValueSemantics defaultDnIntIdValueSemantics() {
+            return new DnIntIdValueSemantics();
+        }
+    }
+
     // -- COMPOSER
 
     @Override
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnLongIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnLongIdValueSemantics.java
index 0c008ca907..a6aa9fea9f 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnLongIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnLongIdValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.LongId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,7 +39,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnLongIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<LongId> {
@@ -43,6 +47,16 @@ extends ValueSemanticsBasedOnIdStringifier<LongId> {
         super(LongId.class);
     }
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnLongIdValueSemantics.class)
+        public DnLongIdValueSemantics defaultDnLongIdValueSemantics() {
+            return new DnLongIdValueSemantics();
+        }
+    }
+
     // -- COMPOSER
 
     @Override
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnObjectIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnObjectIdValueSemantics.java
index b32198b909..58a553b4ed 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnObjectIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnObjectIdValueSemantics.java
@@ -22,8 +22,13 @@ import java.util.UUID;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.ObjectId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -45,7 +50,6 @@ import lombok.val;
  *     of type int, long or UUID: rather than encode the fully qualified 
classname, instead uses a simpler prefix.
  * </p>
  */
-@Component
 @Priority(PriorityPrecedence.LATE)
 @Builder
 public class DnObjectIdValueSemantics
@@ -55,6 +59,16 @@ extends ValueSemanticsBasedOnIdStringifier<ObjectId> {
     private static final String PREFIX_LONG = "l_";
     private static final String PREFIX_INT = "i_";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnObjectIdValueSemantics.class)
+        public DnObjectIdValueSemantics defaultDnObjectIdValueSemantics() {
+            return new DnObjectIdValueSemantics();
+        }
+    }
+
     public DnObjectIdValueSemantics() {
         super(ObjectId.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnScoidValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnScoidValueSemantics.java
index b6abf98084..e21c7a8553 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnScoidValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnScoidValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.SCOID;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,11 +39,21 @@ import lombok.NonNull;
  *
  * @see SCOID
  */
-@Component
 @Priority(PriorityPrecedence.LATE + 100) // after the implementations of 
DatastoreId; for a custom impl.
 public class DnScoidValueSemantics
 extends ValueSemanticsBasedOnIdStringifierEntityAgnostic<SCOID> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnScoidValueSemantics.class)
+        public DnScoidValueSemantics defaultDnScoidValueSemantics() {
+            return new DnScoidValueSemantics();
+        }
+    }
+
+
     public DnScoidValueSemantics() {
         super(SCOID.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnShortIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnShortIdValueSemantics.java
index 91b8f46808..8100438558 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnShortIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnShortIdValueSemantics.java
@@ -20,8 +20,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.ShortId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -34,11 +39,21 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnShortIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<ShortId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnShortIdValueSemantics.class)
+        public DnShortIdValueSemantics defaultDnShortIdValueSemantics() {
+            return new DnShortIdValueSemantics();
+        }
+    }
+
+
     public DnShortIdValueSemantics() {
         super(ShortId.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnStringIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnStringIdValueSemantics.java
index 3246ce1e34..95d00fcc89 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnStringIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/DnStringIdValueSemantics.java
@@ -21,8 +21,13 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.inject.Inject;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.StringId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -37,11 +42,21 @@ import lombok.Builder;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class DnStringIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<StringId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(DnStringIdValueSemantics.class)
+        public DnStringIdValueSemantics defaultDnStringIdValueSemantics() {
+            return new DnStringIdValueSemantics();
+        }
+    }
+
+
     @Inject IdStringifier<String> idStringifierForString;
 
     public DnStringIdValueSemantics() {
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
index da2dbc369b..165cff02e5 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
@@ -21,6 +21,11 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.jdo.identity.ByteIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -33,11 +38,21 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoByteIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<ByteIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoByteIdentityValueSemantics.class)
+        public JdoByteIdentityValueSemantics 
defaultJdoByteIdentityValueSemantics() {
+            return new JdoByteIdentityValueSemantics();
+        }
+    }
+
+
     public JdoByteIdentityValueSemantics() {
         super(ByteIdentity.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
index 5e92374065..1d224f9a40 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
@@ -22,6 +22,11 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.jdo.identity.CharIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -36,11 +41,21 @@ import lombok.Builder;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoCharIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<CharIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoCharIdentityValueSemantics.class)
+        public JdoCharIdentityValueSemantics 
defaultJdoCharIdentityValueSemantics() {
+            return new JdoCharIdentityValueSemantics();
+        }
+    }
+
+
     @Inject IdStringifier<Character> idStringifierForCharacter;
 
     public JdoCharIdentityValueSemantics() {
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
index abe9fc6832..f04088221a 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
@@ -22,8 +22,13 @@ import java.lang.reflect.Constructor;
 
 import javax.annotation.Priority;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.datanucleus.identity.DatastoreId;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -40,11 +45,21 @@ import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE + 100) // after the implementations of 
DatastoreId; for a custom impl.
 public class JdoDatastoreIdValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<DatastoreId> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoDatastoreIdValueSemantics.class)
+        public JdoDatastoreIdValueSemantics 
defaultJdoDatastoreIdValueSemantics() {
+            return new JdoDatastoreIdValueSemantics();
+        }
+    }
+
+
     public JdoDatastoreIdValueSemantics() {
         super(DatastoreId.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
index 8689d6aa4a..63b3442369 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
@@ -21,6 +21,11 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.jdo.identity.IntIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -33,11 +38,21 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoIntIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<IntIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoIntIdentityValueSemantics.class)
+        public JdoIntIdentityValueSemantics 
defaultJdoIntIdentityValueSemantics() {
+            return new JdoIntIdentityValueSemantics();
+        }
+    }
+
+
     public JdoIntIdentityValueSemantics() {
         super(IntIdentity.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
index bd9db134f2..04252b7cf5 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
@@ -21,6 +21,11 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.jdo.identity.LongIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -33,11 +38,21 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoLongIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<LongIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoLongIdentityValueSemantics.class)
+        public JdoLongIdentityValueSemantics 
defaultJdoLongIdentityValueSemantics() {
+            return new JdoLongIdentityValueSemantics();
+        }
+    }
+
+
     public JdoLongIdentityValueSemantics() {
         super(LongIdentity.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
index f1784f0d3f..d4159e35bc 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
@@ -23,6 +23,11 @@ import java.util.UUID;
 import javax.annotation.Priority;
 import javax.jdo.identity.ObjectIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -44,7 +49,6 @@ import lombok.val;
  *     of type int, long or UUID: rather than encode the fully qualified 
classname, instead uses a simpler prefix.
  * </p>
  */
-@Component
 @Priority(PriorityPrecedence.LATE)
 @Builder
 public class JdoObjectIdentityValueSemantics
@@ -54,6 +58,17 @@ extends ValueSemanticsBasedOnIdStringifier<ObjectIdentity> {
     private static final String PREFIX_LONG = "l_";
     private static final String PREFIX_INT = "i_";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoObjectIdentityValueSemantics.class)
+        public JdoObjectIdentityValueSemantics 
defaultJdoObjectIdentityValueSemantics() {
+            return new JdoObjectIdentityValueSemantics();
+        }
+    }
+
+
     public JdoObjectIdentityValueSemantics() {
         super(ObjectIdentity.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
index c3f014089a..4893f08c5e 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
@@ -21,6 +21,11 @@ package 
org.apache.causeway.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 import javax.jdo.identity.ShortIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -33,11 +38,21 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoShortIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<ShortIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoShortIdentityValueSemantics.class)
+        public JdoShortIdentityValueSemantics 
defaultJdoShortIdentityValueSemantics() {
+            return new JdoShortIdentityValueSemantics();
+        }
+    }
+
+
     public JdoShortIdentityValueSemantics() {
         super(ShortIdentity.class);
     }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
index 03e21ed42e..2649ba7142 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/causeway/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
@@ -22,6 +22,11 @@ import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.jdo.identity.StringIdentity;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -36,11 +41,21 @@ import lombok.Builder;
 import lombok.NonNull;
 import lombok.val;
 
-@Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoStringIdentityValueSemantics
 extends ValueSemanticsBasedOnIdStringifier<StringIdentity> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JdoStringIdentityValueSemantics.class)
+        public JdoStringIdentityValueSemantics 
defaultJdoStringIdentityValueSemantics() {
+            return new JdoStringIdentityValueSemantics();
+        }
+    }
+
+
     @Inject IdStringifier<String> idStringifierForString;
 
     public JdoStringIdentityValueSemantics() {
diff --git a/valuetypes/asciidoc/metamodel/src/main/java/module-info.java 
b/valuetypes/asciidoc/metamodel/src/main/java/module-info.java
index 5ef7d274ad..dcbaa6f4ac 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/module-info.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/module-info.java
@@ -31,4 +31,5 @@ module org.apache.causeway.valuetypes.asciidoc.metamodel {
     requires spring.beans;
     requires spring.context;
     requires spring.core;
+    requires spring.boot.autoconfigure;
 }
\ No newline at end of file
diff --git 
a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/CausewayModuleValAsciidocMetaModel.java
 
b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/CausewayModuleValAsciidocMetaModel.java
index e1b3fba276..dffe122d01 100644
--- 
a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/CausewayModuleValAsciidocMetaModel.java
+++ 
b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/CausewayModuleValAsciidocMetaModel.java
@@ -31,7 +31,7 @@ import 
org.apache.causeway.valuetypes.asciidoc.metamodel.semantics.InteractionDt
  */
 @Configuration
 @Import({
-        AsciiDocValueSemantics.class,
+        AsciiDocValueSemantics.AutoConfiguration.class,
         ChangesDtoValueSemanticsPrettyRender.class,
         CommandDtoValueSemanticsPrettyRender.class,
         InteractionDtoValueSemanticsPrettyRender.class,
diff --git 
a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
 
b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
index 58a09c46ea..2a9ce6bf9d 100644
--- 
a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
+++ 
b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/causeway/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
@@ -20,7 +20,9 @@ package 
org.apache.causeway.valuetypes.asciidoc.metamodel.semantics;
 
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.value.semantics.Parser;
 import org.apache.causeway.applib.value.semantics.Renderer;
@@ -32,7 +34,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import 
org.apache.causeway.valuetypes.asciidoc.applib.CausewayModuleValAsciidocApplib;
 import org.apache.causeway.valuetypes.asciidoc.applib.value.AsciiDoc;
 
-@Component
 @Named(CausewayModuleValAsciidocApplib.NAMESPACE + ".AsciiDocValueSemantics")
 public class AsciiDocValueSemantics
 extends ValueSemanticsAbstract<AsciiDoc>
@@ -40,6 +41,16 @@ implements
     Renderer<AsciiDoc>,
     Parser<AsciiDoc> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(AsciiDocValueSemantics.class)
+        public AsciiDocValueSemantics defaultAsciiDocValueSemantics() {
+            return new AsciiDocValueSemantics();
+        }
+    }
+
     @Override
     public Class<AsciiDoc> getCorrespondingClass() {
         return AsciiDoc.class;
diff --git a/valuetypes/jodatime/integration/src/main/java/module-info.java 
b/valuetypes/jodatime/integration/src/main/java/module-info.java
index 49ebe0438b..2a88f1b255 100644
--- a/valuetypes/jodatime/integration/src/main/java/module-info.java
+++ b/valuetypes/jodatime/integration/src/main/java/module-info.java
@@ -30,6 +30,7 @@ module org.apache.causeway.valuetypes.jodatime.integration {
     requires org.apache.causeway.valuetypes.jodatime.applib;
     requires org.joda.time;
     requires spring.context;
+    requires spring.boot.autoconfigure;
 
     opens org.apache.causeway.valuetypes.jodatime.integration.valuesemantics 
to org.apache.causeway.commons;
 }
\ No newline at end of file
diff --git 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/CausewayModuleValJodatimeIntegration.java
 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/CausewayModuleValJodatimeIntegration.java
index 4857550637..279c5cb129 100644
--- 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/CausewayModuleValJodatimeIntegration.java
+++ 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/CausewayModuleValJodatimeIntegration.java
@@ -31,10 +31,10 @@ import 
org.apache.causeway.valuetypes.jodatime.integration.valuesemantics.JodaLo
  */
 @Configuration
 @Import({
-    JodaLocalTimeValueSemantics.class,
-    JodaLocalDateTimeValueSemantics.class,
-    JodaLocalDateValueSemantics.class,
-    JodaDateTimeValueSemantics.class,
+    JodaLocalTimeValueSemantics.AutoConfiguration.class,
+    JodaLocalDateTimeValueSemantics.AutoConfiguration.class,
+    JodaLocalDateValueSemantics.AutoConfiguration.class,
+    JodaDateTimeValueSemantics.AutoConfiguration.class,
 })
 public class CausewayModuleValJodatimeIntegration {
 
diff --git 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
index 55a1156668..bf806544fe 100644
--- 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
+++ 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
@@ -23,8 +23,13 @@ import java.time.ZonedDateTime;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.joda.time.DateTime;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -34,13 +39,22 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.causeway.valuetypes.jodatime.applib.value.JodaTimeConverters;
 import 
org.apache.causeway.valuetypes.jodatime.integration.CausewayModuleValJodatimeIntegration;
 
-@Component
 @Named(JodaDateTimeValueSemantics.LOGICAL_TYPE_NAME)
 public class JodaDateTimeValueSemantics
 extends TemporalSemanticsAdapter<org.joda.time.DateTime, ZonedDateTime>  {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleValJodatimeIntegration.NAMESPACE + ".JodaDateTimeValueSemantics";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JodaDateTimeValueSemantics.class)
+        public JodaDateTimeValueSemantics defaultJodaDateTimeValueSemantics() {
+            return new JodaDateTimeValueSemantics();
+        }
+    }
+
     @Inject ZonedDateTimeValueSemantics zonedDateTimeValueSemantics;
 
     @Override
diff --git 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
index 3a7835fc5c..b2f9e17b7d 100644
--- 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
+++ 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
@@ -23,6 +23,9 @@ import javax.inject.Named;
 
 import org.joda.time.LocalDateTime;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -32,13 +35,22 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.causeway.valuetypes.jodatime.applib.value.JodaTimeConverters;
 import 
org.apache.causeway.valuetypes.jodatime.integration.CausewayModuleValJodatimeIntegration;
 
-@Component
 @Named(JodaLocalDateTimeValueSemantics.LOGICAL_TYPE_NAME)
 public class JodaLocalDateTimeValueSemantics
 extends TemporalSemanticsAdapter<org.joda.time.LocalDateTime, 
java.time.LocalDateTime>  {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleValJodatimeIntegration.NAMESPACE + 
".JodaLocalDateTimeValueSemantics";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JodaLocalDateTimeValueSemantics.class)
+        public JodaLocalDateTimeValueSemantics 
defaultJodaLocalDateTimeValueSemantics() {
+            return new JodaLocalDateTimeValueSemantics();
+        }
+    }
+
     @Inject LocalDateTimeValueSemantics localDateTimeValueSemantics;
 
     @Override
diff --git 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
index 842b8ed909..93af172f2a 100644
--- 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
+++ 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
@@ -21,8 +21,13 @@ package 
org.apache.causeway.valuetypes.jodatime.integration.valuesemantics;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.joda.time.LocalDate;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -32,13 +37,22 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.causeway.valuetypes.jodatime.applib.value.JodaTimeConverters;
 import 
org.apache.causeway.valuetypes.jodatime.integration.CausewayModuleValJodatimeIntegration;
 
-@Component
 @Named(JodaLocalDateValueSemantics.LOGICAL_TYPE_NAME)
 public class JodaLocalDateValueSemantics
 extends TemporalSemanticsAdapter<org.joda.time.LocalDate, java.time.LocalDate> 
 {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleValJodatimeIntegration.NAMESPACE + ".JodaLocalDateValueSemantics";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JodaLocalDateValueSemantics.class)
+        public JodaLocalDateValueSemantics 
defaultJodaLocalDateValueSemantics() {
+            return new JodaLocalDateValueSemantics();
+        }
+    }
+
     @Inject LocalDateValueSemantics localDateValueSemantics;
 
     @Override
diff --git 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
index 07ce4b1e23..26033749bf 100644
--- 
a/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
+++ 
b/valuetypes/jodatime/integration/src/main/java/org/apache/causeway/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
@@ -21,8 +21,13 @@ package 
org.apache.causeway.valuetypes.jodatime.integration.valuesemantics;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
 import org.joda.time.LocalTime;
 
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
@@ -32,13 +37,22 @@ import 
org.apache.causeway.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.causeway.valuetypes.jodatime.applib.value.JodaTimeConverters;
 import 
org.apache.causeway.valuetypes.jodatime.integration.CausewayModuleValJodatimeIntegration;
 
-@Component
 @Named(JodaLocalTimeValueSemantics.LOGICAL_TYPE_NAME)
 public class JodaLocalTimeValueSemantics
 extends TemporalSemanticsAdapter<org.joda.time.LocalTime, java.time.LocalTime> 
 {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleValJodatimeIntegration.NAMESPACE + ".JodaLocalTimeValueSemantics";
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(JodaLocalTimeValueSemantics.class)
+        public JodaLocalTimeValueSemantics 
defaultJodaLocalTimeValueSemantics() {
+            return new JodaLocalTimeValueSemantics();
+        }
+    }
+
     @Inject LocalTimeValueSemantics localTimeValueSemantics;
 
     @Override
diff --git a/valuetypes/markdown/metamodel/src/main/java/module-info.java 
b/valuetypes/markdown/metamodel/src/main/java/module-info.java
index 9fc413b7c3..8175e8234f 100644
--- a/valuetypes/markdown/metamodel/src/main/java/module-info.java
+++ b/valuetypes/markdown/metamodel/src/main/java/module-info.java
@@ -27,4 +27,5 @@ module org.apache.causeway.valuetypes.markdown.metamodel {
     requires org.apache.causeway.schema;
     requires org.apache.causeway.valuetypes.markdown.applib;
     requires spring.context;
+    requires spring.boot.autoconfigure;
 }
\ No newline at end of file
diff --git 
a/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/CausewayModuleValMarkdownMetaModel.java
 
b/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/CausewayModuleValMarkdownMetaModel.java
index 91e32ee82f..474f065f3a 100644
--- 
a/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/CausewayModuleValMarkdownMetaModel.java
+++ 
b/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/CausewayModuleValMarkdownMetaModel.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.valuetypes.markdown.metamodel.semantics.MarkdownValue
  */
 @Configuration
 @Import({
-        MarkdownValueSemantics.class,
+        MarkdownValueSemantics.AutoConfiguration.class,
 })
 public class CausewayModuleValMarkdownMetaModel {
 
diff --git 
a/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
 
b/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
index f56f496074..fa7978959c 100644
--- 
a/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
+++ 
b/valuetypes/markdown/metamodel/src/main/java/org/apache/causeway/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
@@ -20,7 +20,9 @@ package 
org.apache.causeway.valuetypes.markdown.metamodel.semantics;
 
 import javax.inject.Named;
 
-import org.springframework.stereotype.Component;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
 import org.apache.causeway.applib.value.semantics.Parser;
 import org.apache.causeway.applib.value.semantics.Renderer;
@@ -32,7 +34,6 @@ import org.apache.causeway.schema.common.v2.ValueType;
 import 
org.apache.causeway.valuetypes.markdown.applib.CausewayModuleValMarkdownApplib;
 import org.apache.causeway.valuetypes.markdown.applib.value.Markdown;
 
-@Component
 @Named(CausewayModuleValMarkdownApplib.NAMESPACE + ".MarkdownValueSemantics")
 public class MarkdownValueSemantics
 extends ValueSemanticsAbstract<Markdown>
@@ -40,6 +41,16 @@ implements
     Parser<Markdown>,
     Renderer<Markdown> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(MarkdownValueSemantics.class)
+        public MarkdownValueSemantics defaultCalendarEventSemantics() {
+            return new MarkdownValueSemantics();
+        }
+    }
+
     @Override
     public Class<Markdown> getCorrespondingClass() {
         return Markdown.class;
diff --git a/valuetypes/vega/metamodel/src/main/java/module-info.java 
b/valuetypes/vega/metamodel/src/main/java/module-info.java
index 59290ae2e4..70f281ea6d 100644
--- a/valuetypes/vega/metamodel/src/main/java/module-info.java
+++ b/valuetypes/vega/metamodel/src/main/java/module-info.java
@@ -31,4 +31,5 @@ module org.apache.causeway.valuetypes.vega.metamodel {
     requires spring.beans;
     requires spring.context;
     requires spring.core;
+    requires spring.boot.autoconfigure;
 }
\ No newline at end of file
diff --git 
a/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/CausewayModuleValVegaMetaModel.java
 
b/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/CausewayModuleValVegaMetaModel.java
index 776c5a70e5..bc0433b659 100644
--- 
a/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/CausewayModuleValVegaMetaModel.java
+++ 
b/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/CausewayModuleValVegaMetaModel.java
@@ -28,7 +28,7 @@ import 
org.apache.causeway.valuetypes.vega.metamodel.semantics.VegaValueSemantic
  */
 @Configuration
 @Import({
-        VegaValueSemantics.class,
+        VegaValueSemantics.AutoConfiguration.class,
 })
 public class CausewayModuleValVegaMetaModel {
 
diff --git 
a/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
 
b/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
index fdbd317893..07c6192bfb 100644
--- 
a/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
+++ 
b/valuetypes/vega/metamodel/src/main/java/org/apache/causeway/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
@@ -22,6 +22,11 @@ import java.util.UUID;
 
 import javax.inject.Named;
 
+import 
org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
+
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.semantics.DefaultsProvider;
@@ -47,6 +52,17 @@ implements
     Renderer<Vega>,
     Parser<Vega> {
 
+    @Configuration
+    public static class AutoConfiguration {
+
+        @Bean
+        @ConditionalOnMissingBean(VegaValueSemantics.class)
+        public VegaValueSemantics defaultVegaValueSemantics() {
+            return new VegaValueSemantics();
+        }
+    }
+
+
     @Override
     public Class<Vega> getCorrespondingClass() {
         return Vega.class;

Reply via email to