/** * Create a {@link BeanReference} referencing a bean instance directly. * * @param instance The bean instance. Must not be null. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> ofInstance(T instance) { return new InstanceBeanReference<>( instance ); }
/** * @param instance The bean instance. * @param <T> The type of the bean instance. * @return A {@link BeanHolder} whose {@link #get()} method returns the given instance, * and whose {@link #close()} method does not do anything. */ static <T> BeanHolder<T> of(T instance) { return new SimpleBeanHolder<>( instance ); }
/** * Cast this reference into a reference whose {@link #getBean(BeanProvider)} method is is guaranteed to * either fail or return an instance of the given type. * * @param expectedType The expected bean type. * @param <U> The expected bean type. * @return A bean reference. * @throws ClassCastException If this reference is certain to never return an instance of the given type. */ default <U> BeanReference<? extends U> asSubTypeOf(Class<U> expectedType) { return new CastingBeanReference<>( this, expectedType ); }
@Override public Object build(MarkerBuildContext buildContext) { try ( BeanHolder<? extends AnnotationMarkerBuilder> delegateHolder = delegateReference.getBean( buildContext.getBeanProvider() ) ) { /* * TODO HSEARCH-3077 make this raw type use safer by checking the generic parameters of delegate.getClass() somehow, * maybe in a similar way to what we do in PojoIndexModelBinderImpl#addValueBridge, * and throwing an exception with a detailed explanation if something is wrong. */ delegateHolder.get().initialize( annotation ); return delegateHolder.get().build( buildContext ); } }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return BeanHolder.of( instance ); }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return beanProvider.getBean( type, name ); }
/** * Create a {@link BeanReference} referencing a bean by type and name. * * @param type The bean type. Must not be null. * @param name The bean name. May be null or empty. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> of(Class<T> type, String name) { if ( StringHelper.isNotEmpty( name ) ) { return new TypeAndNameBeanReference<>( type, name ); } else { return new TypeBeanReference<>( type ); } }
/** * Create a {@link BeanReference} referencing a bean by its type only. * * @param type The bean type. Must not be null. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> of(Class<T> type) { return new TypeBeanReference<>( type ); }
/** * @param beanHolders The bean holders. * @param <T> The type of the bean instances. * @return A {@link BeanHolder} whose {@link #get()} method returns a list containing * the instance of each given bean holder, in order, * and whose {@link #close()} method closes every given bean holder. */ static <T> BeanHolder<List<T>> of(List<? extends BeanHolder<? extends T>> beanHolders) { return new CompositeBeanHolder<>( beanHolders ); }
@Override public Object build(MarkerBuildContext buildContext) { try ( BeanHolder<? extends AnnotationMarkerBuilder> delegateHolder = delegateReference.getBean( buildContext.getBeanProvider() ) ) { /* * TODO HSEARCH-3077 make this raw type use safer by checking the generic parameters of delegate.getClass() somehow, * maybe in a similar way to what we do in PojoIndexModelBinderImpl#addValueBridge, * and throwing an exception with a detailed explanation if something is wrong. */ delegateHolder.get().initialize( annotation ); return delegateHolder.get().build( buildContext ); } }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return BeanHolder.of( instance ); }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return beanProvider.getBean( type ); }
/** * Create a {@link BeanReference} referencing a bean by type and name. * * @param type The bean type. Must not be null. * @param name The bean name. May be null or empty. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> of(Class<T> type, String name) { if ( StringHelper.isNotEmpty( name ) ) { return new TypeAndNameBeanReference<>( type, name ); } else { return new TypeBeanReference<>( type ); } }
/** * Create a {@link BeanReference} referencing a bean instance directly. * * @param instance The bean instance. Must not be null. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> ofInstance(T instance) { return new InstanceBeanReference<>( instance ); }
/** * @param instance The bean instance. * @param <T> The type of the bean instance. * @return A {@link BeanHolder} whose {@link #get()} method returns the given instance, * and whose {@link #close()} method does not do anything. */ static <T> BeanHolder<T> of(T instance) { return new SimpleBeanHolder<>( instance ); }
/** * Cast this reference into a reference whose {@link #getBean(BeanProvider)} method is is guaranteed to * either fail or return an instance of the given type. * * @param expectedType The expected bean type. * @param <U> The expected bean type. * @return A bean reference. * @throws ClassCastException If this reference is certain to never return an instance of the given type. */ default <U> BeanReference<? extends U> asSubTypeOf(Class<U> expectedType) { return new CastingBeanReference<>( this, expectedType ); }
/** * Create a {@link BeanReference} referencing a bean by its type only. * * @param type The bean type. Must not be null. * @return The corresponding {@link BeanReference}. */ static <T> BeanReference<T> of(Class<T> type) { return new TypeBeanReference<>( type ); }
/** * @param beanHolders The bean holders. * @param <T> The type of the bean instances. * @return A {@link BeanHolder} whose {@link #get()} method returns a list containing * the instance of each given bean holder, in order, * and whose {@link #close()} method closes every given bean holder. */ static <T> BeanHolder<List<T>> of(List<? extends BeanHolder<? extends T>> beanHolders) { return new CompositeBeanHolder<>( beanHolders ); }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return beanProvider.getBean( type ); }
@Override public BeanHolder<T> getBean(BeanProvider beanProvider) { return beanProvider.getBean( type, name ); }