17
17
18
18
import java .lang .annotation .Annotation ;
19
19
20
+ import org .springframework .beans .factory .ListableBeanFactory ;
20
21
import org .springframework .beans .factory .config .BeanDefinition ;
21
22
import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
23
+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
22
24
import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
23
25
import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
24
26
import org .springframework .data .auditing .IsNewAwareAuditingHandler ;
25
27
import org .springframework .data .auditing .config .AuditingBeanDefinitionRegistrarSupport ;
26
28
import org .springframework .data .auditing .config .AuditingConfiguration ;
29
+ import org .springframework .data .config .ParsingUtils ;
30
+ import org .springframework .data .mapping .context .PersistentEntities ;
27
31
import org .springframework .data .relational .auditing .RelationalAuditingCallback ;
28
- import org .springframework .data . repository . config . PersistentEntitiesFactoryBean ;
32
+ import org .springframework .lang . Nullable ;
29
33
import org .springframework .util .Assert ;
30
34
31
35
/**
39
43
class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
40
44
41
45
private static final String AUDITING_HANDLER_BEAN_NAME = "jdbcAuditingHandler" ;
42
- private static final String JDBC_MAPPING_CONTEXT_BEAN_NAME = "jdbcMappingContext" ;
43
46
44
47
/**
45
48
* {@inheritDoc}
@@ -63,36 +66,69 @@ protected String getAuditingHandlerBeanName() {
63
66
return AUDITING_HANDLER_BEAN_NAME ;
64
67
}
65
68
69
+ @ Override
70
+ protected void postProcess (BeanDefinitionBuilder builder , AuditingConfiguration configuration ,
71
+ BeanDefinitionRegistry registry ) {
72
+ potentiallyRegisterJdbcPersistentEntities (builder , registry );
73
+ }
74
+
66
75
@ Override
67
76
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder (AuditingConfiguration configuration ) {
68
77
69
78
Assert .notNull (configuration , "AuditingConfiguration must not be null" );
70
79
71
- BeanDefinitionBuilder builder = configureDefaultAuditHandlerAttributes (configuration ,
80
+ return configureDefaultAuditHandlerAttributes (configuration ,
72
81
BeanDefinitionBuilder .rootBeanDefinition (IsNewAwareAuditingHandler .class ));
82
+ }
73
83
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" );
74
90
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 ));
77
95
78
- return builder .addConstructorArgValue (definition .getBeanDefinition ());
96
+ registerInfrastructureBeanWithId (listenerBeanDefinitionBuilder .getBeanDefinition (),
97
+ RelationalAuditingCallback .class .getName (), registry );
79
98
}
80
99
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 ,
89
101
BeanDefinitionRegistry registry ) {
90
102
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
+ }
94
130
95
- registerInfrastructureBeanWithId ( builder . getRawBeanDefinition (), listenerClass . getName (), registry ) ;
131
+ return null ;
96
132
}
97
133
98
134
}
0 commit comments