From ef3c0b7e066f6c6dee606444e8cca1c9a0cf9426 Mon Sep 17 00:00:00 2001 From: Matej Novotny Date: Wed, 6 Sep 2023 12:26:59 +0200 Subject: [PATCH] Arc - Revisit BeanContainer API --- .../lambda/runtime/AmazonLambdaRecorder.java | 8 +- .../io/quarkus/arc/runtime/BeanContainer.java | 116 ++++++++++++------ .../arc/runtime/BeanContainerImpl.java | 39 ++---- .../security/runtime/ElytronRecorder.java | 2 +- .../FunqyCloudFunctionsBindingRecorder.java | 2 +- .../grpc/auth/GrpcSecurityRecorder.java | 4 +- .../orm/runtime/HibernateOrmRecorder.java | 2 +- .../client/runtime/InfinispanRecorder.java | 2 +- .../runtime/tracing/TracerRecorder.java | 2 +- .../InstrumentationRecorder.java | 2 +- .../common/runtime/ArcBeanFactory.java | 37 +++--- .../runtime/ResteasyReactiveRecorder.java | 2 +- .../security/webauthn/WebAuthnRecorder.java | 6 +- .../runtime/SmallRyeGraphQLRecorder.java | 2 +- .../runtime/SmallRyeMetricsRecorder.java | 2 +- .../quarkus/devui/runtime/DevUIRecorder.java | 2 +- .../ContinuousTestingRecorder.java | 2 +- .../ManagementInterfaceSecurityRecorder.java | 2 +- .../security/HttpSecurityRecorder.java | 2 +- .../java/io/quarkus/arc/ArcContainer.java | 6 - .../io/quarkus/arc/impl/ArcContainerImpl.java | 4 +- .../src/main/java/org/acme/AcmeRecorder.java | 2 +- .../quarkus/extest/runtime/TestRecorder.java | 2 +- 23 files changed, 136 insertions(+), 114 deletions(-) diff --git a/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java b/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java index f8fb6d5b76568..b97b508b5ada1 100644 --- a/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java +++ b/extensions/amazon-lambda/runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaRecorder.java @@ -75,11 +75,11 @@ public void setBeanContainer(BeanContainer container) { */ public static void handle(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { if (streamHandlerClass != null) { - RequestStreamHandler handler = beanContainer.beanInstance(streamHandlerClass); + RequestStreamHandler handler = beanContainer.resolveBean(streamHandlerClass); handler.handleRequest(inputStream, outputStream, context); } else { Object request = objectReader.readValue(inputStream); - RequestHandler handler = beanContainer.beanInstance(handlerClass); + RequestHandler handler = beanContainer.resolveBean(handlerClass); Object response = handler.handleRequest(request, context); objectWriter.writeValue(outputStream, response); } @@ -163,7 +163,7 @@ public void startPollLoop(ShutdownContext context, LaunchMode launchMode) { @Override protected Object processRequest(Object input, AmazonLambdaContext context) throws Exception { - RequestHandler handler = beanContainer.beanInstance(handlerClass); + RequestHandler handler = beanContainer.resolveBean(handlerClass); return handler.handleRequest(input, context); } @@ -185,7 +185,7 @@ protected boolean isStream() { @Override protected void processRequest(InputStream input, OutputStream output, AmazonLambdaContext context) throws Exception { - RequestStreamHandler handler = beanContainer.beanInstance(streamHandlerClass); + RequestStreamHandler handler = beanContainer.resolveBean(streamHandlerClass); handler.handleRequest(input, output, context); } diff --git a/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainer.java b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainer.java index 7594bb3bb9c47..f84a14bd6abce 100644 --- a/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainer.java +++ b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainer.java @@ -2,6 +2,8 @@ import java.lang.annotation.Annotation; +import io.quarkus.arc.Arc; +import io.quarkus.arc.ArcContainer; import io.quarkus.arc.ManagedContext; /** @@ -10,35 +12,41 @@ public interface BeanContainer { /** - * Returns a bean instance for given bean type and qualifiers. - *

- * This method follows standard CDI rules meaning that if there are two or more eligible beans, an ambiguous - * dependency exception is thrown. - * Note that the method is allowed to return {@code null} if there is no matching bean which allows - * for fallback implementations. + * A convenience method returning an instance of {@link ArcContainer} which is an entry point to the CDI container. * - * @param type - * @param qualifiers - * @return a bean instance or {@code null} if no matching bean is found + * @return instance of {@link ArcContainer} */ - default T beanInstance(Class type, Annotation... qualifiers) { - return beanInstanceFactory(type, qualifiers).create().get(); + default ArcContainer container() { + return Arc.container(); } /** - * This method is deprecated and will be removed in future versions. - * Use {@link #beanInstance(Class, Annotation...)} instead. - *

- * As opposed to {@link #beanInstance(Class, Annotation...)}, this method does NOT follow CDI - * resolution rules and in case of ambiguous resolution performs a choice based on the class type parameter. + * Attempts to resolve a bean instance for given bean type and qualifiers. + *

+ * Note that the method deliberately returns {@code null} if there is no matching bean found allowing caller to + * detect such case and implement arbitrary fallback logic. + *

+ * Ambiguities are resolved as per CDI specification, possibly leading to an exception if there are multiple + * matching beans. * - * @param type - * @param qualifiers + * @param beanType type of the bean + * @param beanQualifiers bean qualifiers * @return a bean instance or {@code null} if no matching bean is found */ - @Deprecated - default T instance(Class type, Annotation... qualifiers) { - return instanceFactory(type, qualifiers).create().get(); + T tryResolveBean(Class beanType, Annotation... beanQualifiers); + + /** + * Resolves a bean instance for given bean type and qualifiers. + *

+ * Performs standard CDI resolution meaning it either returns a bean instance or throws a corresponding exception + * if the dependency is either unsatisfied or ambiguous. + * + * @param beanType type of the bean + * @param beanQualifiers bean qualifiers + * @return a bean instance; never {@code null} + */ + default T resolveBean(Class beanType, Annotation... beanQualifiers) { + return container().select(beanType, beanQualifiers).get(); } /** @@ -55,20 +63,6 @@ default T instance(Class type, Annotation... qualifiers) { */ Factory beanInstanceFactory(Class type, Annotation... qualifiers); - /** - * This method is deprecated and will be removed in future versions. - * Use {@link #beanInstanceFactory(Class, Annotation...)} instead. - *

- * As opposed to {@link #beanInstanceFactory(Class, Annotation...)}, this method does NOT follow CDI - * resolution rules and in case of ambiguous resolution performs a choice based on the class type parameter. - * - * @param type - * @param qualifiers - * @return a bean instance factory, never {@code null} - */ - @Deprecated - Factory instanceFactory(Class type, Annotation... qualifiers); - /** *
      * ManagedContext requestContext = beanContainer.requestContext();
@@ -89,6 +83,58 @@ default  T instance(Class type, Annotation... qualifiers) {
      */
     ManagedContext requestContext();
 
+    /**
+     * This method is deprecated and will be removed in future versions.
+     * Use {@link #tryResolveBean(Class, Annotation...)} instead.
+     * 

+ * Returns a bean instance for given bean type and qualifiers. + *

+ * This method follows standard CDI rules meaning that if there are two or more eligible beans, an ambiguous + * dependency exception is thrown. + * Note that the method is allowed to return {@code null} if there is no matching bean which allows + * for fallback implementations. + * + * @param type + * @param qualifiers + * @return a bean instance or {@code null} if no matching bean is found + */ + @Deprecated(forRemoval = true) + default T beanInstance(Class type, Annotation... qualifiers) { + return beanInstanceFactory(type, qualifiers).create().get(); + } + + /** + * This method is deprecated and will be removed in future versions. + * Use {@link #tryResolveBean(Class, Annotation...)} instead. + *

+ * Use {@link #beanInstance(Class, Annotation...)} instead. + *

+ * As opposed to {@link #beanInstance(Class, Annotation...)}, this method does NOT follow CDI + * resolution rules and in case of ambiguous resolution performs a choice based on the class type parameter. + * + * @param type + * @param qualifiers + * @return a bean instance or {@code null} if no matching bean is found + */ + @Deprecated(forRemoval = true) + default T instance(Class type, Annotation... qualifiers) { + return instanceFactory(type, qualifiers).create().get(); + } + + /** + * This method is deprecated and will be removed in future versions. + * Use {@link #beanInstanceFactory(Class, Annotation...)} instead. + *

+ * As opposed to {@link #beanInstanceFactory(Class, Annotation...)}, this method does NOT follow CDI + * resolution rules and in case of ambiguous resolution performs a choice based on the class type parameter. + * + * @param type + * @param qualifiers + * @return a bean instance factory, never {@code null} + */ + @Deprecated(forRemoval = true) + Factory instanceFactory(Class type, Annotation... qualifiers); + interface Factory { Factory EMPTY = new Factory() { diff --git a/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainerImpl.java b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainerImpl.java index 8f93f767bcadb..f183ee88454b1 100644 --- a/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainerImpl.java +++ b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/BeanContainerImpl.java @@ -1,7 +1,6 @@ package io.quarkus.arc.runtime; import java.lang.annotation.Annotation; -import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.function.Supplier; @@ -21,6 +20,17 @@ class BeanContainerImpl implements BeanContainer { this.container = container; } + @Override + public ArcContainer container() { + return container; + } + + @Override + public T tryResolveBean(Class beanType, Annotation... beanQualifiers) { + Supplier> instanceHandleSupplier = container.beanInstanceSupplier(beanType, beanQualifiers); + return instanceHandleSupplier == null ? null : instanceHandleSupplier.get().get(); + } + @Override public Factory beanInstanceFactory(Class type, Annotation... qualifiers) { Supplier> handleSupplier = container.beanInstanceSupplier(type, qualifiers); @@ -38,7 +48,8 @@ private Factory createFactory(Supplier> handleSupplier, LOGGER.debugf( "No matching bean found for type %s and qualifiers %s. The bean might have been marked as unused and removed during build.", type, Arrays.toString(qualifiers)); - return new DefaultInstanceFactory<>(type); + // factories can return null if there is no bean, so we return empty factory + return (Factory) Factory.EMPTY; } return new Factory() { @Override @@ -64,28 +75,4 @@ public ManagedContext requestContext() { return container.requestContext(); } - private static final class DefaultInstanceFactory implements BeanContainer.Factory { - - private final Class type; - - DefaultInstanceFactory(Class type) { - this.type = type; - } - - @Override - public BeanContainer.Instance create() { - try { - T instance = type.getDeclaredConstructor().newInstance(); - return new BeanContainer.Instance() { - @Override - public T get() { - return instance; - } - }; - } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - } - } diff --git a/extensions/elytron-security/runtime/src/main/java/io/quarkus/elytron/security/runtime/ElytronRecorder.java b/extensions/elytron-security/runtime/src/main/java/io/quarkus/elytron/security/runtime/ElytronRecorder.java index 70e68707ef4a9..65827e1fa86f0 100644 --- a/extensions/elytron-security/runtime/src/main/java/io/quarkus/elytron/security/runtime/ElytronRecorder.java +++ b/extensions/elytron-security/runtime/src/main/java/io/quarkus/elytron/security/runtime/ElytronRecorder.java @@ -31,7 +31,7 @@ public void runLoadTask(Runnable runnable) { } public void setDomainForIdentityProvider(BeanContainer bc, RuntimeValue domain) { - bc.beanInstance(ElytronSecurityDomainManager.class).setDomain(domain.getValue()); + bc.resolveBean(ElytronSecurityDomainManager.class).setDomain(domain.getValue()); } /** diff --git a/extensions/funqy/funqy-google-cloud-functions/runtime/src/main/java/io/quarkus/funqy/gcp/functions/FunqyCloudFunctionsBindingRecorder.java b/extensions/funqy/funqy-google-cloud-functions/runtime/src/main/java/io/quarkus/funqy/gcp/functions/FunqyCloudFunctionsBindingRecorder.java index 4ae45066d22e2..c584096da8257 100644 --- a/extensions/funqy/funqy-google-cloud-functions/runtime/src/main/java/io/quarkus/funqy/gcp/functions/FunqyCloudFunctionsBindingRecorder.java +++ b/extensions/funqy/funqy-google-cloud-functions/runtime/src/main/java/io/quarkus/funqy/gcp/functions/FunqyCloudFunctionsBindingRecorder.java @@ -32,7 +32,7 @@ public class FunqyCloudFunctionsBindingRecorder { public void init(BeanContainer bc) { beanContainer = bc; - objectMapper = beanContainer.beanInstance(ObjectMapper.class); + objectMapper = beanContainer.resolveBean(ObjectMapper.class); for (FunctionInvoker invoker : FunctionRecorder.registry.invokers()) { if (invoker.hasInput()) { diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/auth/GrpcSecurityRecorder.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/auth/GrpcSecurityRecorder.java index d6635b1b0e709..0930475441b48 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/auth/GrpcSecurityRecorder.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/auth/GrpcSecurityRecorder.java @@ -21,7 +21,7 @@ public void initGrpcSecurityInterceptor(Map> serviceClassTo // service to full method names var svcToMethods = new HashMap>(); - var services = container.beanInstance(GrpcContainer.class).getServices(); + var services = container.resolveBean(GrpcContainer.class).getServices(); for (BindableService service : services) { var className = getImplementationClassName(service); var blockingMethods = serviceClassToBlockingMethod.get(className); @@ -40,7 +40,7 @@ public void initGrpcSecurityInterceptor(Map> serviceClassTo } } - container.beanInstance(GrpcSecurityInterceptor.class).init(svcToMethods); + container.resolveBean(GrpcSecurityInterceptor.class).init(svcToMethods); } } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java index 5050d7e5c648e..e33d1e67f77c0 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java @@ -98,7 +98,7 @@ public Supplier jpaConfigSupplier(HibernateOrmRuntimeConfig config) { } public void startAllPersistenceUnits(BeanContainer beanContainer) { - beanContainer.beanInstance(JPAConfig.class).startAll(); + beanContainer.resolveBean(JPAConfig.class).startAll(); } public Function, SessionFactory> sessionFactorySupplier( diff --git a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanRecorder.java b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanRecorder.java index cae1c6197d257..803ff6d3887d6 100644 --- a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanRecorder.java +++ b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanRecorder.java @@ -24,7 +24,7 @@ public class InfinispanRecorder { public BeanContainerListener configureInfinispan(@RelaxedValidation Map properties) { return container -> { - InfinispanClientProducer instance = container.beanInstance(InfinispanClientProducer.class); + InfinispanClientProducer instance = container.resolveBean(InfinispanClientProducer.class); instance.setProperties(properties); }; } diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/TracerRecorder.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/TracerRecorder.java index 163ab17705b61..171ffca2a7e7a 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/TracerRecorder.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/TracerRecorder.java @@ -23,7 +23,7 @@ public void setAttributes( String serviceName, String serviceVersion) { - DelayedAttributes delayedAttributes = beanContainer.beanInstance(DelayedAttributes.class); + DelayedAttributes delayedAttributes = beanContainer.resolveBean(DelayedAttributes.class); delayedAttributes.setAttributesDelegate(Resource.getDefault() .merge(Resource.create( diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/InstrumentationRecorder.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/InstrumentationRecorder.java index 9613b7a13eebc..fda1a386c53f7 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/InstrumentationRecorder.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/InstrumentationRecorder.java @@ -30,7 +30,7 @@ public Consumer getVertxTracingOptions() { /* RUNTIME INIT */ public void setupVertxTracer(BeanContainer beanContainer) { - OpenTelemetry openTelemetry = beanContainer.beanInstance(OpenTelemetry.class); + OpenTelemetry openTelemetry = beanContainer.resolveBean(OpenTelemetry.class); OpenTelemetryVertxTracer openTelemetryVertxTracer = new OpenTelemetryVertxTracer(List.of( new HttpInstrumenterVertxTracer(openTelemetry), new EventBusInstrumenterVertxTracer(openTelemetry), diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-common/runtime/src/main/java/io/quarkus/resteasy/reactive/common/runtime/ArcBeanFactory.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive-common/runtime/src/main/java/io/quarkus/resteasy/reactive/common/runtime/ArcBeanFactory.java index 25656077526e0..ca75a1117c474 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive-common/runtime/src/main/java/io/quarkus/resteasy/reactive/common/runtime/ArcBeanFactory.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-common/runtime/src/main/java/io/quarkus/resteasy/reactive/common/runtime/ArcBeanFactory.java @@ -23,27 +23,22 @@ public String toString() { @Override public BeanInstance createInstance() { BeanContainer.Instance instance; - try { - instance = factory.create(); - return new BeanInstance() { - @Override - public T getInstance() { - return instance.get(); - } - - @Override - public void close() { - instance.close(); - } - }; - } catch (Exception e) { - if (factory.getClass().getName().contains("DefaultInstanceFactory")) { - throw new IllegalArgumentException( - "Unable to create class '" + targetClassName - + "'. To fix the problem, make sure this class is a CDI bean.", - e); - } - throw e; + instance = factory.create(); + if (instance == null) { + throw new IllegalArgumentException( + "Unable to create class '" + targetClassName + + "'. To fix the problem, make sure this class is a CDI bean."); } + return new BeanInstance() { + @Override + public T getInstance() { + return instance.get(); + } + + @Override + public void close() { + instance.close(); + } + }; } } diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/runtime/src/main/java/io/quarkus/resteasy/reactive/server/runtime/ResteasyReactiveRecorder.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/runtime/src/main/java/io/quarkus/resteasy/reactive/server/runtime/ResteasyReactiveRecorder.java index 3a74e78586a49..d8a73e3713f85 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive/runtime/src/main/java/io/quarkus/resteasy/reactive/server/runtime/ResteasyReactiveRecorder.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/runtime/src/main/java/io/quarkus/resteasy/reactive/server/runtime/ResteasyReactiveRecorder.java @@ -95,7 +95,7 @@ public RuntimeValue createDeployment(DeploymentInfo info, } CurrentRequestManager - .setCurrentRequestInstance(new QuarkusCurrentRequest(beanContainer.beanInstance(CurrentVertxRequest.class))); + .setCurrentRequestInstance(new QuarkusCurrentRequest(beanContainer.resolveBean(CurrentVertxRequest.class))); BlockingOperationSupport.setIoThreadDetector(new BlockingOperationSupport.IOThreadDetector() { @Override diff --git a/extensions/security-webauthn/runtime/src/main/java/io/quarkus/security/webauthn/WebAuthnRecorder.java b/extensions/security-webauthn/runtime/src/main/java/io/quarkus/security/webauthn/WebAuthnRecorder.java index d61bf70b3522c..5af2d8599c53f 100644 --- a/extensions/security-webauthn/runtime/src/main/java/io/quarkus/security/webauthn/WebAuthnRecorder.java +++ b/extensions/security-webauthn/runtime/src/main/java/io/quarkus/security/webauthn/WebAuthnRecorder.java @@ -32,9 +32,9 @@ public WebAuthnRecorder(RuntimeValue httpConfiguration, Runti } public void setupRoutes(BeanContainer beanContainer, RuntimeValue routerValue, String prefix) { - WebAuthnSecurity security = beanContainer.beanInstance(WebAuthnSecurity.class); - WebAuthnAuthenticationMechanism authMech = beanContainer.beanInstance(WebAuthnAuthenticationMechanism.class); - IdentityProviderManager identityProviderManager = beanContainer.beanInstance(IdentityProviderManager.class); + WebAuthnSecurity security = beanContainer.resolveBean(WebAuthnSecurity.class); + WebAuthnAuthenticationMechanism authMech = beanContainer.resolveBean(WebAuthnAuthenticationMechanism.class); + IdentityProviderManager identityProviderManager = beanContainer.resolveBean(IdentityProviderManager.class); WebAuthnController controller = new WebAuthnController(security, config.getValue(), identityProviderManager, authMech); Router router = routerValue.getValue(); BodyHandler bodyHandler = BodyHandler.create(); diff --git a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLRecorder.java b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLRecorder.java index 048ac5e65d622..107ecdacdc59d 100644 --- a/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLRecorder.java +++ b/extensions/smallrye-graphql/runtime/src/main/java/io/quarkus/smallrye/graphql/runtime/SmallRyeGraphQLRecorder.java @@ -26,7 +26,7 @@ public class SmallRyeGraphQLRecorder { public RuntimeValue createExecutionService(BeanContainer beanContainer, Schema schema) { - GraphQLProducer graphQLProducer = beanContainer.beanInstance(GraphQLProducer.class); + GraphQLProducer graphQLProducer = beanContainer.resolveBean(GraphQLProducer.class); GraphQLSchema graphQLSchema = graphQLProducer.initialize(schema); return new RuntimeValue<>(graphQLSchema != null); } diff --git a/extensions/smallrye-metrics/runtime/src/main/java/io/quarkus/smallrye/metrics/runtime/SmallRyeMetricsRecorder.java b/extensions/smallrye-metrics/runtime/src/main/java/io/quarkus/smallrye/metrics/runtime/SmallRyeMetricsRecorder.java index b9ebfba6933a3..86b24cebdf5c6 100644 --- a/extensions/smallrye-metrics/runtime/src/main/java/io/quarkus/smallrye/metrics/runtime/SmallRyeMetricsRecorder.java +++ b/extensions/smallrye-metrics/runtime/src/main/java/io/quarkus/smallrye/metrics/runtime/SmallRyeMetricsRecorder.java @@ -194,7 +194,7 @@ public void createRegistries(BeanContainer container) { //HACK: registration is done via statics, but cleanup is done via pre destroy //however if the bean is not used it will not be created, so no cleanup will be done //we force bean creation here to make sure the container can restart correctly - container.beanInstance(MetricRegistries.class).getApplicationRegistry(); + container.resolveBean(MetricRegistries.class).getApplicationRegistry(); } public void dropRegistriesAtShutdown(ShutdownContext shutdownContext) { diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java index 57fc606b1b702..b048cc97c137e 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java @@ -46,7 +46,7 @@ public void shutdownTask(ShutdownContext shutdownContext, String devUIBasePath) public void createJsonRpcRouter(BeanContainer beanContainer, Map> extensionMethodsMap) { - JsonRpcRouter jsonRpcRouter = beanContainer.beanInstance(JsonRpcRouter.class); + JsonRpcRouter jsonRpcRouter = beanContainer.resolveBean(JsonRpcRouter.class); jsonRpcRouter.populateJsonRPCMethods(extensionMethodsMap); jsonRpcRouter.initializeCodec(createJsonMapper()); } diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingRecorder.java index 3b8cf15829875..734dde6dd3b35 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/devui/runtime/continuoustesting/ContinuousTestingRecorder.java @@ -12,7 +12,7 @@ public class ContinuousTestingRecorder { public RuntimeValue createContinuousTestingSharedStateManager(BeanContainer beanContainer, ShutdownContext context) { ContinuousTestingJsonRPCService continuousTestingJsonRPCService = beanContainer - .beanInstance(ContinuousTestingJsonRPCService.class); + .resolveBean(ContinuousTestingJsonRPCService.class); ContinuousTestingSharedStateManager.addStateListener(continuousTestingJsonRPCService); context.addShutdownTask(new Runnable() { @Override diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/management/ManagementInterfaceSecurityRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/management/ManagementInterfaceSecurityRecorder.java index 03e6be2d83742..ec7aa7af1dee7 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/management/ManagementInterfaceSecurityRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/management/ManagementInterfaceSecurityRecorder.java @@ -57,7 +57,7 @@ public BeanContainerListener initPermissions(ManagementInterfaceBuildTimeConfig return new BeanContainerListener() { @Override public void created(BeanContainer container) { - container.beanInstance(ManagementPathMatchingHttpSecurityPolicy.class) + container.resolveBean(ManagementPathMatchingHttpSecurityPolicy.class) .init(buildTimeConfig.auth.permissions, policies, buildTimeConfig.rootPath); } }; diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/HttpSecurityRecorder.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/HttpSecurityRecorder.java index 84b3ef16064ad..f4c67c8df77b0 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/HttpSecurityRecorder.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/HttpSecurityRecorder.java @@ -93,7 +93,7 @@ public BeanContainerListener initPermissions(HttpBuildTimeConfig buildTimeConfig return new BeanContainerListener() { @Override public void created(BeanContainer container) { - container.beanInstance(PathMatchingHttpSecurityPolicy.class) + container.resolveBean(PathMatchingHttpSecurityPolicy.class) .init(buildTimeConfig.auth.permissions, policies, buildTimeConfig.rootPath); } }; diff --git a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/ArcContainer.java b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/ArcContainer.java index 8baf18521209e..1f8928cdf5e19 100644 --- a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/ArcContainer.java +++ b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/ArcContainer.java @@ -88,12 +88,6 @@ public interface ArcContainer { /** * Returns a supplier that can be used to create new instances, or null if no matching bean can be found. * - * Note that if there are multiple sub classes of the given type this will return the exact match. This means - * that this can be used to directly instantiate superclasses of other beans without causing problems. This behavior differs - * to standard CDI rules where an ambiguous dependency would exist. - * - * see https://github.com/quarkusio/quarkus/issues/3369 - * * @param type * @param qualifiers * @param diff --git a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/ArcContainerImpl.java b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/ArcContainerImpl.java index 12f6a9ad0a65b..30f0311802466 100644 --- a/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/ArcContainerImpl.java +++ b/independent-projects/arc/runtime/src/main/java/io/quarkus/arc/impl/ArcContainerImpl.java @@ -291,12 +291,12 @@ public InstanceHandle instance(Type type, Annotation... qualifiers) { @Override public Supplier> beanInstanceSupplier(Class type, Annotation... qualifiers) { - return createInstanceSupplier(false, type, qualifiers); + return createInstanceSupplier(true, type, qualifiers); } @Override public Supplier> instanceSupplier(Class type, Annotation... qualifiers) { - return createInstanceSupplier(true, type, qualifiers); + return createInstanceSupplier(false, type, qualifiers); } private Supplier> createInstanceSupplier(boolean resolveAmbiguities, Class type, diff --git a/integration-tests/maven/src/test/resources-filtered/projects/extension-removed-resources/extension/runtime/src/main/java/org/acme/AcmeRecorder.java b/integration-tests/maven/src/test/resources-filtered/projects/extension-removed-resources/extension/runtime/src/main/java/org/acme/AcmeRecorder.java index 283d59c959361..7da1e21272e06 100644 --- a/integration-tests/maven/src/test/resources-filtered/projects/extension-removed-resources/extension/runtime/src/main/java/org/acme/AcmeRecorder.java +++ b/integration-tests/maven/src/test/resources-filtered/projects/extension-removed-resources/extension/runtime/src/main/java/org/acme/AcmeRecorder.java @@ -9,7 +9,7 @@ public class AcmeRecorder { public void recordWords(BeanContainer beanContainer, List words, String classLoaderName) { - var bean = beanContainer.beanInstance(RecordedWords.class); + var bean = beanContainer.resolveBean(RecordedWords.class); bean.setWords(words); bean.setClassLoaderName(classLoaderName); } diff --git a/integration-tests/test-extension/extension/runtime/src/main/java/io/quarkus/extest/runtime/TestRecorder.java b/integration-tests/test-extension/extension/runtime/src/main/java/io/quarkus/extest/runtime/TestRecorder.java index ae6cf57794b9a..e0744102adf84 100644 --- a/integration-tests/test-extension/extension/runtime/src/main/java/io/quarkus/extest/runtime/TestRecorder.java +++ b/integration-tests/test-extension/extension/runtime/src/main/java/io/quarkus/extest/runtime/TestRecorder.java @@ -54,7 +54,7 @@ public void startRuntimeService(ShutdownContext shutdownContext, RuntimeValue