Skip to content

Commit 2f7052c

Browse files
authored
HHH-18737 Introduce util methods for get bean from BeanContainer (hibernate#9100)
1 parent e4cba2c commit 2f7052c

File tree

5 files changed

+104
-172
lines changed

5 files changed

+104
-172
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@
6363
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6464
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
6565
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
66-
import org.hibernate.resource.beans.container.spi.BeanContainer;
6766
import org.hibernate.resource.beans.internal.Helper;
68-
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
69-
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
7067
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
7168
import org.hibernate.resource.jdbc.spi.StatementInspector;
7269
import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder;
@@ -378,36 +375,13 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo
378375
configurationSettings.get( MULTI_TENANT_IDENTIFIER_RESOLVER )
379376
);
380377
if ( this.currentTenantIdentifierResolver == null ) {
381-
final BeanContainer beanContainer = Helper.allowExtensionsInCdi( serviceRegistry ) ? serviceRegistry.requireService( ManagedBeanRegistry.class ).getBeanContainer() : null;
382-
if (beanContainer != null) {
383-
this.currentTenantIdentifierResolver = beanContainer.getBean(
384-
CurrentTenantIdentifierResolver.class,
385-
new BeanContainer.LifecycleOptions() {
386-
@Override
387-
public boolean canUseCachedReferences() {
388-
return true;
389-
}
390-
391-
@Override
392-
public boolean useJpaCompliantCreation() {
393-
return false;
394-
}
395-
},
396-
new BeanInstanceProducer() {
397-
398-
@Override
399-
public <B> B produceBeanInstance(Class<B> beanType) {
400-
return null;
401-
}
402-
403-
@Override
404-
public <B> B produceBeanInstance(String name, Class<B> beanType) {
405-
return null;
406-
}
407-
408-
}
409-
).getBeanInstance();
410-
}
378+
this.currentTenantIdentifierResolver = Helper.getBean(
379+
Helper.getBeanContainer( serviceRegistry ),
380+
CurrentTenantIdentifierResolver.class,
381+
true,
382+
false,
383+
null
384+
);
411385
}
412386

413387
this.delayBatchFetchLoaderCreations = configurationService.getSetting( DELAY_ENTITY_LOADER_CREATIONS, BOOLEAN, true );

hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java

Lines changed: 22 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@
5151
import org.hibernate.models.spi.MemberDetails;
5252
import org.hibernate.models.spi.SourceModelBuildingContext;
5353
import org.hibernate.resource.beans.container.spi.BeanContainer;
54-
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
55-
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
56-
import org.hibernate.service.ServiceRegistry;
54+
import org.hibernate.resource.beans.internal.Helper;
5755

5856
import jakarta.persistence.GeneratedValue;
5957
import jakarta.persistence.GenerationType;
@@ -498,35 +496,19 @@ private static Generator instantiateGeneratorAsBean(
498496
Class<? extends Generator> generatorClass,
499497
MemberDetails memberDetails,
500498
Class<? extends Annotation> annotationType) {
501-
return beanContainer.getBean( generatorClass,
502-
new BeanContainer.LifecycleOptions() {
503-
@Override
504-
public boolean canUseCachedReferences() {
505-
return false;
506-
}
507-
@Override
508-
public boolean useJpaCompliantCreation() {
509-
return true;
510-
}
511-
},
512-
new BeanInstanceProducer() {
513-
@SuppressWarnings( "unchecked" )
514-
@Override
515-
public <B> B produceBeanInstance(Class<B> beanType) {
516-
return (B) instantiateGenerator(
517-
annotation,
518-
memberDetails,
519-
annotationType,
520-
creationContext,
521-
generatorClass
522-
);
523-
}
524-
@Override
525-
public <B> B produceBeanInstance(String name, Class<B> beanType) {
526-
return produceBeanInstance( beanType );
527-
}
528-
} )
529-
.getBeanInstance();
499+
return Helper.getBean(
500+
beanContainer,
501+
generatorClass,
502+
false,
503+
true,
504+
() -> instantiateGenerator(
505+
annotation,
506+
memberDetails,
507+
annotationType,
508+
creationContext,
509+
generatorClass
510+
)
511+
);
530512
}
531513

