You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/06/19 06:31:53 UTC

[isis] branch ISIS-2755 created (now 795a9e6)

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

danhaywood pushed a change to branch ISIS-2755
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 795a9e6  ISIS-2755: adds missing @Priority for menu services

This branch includes the following new commits:

     new 795a9e6  ISIS-2755: adds missing @Priority for menu services

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[isis] 01/01: ISIS-2755: adds missing @Priority for menu services

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2755
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 795a9e6275a948e50843146084e41a47f257bf22
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Jun 19 07:31:28 2021 +0100

    ISIS-2755: adds missing @Priority for menu services
---
 .../services/appfeatui/ApplicationFeatureMenu.java  |  2 ++
 .../applib/services/confview/ConfigurationMenu.java | 21 ++++++++++++++-------
 .../applib/services/layout/LayoutServiceMenu.java   |  2 ++
 .../services/metamodel/MetaModelServiceMenu.java    |  8 +++++++-
 .../isis/applib/services/user/ImpersonateMenu.java  |  2 ++
 .../i18n/po/TranslationServicePoMenu.java           | 16 ++++++++++------
 .../security/authentication/logout/LogoutMenu.java  | 18 ++++++++++++------
 .../dom/domain/actions/Action/ActionMenu.java       |  2 ++
 .../ActionDomainEventControlService.java            | 11 +++++++----
 .../actions/ActionLayout/ActionLayoutMenu.java      |  2 ++
 .../progmodel/assoc/AssociatedActionMenu.java       | 11 +++++++++--
 .../progmodel/depargs/DependentArgsActionMenu.java  | 11 +++++++++--
 .../collections/Collection/CollectionMenu.java      |  7 ++++++-
 .../CollectionDomainEventControlService.java        |  6 ++++--
 .../CollectionLayout/CollectionLayoutMenu.java      |  7 ++++++-
 .../objects/DomainObject/DomainObjectMenu.java      |  8 ++++++--
 .../DomainObjectLayout/DomainObjectLayoutMenu.java  |  7 ++++++-
 .../objects/other/embedded/EmbeddedTypeMenu.java    | 11 +++++++++--
 .../dom/domain/objects/other/mixins/MixinMenu.java  |  8 +++++++-
 .../domain/properties/Property/PropertyMenu.java    |  8 ++++++--
 .../PropertyDomainEventControlService.java          |  6 ++++--
 .../PropertyLayout/PropertyLayoutMenu.java          |  9 +++++++--
 .../featured/customui/vm/WhereInTheWorldMenu.java   |  7 ++++++-
 .../layout/describedAs/DescribedAsMenu.java         |  7 ++++++-
 .../demoapp/dom/featured/layout/tabs/TabMenu.java   |  7 ++++++-
 .../demoapp/dom/services/core/ServicesMenu.java     |  8 ++++++--
 .../services/extensions/secman/ExtSecManMenu.java   | 12 +++++++++---
 .../java/demoapp/dom/types/isis/IsisTypesMenu.java  | 12 +++++++++---
 .../demoapp/dom/types/isisext/IsisExtTypesMenu.java |  8 ++++++--
 .../dom/types/isisext/sse/AsyncActionMenu.java      | 11 +++++++++--
 .../demoapp/dom/types/javaawt/JavaAwtTypesMenu.java | 12 +++++++++---
 .../dom/types/javalang/JavaLangTypesMenu.java       | 14 +++++++++-----
 .../types/javalang/JavaLangWrapperTypesMenu.java    | 12 +++++++++---
 .../dom/types/javamath/JavaMathTypesMenu.java       | 12 +++++++++---
 .../demoapp/dom/types/javanet/JavaNetTypesMenu.java | 12 +++++++++---
 .../demoapp/dom/types/javasql/JavaSqlTypesMenu.java | 12 +++++++++---
 .../dom/types/javatime/JavaTimeTypesMenu.java       | 12 +++++++++---
 .../dom/types/javautil/JavaUtilTypesMenu.java       | 12 +++++++++---
 .../dom/types/jodatime/JodaTimeTypesMenu.java       | 12 +++++++++---
 .../dom/types/primitive/PrimitiveTypesMenu.java     | 14 +++++++++-----
 .../java/demoapp/web/linebreaker/LineBreaker.java   |  9 +++++++--
 .../demoapp/web/replay/DemoReplayController.java    |  7 ++++++-
 .../security/PrototypeActionsVisibilityAdvisor.java |  6 +++++-
 .../commandlog/jdo/ui/CommandServiceMenu.java       |  3 +--
 .../primary/restapi/CommandRetrievalService.java    |  3 +--
 .../primary/ui/CommandReplayOnPrimaryService.java   |  2 +-
 .../ui/CommandReplayOnSecondaryService.java         |  2 +-
 .../permission/menu/ApplicationPermissionMenu.java  |  2 ++
 .../applib/role/menu/ApplicationRoleMenu.java       |  2 ++
 .../applib/tenancy/menu/ApplicationTenancyMenu.java |  2 ++
 .../applib/user/menu/ApplicationUserMenu.java       |  6 ++++--
 .../secman/applib/user/menu/MeService.java          | 12 +++++++++---
 .../demomodule/dom/PdfJsDemoObjectWithBlobMenu.java | 11 +++--------
 .../jdo/metamodel/menu/JdoMetamodelMenu.java        | 10 +++++++---
 .../isis/testdomain/jdo/JdoInventoryResource.java   |  9 +++++++--
 .../isis/testdomain/jpa/JpaInventoryResource.java   |  9 +++++++--
 .../model/actnsemantics/BlobDemoMenu.java           | 11 +++++++++--
 .../isis/testdomain/rospec/RoSpecSampler.java       |  5 ++++-
 .../bulkupdate/BulkUpdateMenuForDemoToDoItem.java   |  6 +++++-
 .../ExcelPivotByCategoryAndSubcategoryMenu.java     |  2 ++
 .../ExcelUploadServiceForDemoToDoItem.java          |  2 ++
 .../todomodule/dom/ExcelDemoToDoItemMenu.java       | 13 +++++++++----
 .../dom/FakeDataDemoObjectWithAllMenu.java          |  6 +++++-
 .../applib/fixturescripts/FixtureScripts.java       |  3 +++
 .../h2console/ui/services/H2ManagerMenu.java        |  6 ++++--
 .../hsqldbmgr/dom/services/HsqlDbManagerMenu.java   |  6 ++++--
 .../service/swagger/SwaggerServiceMenu.java         |  2 ++
 67 files changed, 400 insertions(+), 136 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureMenu.java
