This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new c48f84bdc1 New BeanCreator API
c48f84bdc1 is described below
commit c48f84bdc1c5e31919a5fcb52a61bca19ff8ea36
Author: James Bognar <[email protected]>
AuthorDate: Mon Feb 2 09:54:48 2026 -0500
New BeanCreator API
---
.../juneau/commons/inject/BasicBeanStore2.java | 72 ++----
.../apache/juneau/commons/inject/BeanCreator2.java | 53 ++---
.../juneau/commons/inject/CreatableBeanStore.java | 265 +++++++++++++++++++++
.../juneau/commons/inject/BeanCreator2_Test.java | 49 ++--
4 files changed, 331 insertions(+), 108 deletions(-)
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
index 88d91f9774..240ba795b3 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
@@ -176,17 +176,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
* @return The bean, or {@link Optional#empty()} if not found.
*/
@Override
- @SuppressWarnings("unchecked")
public <T> Optional<T> getBean(Class<T> beanType) {
- var typeMap = entries.get(beanType);
- if (nn(typeMap)) {
- var supplier = typeMap.get("");
- if (nn(supplier))
- return opt((T)supplier.get());
- }
- if (nn(parent))
- return parent.getBean(beanType);
- return opte();
+ return getBean(beanType, null);
}
@@ -202,18 +193,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
* @return The bean, or {@link Optional#empty()} if not found.
*/
@Override
- @SuppressWarnings("unchecked")
public <T> Optional<T> getBean(Class<T> beanType, String name) {
- var typeMap = entries.get(beanType);
- if (nn(typeMap)) {
- var key = emptyIfNull(name);
- var supplier = typeMap.get(key);
- if (nn(supplier))
- return opt((T)supplier.get());
- }
- if (nn(parent))
- return parent.getBean(beanType, name);
- return opte();
+ return resolve(beanType, name).map(Supplier::get);
}
/**
@@ -253,12 +234,7 @@ public class BasicBeanStore2 implements WritableBeanStore {
*/
@Override
public boolean hasBean(Class<?> beanType) {
- var typeMap = entries.get(beanType);
- if (nn(typeMap) && typeMap.containsKey(""))
- return true;
- if (n(parent))
- return false;
- return parent.hasBean(beanType);
+ return hasBean(beanType, null);
}
/**
@@ -273,15 +249,7 @@ public class BasicBeanStore2 implements WritableBeanStore {
*/
@Override
public boolean hasBean(Class<?> beanType, String name) {
- var typeMap = entries.get(beanType);
- if (nn(typeMap)) {
- var key = emptyIfNull(name);
- if (typeMap.containsKey(key))
- return true;
- }
- if (n(parent))
- return false;
- return parent.hasBean(beanType, name);
+ return resolve(beanType, name).isPresent();
}
/**
@@ -295,21 +263,12 @@ public class BasicBeanStore2 implements WritableBeanStore
{
* @return The supplier, or {@link Optional#empty()} if no supplier of
the specified type exists.
*/
@Override
- @SuppressWarnings("unchecked")
public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType) {
- var typeMap = entries.get(beanType);
- if (nn(typeMap)) {
- var supplier = typeMap.get("");
- if (nn(supplier))
- return opt((Supplier<T>)supplier);
- }
- if (nn(parent))
- return parent.getBeanSupplier(beanType);
- return opte();
+ return getBeanSupplier(beanType, null);
}
/**
- * Returns the supplier for a named bean of the specified type.
+ * Resolves a supplier for a bean of the specified type and name.
*
* <p>
* If no supplier with the specified name is found in this store,
searches the parent store recursively.
@@ -319,9 +278,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
* @param name The bean name. Can be <jk>null</jk>.
* @return The supplier, or {@link Optional#empty()} if no supplier of
the specified type and name exists.
*/
- @Override
@SuppressWarnings("unchecked")
- public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType,
String name) {
+ protected <T> Optional<Supplier<T>> resolve(Class<T> beanType, String
name) {
var typeMap = entries.get(beanType);
if (nn(typeMap)) {
var key = emptyIfNull(name);
@@ -334,6 +292,22 @@ public class BasicBeanStore2 implements WritableBeanStore {
return opte();
}
+ /**
+ * Returns the supplier for a named bean of the specified type.
+ *
+ * <p>
+ * If no supplier with the specified name is found in this store,
searches the parent store recursively.
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @return The supplier, or {@link Optional#empty()} if no supplier of
the specified type and name exists.
+ */
+ @Override
+ public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType,
String name) {
+ return resolve(beanType, name);
+ }
+
@Override /* Overridden from Object */
public String toString() {
return r(properties());
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
index ba8cfedabe..c5d06e7b10 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
@@ -205,7 +205,7 @@ public class BeanCreator2<T> {
* @return A new bean creator.
*/
public static <T> BeanCreator2<T> of(Class<T> beanType) {
- return new BeanCreator2<>(beanType, null);
+ return new BeanCreator2<>(beanType, null, null, null);
}
/**
@@ -217,7 +217,21 @@ public class BeanCreator2<T> {
* @return A new bean creator.
*/
public static <T> BeanCreator2<T> of(Class<T> beanType, BeanStore
parentStore) {
- return new BeanCreator2<>(beanType, parentStore);
+ return new BeanCreator2<>(beanType, parentStore, null, null);
+ }
+
+ /**
+ * Creates a new bean creator with a parent bean store, name, and
enclosing instance.
+ *
+ * @param <T> The bean type to create.
+ * @param beanType The bean type to create.
+ * @param parentStore The parent bean store to use for resolving
dependencies. Can be <jk>null</jk>.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @param enclosingInstance The enclosing instance object. Can be
<jk>null</jk>.
+ * @return A new bean creator.
+ */
+ public static <T> BeanCreator2<T> of(Class<T> beanType, BeanStore
parentStore, String name, Object enclosingInstance) {
+ return new BeanCreator2<>(beanType, parentStore, name,
enclosingInstance);
}
private final BeanStore parentStore;
@@ -230,7 +244,7 @@ public class BeanCreator2<T> {
private ClassInfoTyped<? extends T> beanSubType;
private ClassInfo explicitBuilderType = null;
private Object explicitBuilder = null;
- private Object enclosingInstance;
+ private final Object enclosingInstance;
private T explicitImplementation = null;
private List<Consumer<T>> postCreateHooks = new ArrayList<>();
private Set<String> factoryMethodNames = DEFAULT_FACTORY_METHOD_NAMES;
@@ -238,7 +252,7 @@ public class BeanCreator2<T> {
private Set<String> buildMethodNames = DEFAULT_BUILD_METHOD_NAMES;
private Set<String> builderClassNames = DEFAULT_BUILDER_CLASS_NAMES;
private Supplier<? extends T> fallbackSupplier = null;
- private String name = null;
+ private final String name;
private boolean cached = false;
private ResettableSupplier<ClassInfo> builderType = memr(() ->
findBuilderType());
@@ -252,12 +266,16 @@ public class BeanCreator2<T> {
*
* @param beanType The bean type being created.
* @param parentStore The parent bean store to use for resolving
dependencies. Can be <jk>null</jk>.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @param enclosingInstance The enclosing instance object. Can be
<jk>null</jk>.
*/
- protected BeanCreator2(Class<T> beanType, BeanStore parentStore) {
+ protected BeanCreator2(Class<T> beanType, BeanStore parentStore, String
name, Object enclosingInstance) {
this.beanType = info(assertArgNotNull("beanType", beanType));
this.beanSubType = this.beanType;
this.parentStore = parentStore;
this.store = new BasicBeanStore2(this.parentStore);
+ this.name = name;
+ this.enclosingInstance = enclosingInstance;
}
/**
@@ -735,19 +753,6 @@ public class BeanCreator2<T> {
return this;
}
- /**
- * Specifies the enclosing instance object to use when instantiating
inner classes.
- *
- * @param outer The enclosing instance object. Can be <jk>null</jk>.
- * @return This object.
- */
- public BeanCreator2<T> enclosingInstance(Object outer) {
- try (var writeLock = lock.write()) {
- this.enclosingInstance = outer;
- reset();
- }
- return this;
- }
/**
* Specifies custom static factory method names to look for when
creating the bean.
@@ -1048,18 +1053,6 @@ public class BeanCreator2<T> {
return this;
}
- /**
- * Specifies the name of the bean being created.
- *
- * @param value The bean name. Can be <jk>null</jk>.
- * @return This object.
- */
- public BeanCreator2<T> name(String value) {
- try (var writeLock = lock.write()) {
- this.name = value;
- }
- return this;
- }
/**
* Resets the builder, builderType, and beanImpl suppliers.
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
new file mode 100644
index 0000000000..2a219d9148
--- /dev/null
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
@@ -0,0 +1,265 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.juneau.commons.inject;
+
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.Utils.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+
+/**
+ * A bean store that provides convenient access to {@link BeanCreator2}
instances for creating beans.
+ *
+ * <p>
+ * This class extends {@link BasicBeanStore2} and adds methods to manage
{@link BeanCreator2} instances
+ * for different bean types. Creators are lazily created and cached for
efficient reuse.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jc>// Create a creatable bean store</jc>
+ * CreatableBeanStore <jv>store</jv> = <jk>new</jk>
CreatableBeanStore(<jk>null</jk>);
+ *
+ * <jc>// Get or create a creator for MyBean</jc>
+ * BeanCreator2<MyBean> <jv>creator</jv> =
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+ *
+ * <jc>// Use the creator to create a bean</jc>
+ * MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+ *
+ * <jc>// Explicitly add a creator (optional, getCreator will create if
missing)</jc>
+ * <jv>store</jv>.addCreator(MyOtherBean.<jk>class</jk>);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5><ul>
+ * <li class='jc'>{@link BasicBeanStore2}
+ * <li class='jc'>{@link BeanCreator2}
+ * </ul>
+ */
+public class CreatableBeanStore extends BasicBeanStore2 {
+
+ private final ConcurrentHashMap<Class<?>, BeanCreator2<?>> creators =
new ConcurrentHashMap<>();
+ private final Object enclosingInstance;
+
+ /**
+ * Constructor.
+ *
+ * @param parent The parent bean store. Can be <jk>null</jk>. Bean
searches are performed recursively up this parent chain.
+ * @param enclosingInstance The enclosing instance object to use when
instantiating inner classes. Can be <jk>null</jk>.
+ */
+ public CreatableBeanStore(BeanStore parent, Object enclosingInstance) {
+ super(parent);
+ this.enclosingInstance = enclosingInstance;
+ }
+
+ /**
+ * Same as {@link #addCreator(Class)} but returns the creator instead
of this object for fluent calls.
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to create a creator for. Cannot be
<jk>null</jk>.
+ * @return The creator that was created and stored.
+ */
+ public <T> BeanCreator2<T> add(Class<T> beanType) {
+ assertArgNotNull("beanType", beanType);
+ var creator = BeanCreator2.of(beanType, this, null,
enclosingInstance);
+ creators.put(beanType, creator);
+ return creator;
+ }
+
+ /**
+ * Same as {@link #addCreator(Class, String)} but returns the creator
instead of this object for fluent calls.
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to create a creator for. Cannot be
<jk>null</jk>.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @return The creator that was created and stored.
+ */
+ public <T> BeanCreator2<T> add(Class<T> beanType, String name) {
+ assertArgNotNull("beanType", beanType);
+ var creator = BeanCreator2.of(beanType, this, name,
enclosingInstance);
+ creators.put(beanType, creator);
+ return creator;
+ }
+
+ /**
+ * Creates and stores a {@link BeanCreator2} for the specified bean
type.
+ *
+ * <p>
+ * If a creator for this type already exists, it is replaced with a new
one.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jc>// Create and store a creator</jc>
+ * <jv>store</jv>.addCreator(MyBean.<jk>class</jk>);
+ *
+ * <jc>// Get the creator</jc>
+ * BeanCreator2<MyBean> <jv>creator</jv> =
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+ * </p>
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to create a creator for. Cannot be
<jk>null</jk>.
+ * @return This object.
+ */
+ public <T> CreatableBeanStore addCreator(Class<T> beanType) {
+ assertArgNotNull("beanType", beanType);
+ var creator = BeanCreator2.of(beanType, this, null,
enclosingInstance);
+ creators.put(beanType, creator);
+ return this;
+ }
+
+ /**
+ * Creates and stores a {@link BeanCreator2} for the specified bean
type with a name.
+ *
+ * <p>
+ * If a creator for this type already exists, it is replaced with a new
one.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jc>// Create and store a creator with a name</jc>
+ * <jv>store</jv>.addCreator(MyBean.<jk>class</jk>,
<js>"myBean"</js>);
+ *
+ * <jc>// Get the creator</jc>
+ * BeanCreator2<MyBean> <jv>creator</jv> =
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>, <js>"myBean"</js>);
+ * </p>
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to create a creator for. Cannot be
<jk>null</jk>.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @return This object.
+ */
+ public <T> CreatableBeanStore addCreator(Class<T> beanType, String
name) {
+ assertArgNotNull("beanType", beanType);
+ var creator = BeanCreator2.of(beanType, this, name,
enclosingInstance);
+ creators.put(beanType, creator);
+ return this;
+ }
+
+ /**
+ * Returns the {@link BeanCreator2} for the specified bean type,
creating it if it doesn't exist.
+ *
+ * <p>
+ * If a creator for this type doesn't exist, a new one is created with
this bean store configured
+ * and stored for future use.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jc>// Get or create a creator</jc>
+ * BeanCreator2<MyBean> <jv>creator</jv> =
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+ *
+ * <jc>// Use the creator to create a bean</jc>
+ * MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+ * </p>
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to get a creator for. Cannot be
<jk>null</jk>.
+ * @return The creator for the specified bean type. Never <jk>null</jk>.
+ */
+ @SuppressWarnings("unchecked")
+ public <T> BeanCreator2<T> getCreator(Class<T> beanType) {
+ assertArgNotNull("beanType", beanType);
+ return (BeanCreator2<T>)creators.computeIfAbsent(beanType, k ->
BeanCreator2.of((Class<T>)k, this, null, enclosingInstance));
+ }
+
+ /**
+ * Returns the {@link BeanCreator2} for the specified bean type with a
name, creating it if it doesn't exist.
+ *
+ * <p>
+ * If a creator for this type doesn't exist, a new one is created with
this bean store configured
+ * and stored for future use.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jc>// Get or create a creator with a name</jc>
+ * BeanCreator2<MyBean> <jv>creator</jv> =
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>, <js>"myBean"</js>);
+ *
+ * <jc>// Use the creator to create a bean</jc>
+ * MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+ * </p>
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to get a creator for. Cannot be
<jk>null</jk>.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @return The creator for the specified bean type. Never <jk>null</jk>.
+ */
+ @SuppressWarnings("unchecked")
+ public <T> BeanCreator2<T> getCreator(Class<T> beanType, String name) {
+ assertArgNotNull("beanType", beanType);
+ return (BeanCreator2<T>)creators.computeIfAbsent(beanType, k ->
BeanCreator2.of((Class<T>)k, this, name, enclosingInstance));
+ }
+
+ /**
+ * Resolves a bean supplier by checking creators for matching bean or
builder types.
+ *
+ * <p>
+ * This method searches through all registered creators to find one
that can create the requested bean type.
+ * It checks both the creator's bean type and any builder types
associated with the creator.
+ *
+ * <p>
+ * If no matching creator is found, delegates to the parent store's
resolve method.
+ *
+ * @param <T> The bean type.
+ * @param beanType The bean type to resolve.
+ * @param name The bean name. Can be <jk>null</jk>.
+ * @return The supplier, or {@link Optional#empty()} if no matching
creator or supplier exists.
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ protected <T> Optional<Supplier<T>> resolve(Class<T> beanType, String
name) {
+ // First check if there's a creator for the exact bean type
+ var creator = creators.get(beanType);
+ if (nn(creator)) {
+ return opt(() -> (T)creator.run());
+ }
+
+ // Check all creators for matching bean types (for inheritance)
+ for (var entry : creators.entrySet()) {
+ var creatorBeanType = entry.getKey();
+ var c = entry.getValue();
+
+ // Check if creator's bean type is assignable to the
requested type
+ // (i.e., creator creates a subtype that can be cast to
requested type)
+ if (nn(creatorBeanType) &&
beanType.isAssignableFrom(creatorBeanType)) {
+ return opt(() -> (T)c.run());
+ }
+
+ // Check builder types - if requested type matches a
builder type, return the creator
+ try {
+ var builderTypes = c.getBuilderTypes();
+ if (nn(builderTypes)) {
+ for (var builderType : builderTypes) {
+ if (nn(builderType) &&
builderType.is(beanType)) {
+ return opt(() ->
(T)c.getBuilder());
+ }
+ }
+ }
+ } catch (Exception e) {
+ // Skip creators that fail to get builder types
+ continue;
+ }
+ }
+
+ // If not found, delegate to parent
+ return super.resolve(beanType, name);
+ }
+
+ @Override
+ public CreatableBeanStore clear() {
+ super.clear();
+ creators.clear();
+ return this;
+ }
+}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
index b7576bc112..f9db4d4278 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
@@ -1997,8 +1997,7 @@ class BeanCreator2_Test extends TestBase {
var value = "test";
beanStore.add(String.class, value);
- var bean = bc(InnerBean.class)
- .enclosingInstance(outerInstance)
+ var bean = BeanCreator2.of(InnerBean.class, beanStore,
null, outerInstance)
.run();
assertEquals(value, bean.getValue());
@@ -2345,13 +2344,14 @@ class BeanCreator2_Test extends TestBase {
}
/**
- * Tests that enclosingInstance() returns this for method
chaining.
+ * Tests that enclosingInstance can be set via constructor.
*/
@Test
- void i06_enclosingInstanceReturnsThis() {
- var creator = BeanCreator2.of(InnerBean.class);
- var result = creator.enclosingInstance(new
BeanCreator2_Test());
- assertSame(creator, result);
+ void i06_enclosingInstanceCanBeSetViaConstructor() {
+ var outerInstance = new BeanCreator2_Test();
+ var creator = BeanCreator2.of(InnerBean.class, null,
null, outerInstance);
+ // Verify creator was created successfully
+ assertNotNull(creator);
}
/**
@@ -3464,22 +3464,22 @@ class BeanCreator2_Test extends TestBase {
}
/**
- * Tests that getName() returns the name set via name() method.
+ * Tests that getName() returns the name set via constructor.
*/
@Test
void p04_getNameReturnsSetName() {
- var creator = bc(SimpleBean.class).name("myBean");
+ var creator = BeanCreator2.of(SimpleBean.class,
beanStore, "myBean", null);
var name = creator.getName();
assertEquals("myBean", name);
}
/**
- * Tests that getName() returns null when name is explicitly
set to null via name(null).
+ * Tests that getName() returns null when name is set to null
via constructor.
*/
@Test
void p05_getNameReturnsNullWhenSetToNull() {
- var creator =
bc(SimpleBean.class).name("initial").name(null);
+ var creator = BeanCreator2.of(SimpleBean.class,
beanStore, null, null);
var name = creator.getName();
assertNull(name, "getName() should return null when
name is set to null");
@@ -3633,39 +3633,30 @@ class BeanCreator2_Test extends TestBase {
}
/**
- * Tests that name() sets the name and returns this for method
chaining.
+ * Tests that name can be set via constructor.
*/
@Test
- void p17_nameSetsNameAndReturnsThis() {
- var creator = BeanCreator2.of(SimpleBean.class);
- var result = creator.name("testBean");
+ void p17_nameCanBeSetViaConstructor() {
+ var creator = BeanCreator2.of(SimpleBean.class, null,
"testBean", null);
- // Should return this for method chaining
- assertSame(creator, result);
assertEquals("testBean", creator.getName());
}
/**
- * Tests that name() can accept null value to clear the name.
+ * Tests that name can be set to null via constructor.
*/
@Test
void p18_nameCanBeSetToNull() {
- var creator = bc(SimpleBean.class).name("initial");
- assertEquals("initial", creator.getName());
-
- creator.name(null);
- assertNull(creator.getName(), "name() should allow null
value");
+ var creator = BeanCreator2.of(SimpleBean.class,
beanStore, null, null);
+ assertNull(creator.getName(), "name should allow null
value");
}
/**
- * Tests that name() can be chained multiple times, with later
calls overriding earlier ones.
+ * Tests that name can be set via constructor.
*/
@Test
- void p19_nameCanBeChained() {
- var creator = bc(SimpleBean.class)
- .name("first")
- .name("second")
- .name("final");
+ void p19_nameCanBeSetViaConstructor() {
+ var creator = BeanCreator2.of(SimpleBean.class,
beanStore, "final", null);
assertEquals("final", creator.getName());
}