532514
/**
@@ -539,29 +521,13 @@ public <B> B produceBeanInstance(String name, Class<B> beanType) {
539521
private static <T extends Generator> T instantiateGeneratorAsBean(
540522
BeanContainer beanContainer,
541523
Class<T> generatorClass) {
542-
return beanContainer.getBean( generatorClass,
543-
new BeanContainer.LifecycleOptions() {
544-
@Override
545-
public boolean canUseCachedReferences() {
546-
return false;
547-
}
548-
@Override
549-
public boolean useJpaCompliantCreation() {
550-
return true;
551-
}
552-
},
553-
new BeanInstanceProducer() {
554-
@SuppressWarnings( "unchecked" )
555-
@Override
556-
public <B> B produceBeanInstance(Class<B> beanType) {
557-
return (B) instantiateGeneratorViaDefaultConstructor( generatorClass );
558-
}
559-
@Override
560-
public <B> B produceBeanInstance(String name, Class<B> beanType) {
561-
return produceBeanInstance( beanType );
562-
}
563-
} )
564-
.getBeanInstance();
524+
return Helper.getBean(
525+
beanContainer,
526+
generatorClass,
527+
false,
528+
true,
529+
() -> instantiateGeneratorViaDefaultConstructor( generatorClass )
530+
);
565531
}
566532

567533
/**
@@ -819,10 +785,7 @@ public static void makeIdGenerator(
819785
* Obtain a {@link BeanContainer} to be used for instantiating generators.
820786
*/
821787
public static BeanContainer beanContainer(MetadataBuildingContext buildingContext) {
822-
final ServiceRegistry serviceRegistry = buildingContext.getBootstrapContext().getServiceRegistry();
823-
return allowExtensionsInCdi( serviceRegistry )
824-
? serviceRegistry.requireService( ManagedBeanRegistry.class ).getBeanContainer()
825-
: null;
788+
return Helper.getBeanContainer( buildingContext.getBootstrapContext().getServiceRegistry() );
826789
}
827790

828791
/**

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import org.hibernate.internal.CoreMessageLogger;
2222
import org.hibernate.internal.util.StringHelper;
2323
import org.hibernate.resource.beans.container.spi.BeanContainer;
24-
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
2524
import org.hibernate.resource.beans.internal.Helper;
26-
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
27-
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
2825
import org.hibernate.service.spi.ServiceRegistryImplementor;
2926

3027
import static java.sql.Connection.TRANSACTION_NONE;
@@ -108,7 +105,7 @@ public ConnectionProvider initiateService(
108105
return null;
109106
}
110107

111-
final BeanContainer beanContainer = Helper.allowExtensionsInCdi( registry ) ? registry.requireService( ManagedBeanRegistry.class ).getBeanContainer() : null;
108+
final BeanContainer beanContainer = Helper.getBeanContainer( registry );
112109
final StrategySelector strategySelector = registry.requireService( StrategySelector.class );
113110
final Object explicitSetting = configurationValues.get( CONNECTION_PROVIDER );
114111
if ( explicitSetting != null ) {
@@ -185,33 +182,13 @@ else if ( configurationValues.containsKey( URL ) ) {
185182
}
186183
else {
187184
if (beanContainer != null) {
188-
return beanContainer.getBean(
189-
ConnectionProvider.class,
190-
new BeanContainer.LifecycleOptions() {
191-
@Override
192-
public boolean canUseCachedReferences() {
193-
return true;
194-
}
195-
196-
@Override
197-
public boolean useJpaCompliantCreation() {
198-
return true;
199-
}
200-
},
201-
new BeanInstanceProducer() {
202-
203-
@Override
204-
public <B> B produceBeanInstance(Class<B> beanType) {
205-
return (B) noAppropriateConnectionProvider();
206-
}
207-
208-
@Override
209-
public <B> B produceBeanInstance(String name, Class<B> beanType) {
210-
return (B) noAppropriateConnectionProvider();
211-
}
212-
213-
}
214-
).getBeanInstance();
185+
return Helper.getBean(
186+
beanContainer,
187+
ConnectionProvider.class,
188+
true,
189+
true,
190+
this::noAppropriateConnectionProvider
191+
);
215192
}
216193
else {
217194
return noAppropriateConnectionProvider();
@@ -236,21 +213,20 @@ private Class<? extends ConnectionProvider> getSingleRegisteredProvider(Strategy
236213
private ConnectionProvider instantiateExplicitConnectionProvider(Class<?> providerClass, BeanContainer beanContainer) {
237214
try {
238215
if ( beanContainer != null ) {
239-
return (ConnectionProvider) beanContainer.getBean(
240-
providerClass,
241-
new BeanContainer.LifecycleOptions() {
242-
@Override
243-
public boolean canUseCachedReferences() {
244-
return true;
245-
}
246-
247-
@Override
248-
public boolean useJpaCompliantCreation() {
249-
return true;
250-
}
251-
},
252-
FallbackBeanInstanceProducer.INSTANCE
253-
).getBeanInstance();
216+
return Helper.getBean(
217+
beanContainer,
218+
providerClass,
219+
true,
220+
true,
221+
() -> {
222+
try {
223+
return (ConnectionProvider) providerClass.getConstructor().newInstance();
224+
}
225+
catch (Exception e) {
226+
throw new HibernateException( "Could not instantiate connection provider [" + providerClass.getName() + "]", e );
227+
}
228+
}
229+
);
254230
}
255231
else {
256232
return (ConnectionProvider) providerClass.getConstructor().newInstance();

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/MultiTenantConnectionProviderInitiator.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212
import org.hibernate.cfg.AvailableSettings;
1313
import org.hibernate.engine.jdbc.connections.spi.DataSourceBasedMultiTenantConnectionProviderImpl;
1414
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
15-
import org.hibernate.resource.beans.container.spi.BeanContainer;
1615
import org.hibernate.resource.beans.internal.Helper;
17-
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
18-
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
1916
import org.hibernate.service.spi.ServiceException;
2017
import org.hibernate.service.spi.ServiceRegistryImplementor;
2118

@@ -43,37 +40,13 @@ public Class<MultiTenantConnectionProvider<?>> getServiceInitiated() {
4340
@Override
4441
public MultiTenantConnectionProvider<?> initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
4542
if ( !configurationValues.containsKey( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER ) ) {
46-
final BeanContainer beanContainer = Helper.allowExtensionsInCdi( registry ) ? registry.requireService( ManagedBeanRegistry.class ).getBeanContainer() : null;
47-
if (beanContainer != null) {
48-
return beanContainer.getBean(
49-
MultiTenantConnectionProvider.class,
50-
new BeanContainer.LifecycleOptions() {
51-
@Override
52-
public boolean canUseCachedReferences() {
53-
return true;
54-
}
55-
56-
@Override
57-
public boolean useJpaCompliantCreation() {
58-
return true;
59-
}
60-
},
61-
new BeanInstanceProducer() {
62-
63-
@Override
64-
public <B> B produceBeanInstance(Class<B> beanType) {
65-
return null;
66-
}
67-
68-
@Override
69-
public <B> B produceBeanInstance(String name, Class<B> beanType) {
70-
return null;
71-
}
72-
73-
}
74-
).getBeanInstance();
75-
}
76-
return null;
43+
return Helper.getBean(
44+
Helper.getBeanContainer( registry ),
45+
MultiTenantConnectionProvider.class,
46+
true,
47+
true,
48+
null
49+
);
7750
}
7851

7952
final Object configValue = configurationValues.get( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER );

hibernate-core/src/main/java/org/hibernate/resource/beans/internal/Helper.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44
*/
55
package org.hibernate.resource.beans.internal;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
78
import org.hibernate.engine.config.spi.ConfigurationService;
89
import org.hibernate.resource.beans.container.internal.ContainerManagedLifecycleStrategy;
910
import org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy;
11+
import org.hibernate.resource.beans.container.spi.BeanContainer;
1012
import org.hibernate.resource.beans.container.spi.BeanLifecycleStrategy;
13+
import org.hibernate.resource.beans.spi.BeanInstanceProducer;
14+
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
1115
import org.hibernate.service.ServiceRegistry;
1216