index ca014d5..a02efcb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureMenu.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.appfeat.ApplicationFeature;
@@ -48,6 +49,7 @@ import org.apache.isis.commons.internal.collections._Lists;
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ApplicationFeatureMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE_FEAT + ".ApplicationFeatureMenu";
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index 1e4dfb9..9c5f9e0 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -27,18 +27,29 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
+
 /**
  * Simply provides a UI in order to access the configuration properties
  * available from {@link ConfigurationViewService}.
  *
  * @since 2.0 {@index}
  */
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = ConfigurationMenu.LOGICAL_TYPE_NAME
+)
+@DomainServiceLayout(
+        menuBar = DomainServiceLayout.MenuBar.TERTIARY
+)
 @Named(ConfigurationMenu.LOGICAL_TYPE_NAME)
-@DomainService(logicalTypeName = ConfigurationMenu.LOGICAL_TYPE_NAME)
-@DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.TERTIARY)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class ConfigurationMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE_CONF + ".ConfigurationMenu";
@@ -46,12 +57,8 @@ public class ConfigurationMenu {
     public static abstract class ActionDomainEvent
             extends IsisModuleApplib.ActionDomainEvent<ConfigurationMenu> {}
 
-    private final FactoryService factoryService;
+    final FactoryService factoryService;
 
-    @Inject
-    public ConfigurationMenu(FactoryService factoryService) {
-        this.factoryService = factoryService;
-    }
 
     public static class ConfigurationDomainEvent
             extends ActionDomainEvent {}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
index 6509a82..fd94f8e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.menu.MenuBarsService;
@@ -48,6 +49,7 @@ import org.apache.isis.commons.internal.base._Strings;
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class LayoutServiceMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".LayoutServiceMenu";
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
index 0206a55..bc5c289 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
@@ -34,9 +34,11 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.jaxb.JaxbService;
@@ -54,11 +56,15 @@ import org.apache.isis.schema.metamodel.v2.MetamodelDto;
  * @since 2.0 {@index}
  */
 @Named(MetaModelServiceMenu.LOGICAL_TYPE_NAME)
-@DomainService(logicalTypeName = MetaModelServiceMenu.LOGICAL_TYPE_NAME)
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = MetaModelServiceMenu.LOGICAL_TYPE_NAME
+)
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class MetaModelServiceMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".MetaModelServiceMenu";
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
index 6be32ce..82b2141 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
@@ -15,6 +15,7 @@ import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -48,6 +49,7 @@ import lombok.experimental.Accessors;
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ImpersonateMenu {
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/TranslationServicePoMenu.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/TranslationServicePoMenu.java
index 87e6b86..b82628e 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/TranslationServicePoMenu.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/TranslationServicePoMenu.java
@@ -27,25 +27,29 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.Clob;
 
+import lombok.RequiredArgsConstructor;
+
 @Named(TranslationServicePoMenu.LOGICAL_TYPE_NAME)
 @DomainService(logicalTypeName = TranslationServicePoMenu.LOGICAL_TYPE_NAME)
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class TranslationServicePoMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".TranslationServicePoMenu";
 
-    @Inject private TranslationServicePo translationService;
-
     public static abstract class ActionDomainEvent extends IsisModuleApplib.ActionDomainEvent<TranslationServicePoMenu> {}
 
-    // //////////////////////////////////////
+    final TranslationServicePo translationService;
+
 
     public static class DownloadPotFileDomainEvent extends ActionDomainEvent {}
 
@@ -74,7 +78,7 @@ public class TranslationServicePoMenu {
                 : null;
     }
 
-    // //////////////////////////////////////
+
 
     public static class ResetTranslationCacheDomainEvent extends ActionDomainEvent { }
 
@@ -97,7 +101,6 @@ public class TranslationServicePoMenu {
     }
 
 
-    // //////////////////////////////////////
 
     public static class SwitchToReadingTranslationsDomainEvent extends ActionDomainEvent {}
 
@@ -118,7 +121,8 @@ public class TranslationServicePoMenu {
                 : null;
     }
 
-    // //////////////////////////////////////
+
+
 
     public static class SwitchToWritingTranslationsDomainEvent extends ActionDomainEvent {}
 
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java
index 13c2187..e9eac92 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java
@@ -31,6 +31,8 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
@@ -43,16 +45,21 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Named(LogoutMenu.LOGICAL_TYPE_NAME)
-@DomainService(logicalTypeName = LogoutMenu.LOGICAL_TYPE_NAME)
-@DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.TERTIARY)
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = LogoutMenu.LOGICAL_TYPE_NAME
+)
+@DomainServiceLayout(
+        menuBar = DomainServiceLayout.MenuBar.TERTIARY
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class LogoutMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleCoreSecurity.NAMESPACE + ".LogoutMenu"; // referenced by secman seeding
 
-    private final List<LogoutHandler> logoutHandler;
-    private final InteractionProvider interactionProvider;
-    //private final IsisConfiguration configuration;
+    final List<LogoutHandler> logoutHandler;
+    final InteractionProvider interactionProvider;
 
     public static class LogoutDomainEvent
         extends IsisModuleApplib.ActionDomainEvent<LogoutMenu> {}
@@ -105,6 +112,5 @@ public class LogoutMenu {
         return new LocalResourcePath(logoutRedirect, OpenUrlStrategy.SAME_WINDOW);
     }
 
-
 }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
