1717
1818import java .lang .annotation .Annotation ;
1919
20+ import org .springframework .beans .factory .ListableBeanFactory ;
2021import org .springframework .beans .factory .config .BeanDefinition ;
2122import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
23+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
2224import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
2325import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
2426import org .springframework .data .auditing .IsNewAwareAuditingHandler ;
2527import org .springframework .data .auditing .config .AuditingBeanDefinitionRegistrarSupport ;
2628import org .springframework .data .auditing .config .AuditingConfiguration ;
29+ import org .springframework .data .config .ParsingUtils ;
30+ import org .springframework .data .mapping .context .PersistentEntities ;
2731import org .springframework .data .relational .auditing .RelationalAuditingCallback ;
28- import org .springframework .data . repository . config . PersistentEntitiesFactoryBean ;
32+ import org .springframework .lang . Nullable ;
2933import org .springframework .util .Assert ;
3034
3135/**
3943class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
4044
4145 private static final String AUDITING_HANDLER_BEAN_NAME = "jdbcAuditingHandler" ;
42- private static final String JDBC_MAPPING_CONTEXT_BEAN_NAME = "jdbcMappingContext" ;
4346
4447 /**
4548 * {@inheritDoc}
@@ -63,36 +66,69 @@ protected String getAuditingHandlerBeanName() {
6366 return AUDITING_HANDLER_BEAN_NAME ;
6467 }
6568
69+ @ Override
70+ protected void postProcess (BeanDefinitionBuilder builder , AuditingConfiguration configuration ,
71+ BeanDefinitionRegistry registry ) {
72+ potentiallyRegisterJdbcPersistentEntities (builder , registry );
73+ }
74+
6675 @ Override
6776 protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder (AuditingConfiguration configuration ) {
6877
6978 Assert .notNull (configuration , "AuditingConfiguration must not be null" );
7079
71- BeanDefinitionBuilder builder = configureDefaultAuditHandlerAttributes (configuration ,
80+ return configureDefaultAuditHandlerAttributes (configuration ,
7281 BeanDefinitionBuilder .rootBeanDefinition (IsNewAwareAuditingHandler .class ));
82+ }
7383
84+ @ Override
85+ protected void registerAuditListenerBeanDefinition (BeanDefinition auditingHandlerDefinition ,
86+ BeanDefinitionRegistry registry ) {
87+
88+ Assert .notNull (auditingHandlerDefinition , "BeanDefinition must not be null" );
89+ Assert .notNull (registry , "BeanDefinitionRegistry must not be null" );
7490
75- BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition (PersistentEntitiesFactoryBean .class );
76- definition .addConstructorArgReference (JDBC_MAPPING_CONTEXT_BEAN_NAME );
91+ BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
92+ .rootBeanDefinition (RelationalAuditingCallback .class );
93+ listenerBeanDefinitionBuilder
94+ .addConstructorArgValue (ParsingUtils .getObjectFactoryBeanDefinition (AUDITING_HANDLER_BEAN_NAME , registry ));
7795
78- return builder .addConstructorArgValue (definition .getBeanDefinition ());
96+ registerInfrastructureBeanWithId (listenerBeanDefinitionBuilder .getBeanDefinition (),
97+ RelationalAuditingCallback .class .getName (), registry );
7998 }
8099
81- /**
82- * Register the bean definition of {@link RelationalAuditingCallback}. {@inheritDoc}
83- *
84- * @see AuditingBeanDefinitionRegistrarSupport#registerAuditListenerBeanDefinition(BeanDefinition,
85- * BeanDefinitionRegistry)
86- */
87- @ Override
88- protected void registerAuditListenerBeanDefinition (BeanDefinition auditingHandlerDefinition ,
100+ static void potentiallyRegisterJdbcPersistentEntities (BeanDefinitionBuilder builder ,
89101 BeanDefinitionRegistry registry ) {
90102
91- Class <?> listenerClass = RelationalAuditingCallback .class ;
92- BeanDefinitionBuilder builder = BeanDefinitionBuilder .rootBeanDefinition (listenerClass ) //
93- .addConstructorArgReference (AUDITING_HANDLER_BEAN_NAME );
103+ String persistentEntitiesBeanName = JdbcAuditingRegistrar .detectPersistentEntitiesBeanName (registry );
104+
105+ if (persistentEntitiesBeanName == null ) {
106+
107+ persistentEntitiesBeanName = BeanDefinitionReaderUtils .uniqueBeanName ("jdbcPersistentEntities" , registry );
108+
109+ // TODO: https://github.com/spring-projects/spring-framework/issues/28728
110+ BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition (PersistentEntities .class ) //
111+ .setFactoryMethod ("of" ) //
112+ .addConstructorArgReference ("jdbcMappingContext" );
113+
114+ registry .registerBeanDefinition (persistentEntitiesBeanName , definition .getBeanDefinition ());
115+ }
116+
117+ builder .addConstructorArgReference (persistentEntitiesBeanName );
118+ }
119+
120+ @ Nullable
121+ private static String detectPersistentEntitiesBeanName (BeanDefinitionRegistry registry ) {
122+
123+ if (registry instanceof ListableBeanFactory beanFactory ) {
124+ for (String bn : beanFactory .getBeanNamesForType (PersistentEntities .class )) {
125+ if (bn .startsWith ("jdbc" )) {
126+ return bn ;
127+ }
128+ }
129+ }
94130
95- registerInfrastructureBeanWithId ( builder . getRawBeanDefinition (), listenerClass . getName (), registry ) ;
131+ return null ;
96132 }
97133
98134}
0 commit comments