17+
import java.util.function.Supplier;
18+
1319
import static org.hibernate.cfg.ManagedBeanSettings.ALLOW_EXTENSIONS_IN_CDI;
1420
import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN;
1521

@@ -40,4 +46,44 @@ public static BeanLifecycleStrategy getLifecycleStrategy(boolean shouldRegistryM
4046
? JpaCompliantLifecycleStrategy.INSTANCE
4147
: ContainerManagedLifecycleStrategy.INSTANCE;
4248
}
49+
50+
@Nullable
51+
public static BeanContainer getBeanContainer(ServiceRegistry serviceRegistry) {
52+
return allowExtensionsInCdi( serviceRegistry ) ? serviceRegistry.requireService( ManagedBeanRegistry.class ).getBeanContainer() : null;
53+
}
54+
55+
@SuppressWarnings( "unchecked" )
56+
@Nullable
57+
public static <T> T getBean(@Nullable BeanContainer beanContainer, Class<?> beanType, boolean canUseCachedReferences, boolean useJpaCompliantCreation, @Nullable Supplier<T> fallbackSupplier) {
58+
if ( beanContainer == null ) {
59+
return null;
60+
}
61+
return (T) beanContainer.getBean(
62+
beanType,
63+
new BeanContainer.LifecycleOptions() {
64+
@Override
65+
public boolean canUseCachedReferences() {
66+
return canUseCachedReferences;
67+
}
68+
69+
@Override
70+
public boolean useJpaCompliantCreation() {
71+
return useJpaCompliantCreation;
72+
}
73+
},
74+
new BeanInstanceProducer() {
75+
76+
@Override
77+
public <B> B produceBeanInstance(Class<B> beanType) {
78+
return (B) (fallbackSupplier != null ? fallbackSupplier.get() : null);
79+
}
80+
81+
@Override
82+
public <B> B produceBeanInstance(String name, Class<B> beanType) {
83+
throw new UnsupportedOperationException("The method shouldn't be called");
84+
}
85+
}
86+
).getBeanInstance();
87+
}
88+
4389
}

0 commit comments

Comments
 (0)