index 094e7e9..23471da 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/ActionMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -43,6 +44,7 @@ import demoapp.dom.domain.actions.Action.typeOf.ActionTypeOfVm;
 import demoapp.dom.domain.actions.Action.typeOf.child.ActionTypeOfChildVm;
 
 @DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.ActionMenu")
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ActionMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java
index 3567723..80aacb2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/subscribers/ActionDomainEventControlService.java
@@ -21,17 +21,22 @@ package demoapp.dom.domain.actions.Action.domainEvent.subscribers;
 import javax.inject.Inject;
 
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 
+import lombok.RequiredArgsConstructor;
+
 import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm;
 import demoapp.dom.domain.actions.Action.domainEvent.ActionDomainEventVm_mixinUpdateText;
 
 // tag::class[]
-@DomainService(logicalTypeName = "demo.ActionDomainEventControlService")
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 class ActionDomainEventControlService {
 
+    final ServiceRegistry serviceRegistry;
+
     ActionDomainEventControlStrategy controlStrategy = ActionDomainEventControlStrategy.DO_NOTHING;         // <.>
 
     @EventListener(ActionDomainEventVm.UpdateTextDomainEvent.class)       // <.>
@@ -44,7 +49,5 @@ class ActionDomainEventControlService {
         controlStrategy.on(ev, serviceRegistry);
     }
 
-    @Inject
-    ServiceRegistry serviceRegistry;
 }
 // end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
index 393910b..3d15599 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/ActionLayoutMenu.java
@@ -22,11 +22,13 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
 @DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.ActionLayoutMenu")
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Log4j2
 public class ActionLayoutMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionMenu.java
index cd9569a..2ee823e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionMenu.java
@@ -25,10 +25,17 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.AssociatedActionMenu")
-@DomainObjectLayout(named="Associated Action")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.AssociatedActionMenu"
+)
+@DomainObjectLayout(
+        named="Associated Action"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class AssociatedActionMenu {
 
     @Inject private FactoryService factoryService;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionMenu.java
index ad46223..6e7030e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionMenu.java
@@ -25,15 +25,22 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.DependentArgsActionMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.DependentArgsActionMenu"
+)
 @DomainObjectLayout(named="Associated Action")
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class DependentArgsActionMenu {
 
-    @Inject private FactoryService factoryService;
+    final FactoryService factoryService;
 
     @Action
     @ActionLayout(cssClassFa="fa-bolt")
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/CollectionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/CollectionMenu.java
index 0e8571a..caefa00 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/CollectionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/CollectionMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 
@@ -34,7 +35,11 @@ import lombok.extern.log4j.Log4j2;
 import demoapp.dom.domain.collections.Collection.domainEvent.CollectionDomainEventVm;
 import demoapp.dom.domain.collections.Collection.domainEvent.CollectionDomainEventVm_addChild;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.CollectionMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.CollectionMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Log4j2
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class CollectionMenu {
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/subscribers/CollectionDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/subscribers/CollectionDomainEventControlService.java
index 0966157..19e1113 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/subscribers/CollectionDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/subscribers/CollectionDomainEventControlService.java
@@ -21,8 +21,9 @@ package demoapp.dom.domain.collections.Collection.domainEvent.subscribers;
 import javax.inject.Inject;
 
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 
 import lombok.RequiredArgsConstructor;
@@ -30,7 +31,8 @@ import lombok.RequiredArgsConstructor;
 import demoapp.dom.domain.collections.Collection.domainEvent.CollectionDomainEventVm;
 
 // tag::class[]
-@DomainService(logicalTypeName = "demo.CollectionDomainEventControlService")
+@Service
+@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 class CollectionDomainEventControlService {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/CollectionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/CollectionLayoutMenu.java
index 44e7e26..1209221 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/CollectionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/CollectionLayout/CollectionLayoutMenu.java
@@ -22,11 +22,16 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.CollectionLayoutMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.CollectionLayoutMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Log4j2
 public class CollectionLayoutMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
index 4a85abd..364058d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -33,8 +34,11 @@ import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObje
 import demoapp.dom.domain.objects.DomainObject.nature.viewmodels.jaxbrefentity.StatefulVmJaxbRefsEntity;
 import demoapp.dom.domain.objects.DomainObject.nature.viewmodels.usingjaxb.StatefulVmUsingJaxb;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.DomainObjectMenu")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.DomainObjectMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class DomainObjectMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/DomainObjectLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/DomainObjectLayoutMenu.java
index 59bf8c1..1bace2c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/DomainObjectLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/DomainObjectLayoutMenu.java
@@ -22,11 +22,16 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.DomainObjectLayoutMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.DomainObjectLayoutMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Log4j2
 public class DomainObjectLayoutMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeMenu.java
index a285926..c0c10aa 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeMenu.java
@@ -18,16 +18,23 @@
  */
 package demoapp.dom.domain.objects.other.embedded;
 
+import javax.inject.Inject;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 
 import lombok.RequiredArgsConstructor;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.EmbeddedTypeMenu")
-@RequiredArgsConstructor
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.EmbeddedTypeMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class EmbeddedTypeMenu {
 
     private final FactoryService factoryService;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinMenu.java
index e0fa3dd..9e87a09 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinMenu.java
@@ -21,10 +21,16 @@ package demoapp.dom.domain.objects.other.mixins;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 
 import lombok.val;
 
-@DomainService(logicalTypeName = "demo.MixinMenu")
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = "demo.MixinMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class MixinMenu {
 
     @Action
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
index 7c346bf..fd78627 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
@@ -51,8 +52,11 @@ import demoapp.dom.domain.properties.Property.regexPattern.PropertyRegexPatternV
 import demoapp.dom.domain.properties.Property.snapshot.PropertySnapshotVm;
 import demoapp.dom.types.Samples;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.PropertyMenu")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.PropertyMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class PropertyMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
index acc126e..a4d8c7a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/subscribers/PropertyDomainEventControlService.java
@@ -21,8 +21,9 @@ package demoapp.dom.domain.properties.Property.domainEvent.subscribers;
 import javax.inject.Inject;
 
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 
 import lombok.RequiredArgsConstructor;
@@ -30,7 +31,8 @@ import lombok.RequiredArgsConstructor;
 import demoapp.dom.domain.properties.Property.domainEvent.PropertyDomainEventVm;
 
 // tag::class[]
-@DomainService(logicalTypeName = "demo.PropertyDomainEventControlService")
+@Service
+@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 class PropertyDomainEventControlService {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/PropertyLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/PropertyLayoutMenu.java
index 38c7201..b656082 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/PropertyLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/PropertyLayoutMenu.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.value.Blob;
@@ -47,9 +48,13 @@ import demoapp.dom.domain.properties.PropertyLayout.repainting.PropertyLayoutRep
 import demoapp.dom.domain.properties.PropertyLayout.typicalLength.PropertyLayoutTypicalLengthVm;
 import demoapp.dom.types.Samples;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.PropertyLayoutMenu")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.PropertyLayoutMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
+@Log4j2
 public class PropertyLayoutMenu {
 
     final ClockService clockService;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldMenu.java
index 9fae17b..2b46c22 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldMenu.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.val;
@@ -34,7 +35,11 @@ import lombok.val;
 import demoapp.dom.featured.customui.geocoding.GeoapifyClient;
 import demoapp.dom.featured.customui.latlng.Zoom;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.WhereInTheWorldMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.WhereInTheWorldMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class WhereInTheWorldMenu {
 
 //tag::action[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsMenu.java
index 734c7bf..1266d1e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 
@@ -32,7 +33,11 @@ import lombok.val;
 
 import demoapp.dom.domain.actions.progmodel.assoc.DemoItem;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.DescribedAsMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.DescribedAsMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class DescribedAsMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabMenu.java
index bfb5fad..d13ca64 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabMenu.java
@@ -24,11 +24,16 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 
 import lombok.RequiredArgsConstructor;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.TabMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.TabMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class TabMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/ServicesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/ServicesMenu.java
index 70367c6..4a8423d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/ServicesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/ServicesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 
@@ -37,8 +38,11 @@ import demoapp.dom.services.core.xmlSnapshotService.peer.XmlSnapshotPeerVm;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.ServicesMenu")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.ServicesMenu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ServicesMenu {
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/ExtSecManMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/ExtSecManMenu.java
index d763337..d450da0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/ExtSecManMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/ExtSecManMenu.java
@@ -23,15 +23,21 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
 import demoapp.dom.services.extensions.secman.apptenancy.AppTenancyVm;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.ExtSecManMenu")
-@DomainObjectLayout(named="SecMan")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.ExtSecManMenu"
+)
+@DomainObjectLayout(
+        named="SecMan"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ExtSecManMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
index 5adcf99..1bc4474 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import demoapp.dom.types.isis.blobs.IsisBlobs;
@@ -32,9 +33,14 @@ import demoapp.dom.types.isis.localresourcepaths.IsisLocalResourcePaths;
 import demoapp.dom.types.isis.markups.IsisMarkups;
 import demoapp.dom.types.isis.passwords.IsisPasswords;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.IsisTypesMenu")
-@DomainObjectLayout(named="Isis Types")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.IsisTypesMenu"
+)
+@DomainObjectLayout(
+        named="Isis Types"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class IsisTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/IsisExtTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/IsisExtTypesMenu.java
index 2ed7b18..265311e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/IsisExtTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/IsisExtTypesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
@@ -31,9 +32,12 @@ import lombok.extern.log4j.Log4j2;
 import demoapp.dom.types.isisext.asciidocs.IsisAsciiDocs;
 import demoapp.dom.types.isisext.markdowns.IsisMarkdowns;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.IsisExtTypesMenu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.IsisExtTypesMenu"
+)
 @DomainObjectLayout(named="IsisExtTypes")
-@Log4j2
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class IsisExtTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
index 1821ebb..d6fff00 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionMenu.java
@@ -25,13 +25,20 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.value.Markup;
 
 import lombok.val;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.AsyncActionMenu")
-@DomainObjectLayout(named="Async Actions")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.AsyncActionMenu"
+)
+@DomainObjectLayout(
+        named="Async Actions"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class AsyncActionMenu {
 
     @Inject private FactoryService factoryService;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/JavaAwtTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/JavaAwtTypesMenu.java
index f18dd10..75498c3 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/JavaAwtTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/JavaAwtTypesMenu.java
@@ -23,13 +23,19 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import demoapp.dom.types.javaawt.images.JavaAwtBufferedImages;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaAwtTypesMenu")
-@DomainObjectLayout(named="JavaAwtTypes")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaAwtTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaAwtTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaAwtTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangTypesMenu.java
index 93a67a9..5c2df3b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangTypesMenu.java
@@ -24,16 +24,20 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
-import lombok.extern.log4j.Log4j2;
-
 import demoapp.dom.types.javalang.strings.JavaLangStrings;
 import demoapp.dom.types.javalang.voids.JavaLangVoids;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaLangTypesMenu")
-@DomainObjectLayout(named="JavaLangTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaLangTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaLangTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaLangTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangWrapperTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangWrapperTypesMenu.java
index 2ee745e..a8115f6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangWrapperTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/JavaLangWrapperTypesMenu.java
@@ -23,6 +23,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
@@ -36,9 +37,14 @@ import demoapp.dom.types.javalang.integers.WrapperIntegers;
 import demoapp.dom.types.javalang.longs.WrapperLongs;
 import demoapp.dom.types.javalang.shorts.WrapperShorts;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaLangWrapperTypesMenu")
-@DomainObjectLayout(named="JavaLangWrapperTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaLangWrapperTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaLangWrapperTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaLangWrapperTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/JavaMathTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/JavaMathTypesMenu.java
index 9652d97..596b79b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/JavaMathTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/JavaMathTypesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
@@ -31,9 +32,14 @@ import lombok.extern.log4j.Log4j2;
 import demoapp.dom.types.javamath.bigdecimals.JavaMathBigDecimals;
 import demoapp.dom.types.javamath.bigintegers.JavaMathBigIntegers;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaMathTypesMenu")
-@DomainObjectLayout(named="JavaMathTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaMathTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaMathTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaMathTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/JavaNetTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/JavaNetTypesMenu.java
index 58ff1ae..99ebda7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/JavaNetTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/JavaNetTypesMenu.java
@@ -23,15 +23,21 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
 import demoapp.dom.types.javanet.urls.JavaNetUrls;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaNetTypesMenu")
-@DomainObjectLayout(named="JavaNetTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaNetTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaNetTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaNetTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/JavaSqlTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/JavaSqlTypesMenu.java
index c166390..3a347e2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/JavaSqlTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/JavaSqlTypesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
@@ -31,9 +32,14 @@ import lombok.extern.log4j.Log4j2;
 import demoapp.dom.types.javasql.javasqldate.JavaSqlDates;
 import demoapp.dom.types.javasql.javasqltimestamp.JavaSqlTimestamps;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaSqlTypesMenu")
-@DomainObjectLayout(named="JavaSqlTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaSqlTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaSqlTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaSqlTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/JavaTimeTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/JavaTimeTypesMenu.java
index 1b6c32d..45239a1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/JavaTimeTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/JavaTimeTypesMenu.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import demoapp.dom.types.javatime.javatimelocaldate.JavaTimeLocalDates;
@@ -32,9 +33,14 @@ import demoapp.dom.types.javatime.javatimeoffsetdatetime.JavaTimeOffsetDateTimes
 import demoapp.dom.types.javatime.javatimeoffsettime.JavaTimeOffsetTimes;
 import demoapp.dom.types.javatime.javatimezoneddatetime.JavaTimeZonedDateTimes;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaTimeTypesMenu")
-@DomainObjectLayout(named="JavaTimeTypes")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaTimeTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaTimeTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaTimeTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/JavaUtilTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/JavaUtilTypesMenu.java
index 7cfc9fc..e2ac3e0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/JavaUtilTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/JavaUtilTypesMenu.java
@@ -23,6 +23,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
@@ -30,9 +31,14 @@ import lombok.extern.log4j.Log4j2;
 import demoapp.dom.types.javautil.javautildate.JavaUtilDates;
 import demoapp.dom.types.javautil.uuids.JavaUtilUuids;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JavaUtilTypesMenu")
-@DomainObjectLayout(named="JavaUtilTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JavaUtilTypesMenu"
+)
+@DomainObjectLayout(
+        named="JavaUtilTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JavaUtilTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/JodaTimeTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/JodaTimeTypesMenu.java
index 8f474ce..5474c8f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/JodaTimeTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/JodaTimeTypesMenu.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
@@ -36,9 +37,14 @@ import demoapp.dom.types.jodatime.jodalocaldate.JodaLocalDates;
 import demoapp.dom.types.jodatime.jodalocaldatetime.JodaLocalDateTimes;
 import demoapp.dom.types.jodatime.jodalocaltime.JodaLocalTimes;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.JodaTimeTypesMenu")
-@DomainObjectLayout(named="JodaTimeTypes")
-//@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.JodaTimeTypesMenu"
+)
+@DomainObjectLayout(
+        named="JodaTimeTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class JodaTimeTypesMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/PrimitiveTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/PrimitiveTypesMenu.java
index f409184..5fa03a5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/PrimitiveTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/PrimitiveTypesMenu.java
@@ -23,10 +23,9 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
-import lombok.extern.log4j.Log4j2;
-
 import demoapp.dom.types.primitive.booleans.PrimitiveBooleans;
 import demoapp.dom.types.primitive.bytes.PrimitiveBytes;
 import demoapp.dom.types.primitive.chars.PrimitiveChars;
@@ -36,9 +35,14 @@ import demoapp.dom.types.primitive.ints.PrimitiveInts;
 import demoapp.dom.types.primitive.longs.PrimitiveLongs;
 import demoapp.dom.types.primitive.shorts.PrimitiveShorts;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "demo.PrimitiveTypesMenu")
-@DomainObjectLayout(named="PrimitiveTypes")
-@Log4j2
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "demo.PrimitiveTypesMenu"
+)
+@DomainObjectLayout(
+        named="PrimitiveTypes"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class PrimitiveTypesMenu {
 
 
diff --git a/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java b/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
index 1729c69..3290556 100644
--- a/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
+++ b/examples/demo/web/src/main/java/demoapp/web/linebreaker/LineBreaker.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.iactnlayer.InteractionLayerTracker;
 import org.apache.isis.core.interaction.session.IsisInteraction;
@@ -35,9 +36,13 @@ import lombok.extern.log4j.Log4j2;
  * REST endpoint to allow for remote application shutdown
  *
  */
-@DomainService(nature = NatureOfService.REST, logicalTypeName = "demo.LineBreaker")
-@Log4j2
+@DomainService(
+        nature = NatureOfService.REST,
+        logicalTypeName = "demo.LineBreaker"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
+@Log4j2
 public class LineBreaker {
 
     final InteractionLayerTracker iInteractionLayerTracker;
diff --git a/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java b/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java
index 785ff02..1a12eae 100644
--- a/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java
+++ b/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java
@@ -24,10 +24,15 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.extensions.commandreplay.secondary.spi.ReplayCommandExecutionController;
 
-@DomainService(nature = NatureOfService.VIEW, logicalTypeName = "demo.web.DemoReplayController")
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = "demo.web.DemoReplayController"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Profile("secondary")
 public class DemoReplayController implements ReplayCommandExecutionController {
 
diff --git a/examples/demo/web/src/main/java/demoapp/web/security/PrototypeActionsVisibilityAdvisor.java b/examples/demo/web/src/main/java/demoapp/web/security/PrototypeActionsVisibilityAdvisor.java
index 566dee8..5b3df12 100644
--- a/examples/demo/web/src/main/java/demoapp/web/security/PrototypeActionsVisibilityAdvisor.java
+++ b/examples/demo/web/src/main/java/demoapp/web/security/PrototypeActionsVisibilityAdvisor.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.mixins.layout.Object_downloadLayoutXml;
 import org.apache.isis.applib.mixins.rest.Object_openRestApi;
@@ -36,7 +37,10 @@ import org.apache.isis.core.metamodel.inspect.Object_inspectMetamodel;
         nature = NatureOfService.VIEW,
         logicalTypeName = "demo.PrototypeActionsVisibilityAdvisor"
 )
-@DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.TERTIARY)
+@DomainServiceLayout(
+        menuBar = DomainServiceLayout.MenuBar.TERTIARY
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class PrototypeActionsVisibilityAdvisor {
 
     @EventListener(Object_downloadMetamodelXml.ActionDomainEvent.class)
diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/ui/CommandServiceMenu.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/ui/CommandServiceMenu.java
index dfb813d..496b505 100644
--- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/ui/CommandServiceMenu.java
+++ b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/ui/CommandServiceMenu.java
@@ -59,9 +59,8 @@ import lombok.RequiredArgsConstructor;
     named = "Activity",
     menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
-@Service
 @Named(CommandServiceMenu.LOGICAL_TYPE_NAME)
-@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Qualifier("Jdo")
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class CommandServiceMenu {
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
index ef18612..d366319 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalService.java
@@ -42,8 +42,7 @@ import lombok.Getter;
     logicalTypeName = CommandRetrievalService.LOGICAL_TYPE_NAME
 )
 @Named(CommandRetrievalService.LOGICAL_TYPE_NAME)
-@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
-//@Log4j2
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class CommandRetrievalService {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleExtCommandReplayPrimary.NAMESPACE + ".CommandRetrievalService";
diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
index d9cdde5..7f73cb0 100644
--- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
+++ b/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java
@@ -54,7 +54,7 @@ import lombok.RequiredArgsConstructor;
     menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
 @Named("isis.ext.commandReplayPrimary.CommandReplayOnPrimaryService")
-@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor
 //@Log4j2
 public class CommandReplayOnPrimaryService {
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
index bbcf93f..0a4b4af 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java
@@ -49,7 +49,7 @@ import lombok.val;
     menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
 @Named("isis.ext.commandReplaySecondary.CommandReplayOnSecondaryService")
-@javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor
 //@Log4j2
 public class CommandReplayOnSecondaryService {
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
index aa5c5fe..b2cb557 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -43,6 +44,7 @@ import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermis
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         named="Security"
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ApplicationPermissionMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationPermissionMenu";
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
index 1c152e7..2697a47 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
@@ -45,6 +46,7 @@ import lombok.RequiredArgsConstructor;
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ApplicationRoleMenu {
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
index f096f59..4a5bbdb 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
@@ -45,6 +46,7 @@ import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancyRe
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ApplicationTenancyMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationTenancyMenu";
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
index e6e2630..3f89f34 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
@@ -40,11 +41,12 @@ import lombok.RequiredArgsConstructor;
 @DomainService(
         nature = NatureOfService.VIEW,
         logicalTypeName = ApplicationUserMenu.LOGICAL_TYPE_NAME
-        )
+)
 @DomainServiceLayout(
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
-    )
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ApplicationUserMenu {
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/MeService.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/MeService.java
index 1163dcd..8b3ad05 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/MeService.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/MeService.java
@@ -20,6 +20,7 @@ package org.apache.isis.extensions.secman.applib.user.menu;
 
 import java.util.concurrent.Callable;
 
+import javax.annotation.Priority;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
@@ -27,6 +28,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.user.UserService;
@@ -34,6 +36,8 @@ import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
 
+import lombok.RequiredArgsConstructor;
+
 /**
  * @since 2.0 {@index}
  */
@@ -44,6 +48,8 @@ import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserReposito
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class MeService {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".MeService";
@@ -52,9 +58,9 @@ public class MeService {
     public static abstract class CollectionDomainEvent<T> extends IsisModuleExtSecmanApplib.CollectionDomainEvent<MeService, T> {}
     public static abstract class ActionDomainEvent extends IsisModuleExtSecmanApplib.ActionDomainEvent<MeService> {}
 
-    @Inject private ApplicationUserRepository applicationUserRepository;
-    @Inject private UserService userService;
-    @Inject private javax.inject.Provider<QueryResultsCache> queryResultsCacheProvider;
+    final ApplicationUserRepository applicationUserRepository;
+    final UserService userService;
+    final javax.inject.Provider<QueryResultsCache> queryResultsCacheProvider;
 
     // -- iconName
     public String iconName() {
diff --git a/extensions/vw/pdfjs/fixtures/src/main/java/org/isisaddons/wicket/pdfjs/fixture/demoapp/demomodule/dom/PdfJsDemoObjectWithBlobMenu.java b/extensions/vw/pdfjs/fixtures/src/main/java/org/isisaddons/wicket/pdfjs/fixture/demoapp/demomodule/dom/PdfJsDemoObjectWithBlobMenu.java
index c6e8449..8519fff 100644
--- a/extensions/vw/pdfjs/fixtures/src/main/java/org/isisaddons/wicket/pdfjs/fixture/demoapp/demomodule/dom/PdfJsDemoObjectWithBlobMenu.java
+++ b/extensions/vw/pdfjs/fixtures/src/main/java/org/isisaddons/wicket/pdfjs/fixture/demoapp/demomodule/dom/PdfJsDemoObjectWithBlobMenu.java
@@ -39,10 +39,11 @@ import org.apache.isis.applib.services.repository.RepositoryService;
         named = "Demo",
         menuOrder = "10.4"
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class PdfJsDemoObjectWithBlobMenu {
 
-
-    //region > listAll (action)
+    final RepositoryService repositoryService;
 
     @Action(
             semantics = SemanticsOf.SAFE
@@ -55,9 +56,6 @@ public class PdfJsDemoObjectWithBlobMenu {
         return repositoryService.allInstances(PdfJsDemoObjectWithBlob.class);
     }
 
-    //endregion
-
-    //region > create (action)
 
     @MemberOrder(sequence = "2")
     public PdfJsDemoObjectWithBlob createDemoObjectWithBlob(
@@ -69,9 +67,6 @@ public class PdfJsDemoObjectWithBlobMenu {
         return obj;
     }
 
-    //endregion
 
-    @javax.inject.Inject
-    RepositoryService repositoryService;
 
 }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/menu/JdoMetamodelMenu.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/menu/JdoMetamodelMenu.java
index df16697..09f75ce 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/menu/JdoMetamodelMenu.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/menu/JdoMetamodelMenu.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.util.ZipWriter;
@@ -37,9 +38,9 @@ import org.apache.isis.persistence.jdo.applib.services.JdoSupportService;
 import org.apache.isis.persistence.jdo.metamodel.IsisModuleJdoMetamodel;
 import org.apache.isis.persistence.jdo.provider.entities.JdoFacetContext;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@Named(JdoMetamodelMenu.LOGICAL_TYPE_NAME)
 @DomainService(
         logicalTypeName = JdoMetamodelMenu.LOGICAL_TYPE_NAME
 )
@@ -47,12 +48,15 @@ import lombok.val;
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         named = "Prototyping"
 )
+@Named(JdoMetamodelMenu.LOGICAL_TYPE_NAME)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class JdoMetamodelMenu {
 
     public final static String LOGICAL_TYPE_NAME = IsisModuleJdoMetamodel.NAMESPACE + ".JdoMetamodelMenu";
 
-    @Inject private JdoSupportService jdoSupport;
-    @Inject private JdoFacetContext jdoFacetContext;
+    final JdoSupportService jdoSupport;
+    final JdoFacetContext jdoFacetContext;
 
     public static abstract class ActionDomainEvent
     extends IsisModuleApplib.ActionDomainEvent<JdoMetamodelMenu> {}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java
index 409d41f..079d73a 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java
@@ -31,20 +31,25 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
 import org.apache.isis.testdomain.jdo.entities.JdoProduct;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(
         nature = NatureOfService.REST,
-        logicalTypeName = "testdomain.jdo.InventoryResource")
+        logicalTypeName = "testdomain.jdo.InventoryResource"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class JdoInventoryResource {
 
-    @Inject private RepositoryService repository;
+    final RepositoryService repository;
 
     @Action
     public List<JdoProduct> listProducts() {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryResource.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryResource.java
index 567fc4a..f529c3e 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryResource.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryResource.java
@@ -31,20 +31,25 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.testdomain.jpa.entities.JpaBook;
 import org.apache.isis.testdomain.jpa.entities.JpaProduct;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @DomainService(
         nature = NatureOfService.REST,
-        logicalTypeName = "testdomain.jpa.InventoryResource")
+        logicalTypeName = "testdomain.jpa.InventoryResource"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class JpaInventoryResource {
 
-    @Inject private RepositoryService repository;
+    final RepositoryService repository;
 
     @Action
     public List<JpaProduct> listProducts() {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemoMenu.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemoMenu.java
index b0851b1..67a2188 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemoMenu.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemoMenu.java
@@ -25,12 +25,19 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.factory.FactoryService;
 
 import lombok.val;
 
-@DomainService(nature=NatureOfService.VIEW, logicalTypeName = "regressiontests.BlobDemoMenu")
-@DomainObjectLayout(named="Blob Demo Menu")
+@DomainService(
+        nature=NatureOfService.VIEW,
+        logicalTypeName = "regressiontests.BlobDemoMenu"
+)
+@DomainObjectLayout(
+        named="Blob Demo Menu"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class BlobDemoMenu {
 
     @Inject private FactoryService factoryService;
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/rospec/RoSpecSampler.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/rospec/RoSpecSampler.java
index e89f2d2..2161e1b 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/rospec/RoSpecSampler.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/rospec/RoSpecSampler.java
@@ -24,12 +24,15 @@ import java.util.List;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.commons.internal.collections._Lists;
 
 @DomainService(
         nature = NatureOfService.REST,
-        logicalTypeName = "testdomain.RoSpecSampler")
+        logicalTypeName = "testdomain.RoSpecSampler"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class RoSpecSampler {
 
     // -- VOID
diff --git a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
index 708fff7..77a6014 100644
--- a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
+++ b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -39,7 +40,10 @@ import org.apache.isis.subdomains.excel.fixtures.demoapp.todomodule.dom.Subcateg
         nature = NatureOfService.VIEW,
         logicalTypeName = "libExcelFixture.BulkUpdateMenuForDemoToDoItem"
 )
-@DomainServiceLayout(named = "Excel")
+@DomainServiceLayout(
+        named = "Excel"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class BulkUpdateMenuForDemoToDoItem {
 
     public BulkUpdateMenuForDemoToDoItem() {
diff --git a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
index aaedd91..5a3c86b 100644
--- a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
+++ b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Blob;
@@ -40,6 +41,7 @@ import org.apache.isis.subdomains.excel.fixtures.demoapp.todomodule.dom.ExcelDem
 @DomainServiceLayout(
         named = "Excel"
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ExcelPivotByCategoryAndSubcategoryMenu {
 
     @Action(semantics = SemanticsOf.IDEMPOTENT)
diff --git a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
index 5304014..ea2dbd4 100644
--- a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
+++ b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.subdomains.excel.testing.ExcelFixture;
 import org.apache.isis.subdomains.excel.fixtures.demoapp.demomodule.fixturehandlers.demotodoitem.DemoToDoItemRowHandler;
@@ -43,6 +44,7 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         named = "Prototyping"
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class ExcelUploadServiceForDemoToDoItem {
 
     private final FixtureScripts fixtureScripts;
diff --git a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
index f2bae54..aa707d6 100644
--- a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
+++ b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MinLength;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.query.Query;
@@ -42,16 +43,20 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.user.UserService;
 
+import lombok.RequiredArgsConstructor;
+
 @DomainService(
         nature = NatureOfService.VIEW,
         logicalTypeName = "libExcelFixture.ExcelDemoToDoItemMenu"
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class ExcelDemoToDoItemMenu {
 
-    @Inject private MessageService messageService;
-    @Inject private RepositoryService repositoryService;
-    @Inject private UserService userService;
-    @Inject private ClockService clockService;
+    final MessageService messageService;
+    final RepositoryService repositoryService;
+    final UserService userService;
+    final ClockService clockService;
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT, sequence = "1")
diff --git a/testing/fakedata/fixtures/src/main/java/org/apache/isis/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java b/testing/fakedata/fixtures/src/main/java/org/apache/isis/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
index e30ef6f..21d8b5e 100644
--- a/testing/fakedata/fixtures/src/main/java/org/apache/isis/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
+++ b/testing/fakedata/fixtures/src/main/java/org/apache/isis/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.repository.RepositoryService;
 
@@ -37,7 +38,10 @@ import lombok.val;
         nature = NatureOfService.VIEW,
         logicalTypeName = "libFakeDataFixture.FakeDataDemoObjectWithAllMenu"
 )
-@DomainServiceLayout(named = "Demo")
+@DomainServiceLayout(
+        named = "Demo"
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class FakeDataDemoObjectWithAllMenu {
 
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index e76278f..04171c2 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -39,6 +39,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.services.eventbus.EventBusService;
@@ -59,6 +60,7 @@ import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
 import org.apache.isis.testing.fixtures.applib.personas.PersonaWithBuilderScript;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.val;
 
@@ -77,6 +79,7 @@ import lombok.val;
         named="Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class FixtureScripts {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleTestingFixturesApplib.NAMESPACE + ".FixtureScripts"; // secman seeding
diff --git a/testing/h2console/ui/src/main/java/org/apache/isis/testing/h2console/ui/services/H2ManagerMenu.java b/testing/h2console/ui/src/main/java/org/apache/isis/testing/h2console/ui/services/H2ManagerMenu.java
index 71ca563..7a7c90d 100644
--- a/testing/h2console/ui/src/main/java/org/apache/isis/testing/h2console/ui/services/H2ManagerMenu.java
+++ b/testing/h2console/ui/src/main/java/org/apache/isis/testing/h2console/ui/services/H2ManagerMenu.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.LocalResourcePath;
@@ -38,11 +39,12 @@ import org.apache.isis.testing.h2console.ui.webmodule.WebModuleH2Console;
 @DomainService(
         nature = NatureOfService.VIEW,
         logicalTypeName = H2ManagerMenu.LOGICAL_TYPE_NAME
-        )
+)
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
-        )
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class H2ManagerMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleTestingH2ConsoleUi.NAMESPACE + ".H2ManagerMenu";
diff --git a/testing/hsqldbmgr/ui/src/main/java/org/apache/isis/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java b/testing/hsqldbmgr/ui/src/main/java/org/apache/isis/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
index d0b18d5..2b30275 100644
--- a/testing/hsqldbmgr/ui/src/main/java/org/apache/isis/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
+++ b/testing/hsqldbmgr/ui/src/main/java/org/apache/isis/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.commons.internal.base._Strings;
@@ -44,11 +45,12 @@ import lombok.extern.log4j.Log4j2;
 @DomainService(
         nature = NatureOfService.VIEW,
         logicalTypeName = HsqlDbManagerMenu.LOGICAL_TYPE_NAME
-        )
+)
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
-        )
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Log4j2
 public class HsqlDbManagerMenu {
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/SwaggerServiceMenu.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/SwaggerServiceMenu.java
index b346fcb..607fd77 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/SwaggerServiceMenu.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/SwaggerServiceMenu.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -51,6 +52,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.IsisModuleRestfulObjectsR
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
 )
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class SwaggerServiceMenu {
 
     public static final String LOGICAL_TYPE_NAME = IsisModuleRestfulObjectsRendering.NAMESPACE +  ".SwaggerServiceMenu";