Last active
April 6, 2021 02:18
-
-
Save HydrangeaPurple/0d7df1c0335d820eab1279ae8cb847a1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.tydic.service.util; | |
import org.springframework.beans.BeansException; | |
import org.springframework.beans.factory.*; | |
import org.springframework.context.ApplicationContext; | |
import org.springframework.context.ApplicationContextAware; | |
import org.springframework.core.ResolvableType; | |
import org.springframework.lang.NonNull; | |
import org.springframework.lang.Nullable; | |
import org.springframework.stereotype.Component; | |
@Component | |
public class SpringContextUtils implements ApplicationContextAware { | |
/** | |
* spring上下文 | |
*/ | |
private static ApplicationContext context; | |
@Override | |
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { | |
context = applicationContext; | |
} | |
private static ApplicationContext getContext() { | |
if (context == null) { | |
System.err.println("SpringContextUtils 未初始化"); | |
throw new RuntimeException("SpringContextUtils 未初始化"); | |
} | |
return context; | |
} | |
/** | |
* 返回一个实例,该实例可以是指定bean的共享或独立的。 | |
* 此方法允许使用Spring BeanFactory替代Singleton单例或Prototype设计模式。 | |
* 对于Singleton bean,调用者可以保留对返回对象的引用。 | |
* 将别名转换回相应的规范bean名称。 | |
* 将询问父工厂是否在该工厂实例中找不到该bean。 | |
* | |
* @param name 要检索的bean的名字 | |
* @return 一个bean的实例 | |
* @throws NoSuchBeanDefinitionException 如果没有指定名称的bean | |
* @throws BeansException 如果无法获得bean | |
*/ | |
public static Object getBean(String name) throws BeansException { | |
return getContext().getBean(name); | |
} | |
/** | |
* Return an instance, which may be shared or independent, of the specified bean. | |
* <p>Behaves the same as {@link #getBean(String)}, but provides a measure of type | |
* safety by throwing a BeanNotOfRequiredTypeException if the bean is not of the | |
* required type. This means that ClassCastException can't be thrown on casting | |
* the result correctly, as can happen with {@link #getBean(String)}. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to retrieve | |
* @param requiredType type the bean must match; can be an interface or superclass | |
* @return an instance of the bean | |
* @throws NoSuchBeanDefinitionException if there is no such bean definition | |
* @throws BeanNotOfRequiredTypeException if the bean is not of the required type | |
* @throws BeansException if the bean could not be created | |
*/ | |
public static <T> T getBean(String name, Class<T> requiredType) throws BeansException { | |
return getContext().getBean(name, requiredType); | |
} | |
/** | |
* Return an instance, which may be shared or independent, of the specified bean. | |
* <p>Allows for specifying explicit constructor arguments / factory method arguments, | |
* overriding the specified default arguments (if any) in the bean definition. | |
* | |
* @param name the name of the bean to retrieve | |
* @param args arguments to use when creating a bean instance using explicit arguments | |
* (only applied when creating a new instance as opposed to retrieving an existing one) | |
* @return an instance of the bean | |
* @throws NoSuchBeanDefinitionException if there is no such bean definition | |
* @throws BeanDefinitionStoreException if arguments have been given but | |
* the affected bean isn't a prototype | |
* @throws BeansException if the bean could not be created | |
* @since 2.5 | |
*/ | |
public static Object getBean(String name, Object... args) throws BeansException { | |
return getContext().getBean(name, args); | |
} | |
/** | |
* Return the bean instance that uniquely matches the given object type, if any. | |
* <p>This method goes into {@link ListableBeanFactory} by-type lookup territory | |
* but may also be translated into a conventional by-name lookup based on the name | |
* of the given type. For more extensive retrieval operations across sets of beans, | |
* use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. | |
* | |
* @param requiredType type the bean must match; can be an interface or superclass | |
* @return an instance of the single bean matching the required type | |
* @throws NoSuchBeanDefinitionException if no bean of the given type was found | |
* @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found | |
* @throws BeansException if the bean could not be created | |
* @see ListableBeanFactory | |
* @since 3.0 | |
*/ | |
public static <T> T getBean(Class<T> requiredType) throws BeansException { | |
return getContext().getBean(requiredType); | |
} | |
/** | |
* Return an instance, which may be shared or independent, of the specified bean. | |
* <p>Allows for specifying explicit constructor arguments / factory method arguments, | |
* overriding the specified default arguments (if any) in the bean definition. | |
* <p>This method goes into {@link ListableBeanFactory} by-type lookup territory | |
* but may also be translated into a conventional by-name lookup based on the name | |
* of the given type. For more extensive retrieval operations across sets of beans, | |
* use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. | |
* | |
* @param requiredType type the bean must match; can be an interface or superclass | |
* @param args arguments to use when creating a bean instance using explicit arguments | |
* (only applied when creating a new instance as opposed to retrieving an existing one) | |
* @return an instance of the bean | |
* @throws NoSuchBeanDefinitionException if there is no such bean definition | |
* @throws BeanDefinitionStoreException if arguments have been given but | |
* the affected bean isn't a prototype | |
* @throws BeansException if the bean could not be created | |
* @since 4.1 | |
*/ | |
public static <T> T getBean(Class<T> requiredType, Object... args) throws BeansException { | |
return getContext().getBean(requiredType, args); | |
} | |
/** | |
* Return a provider for the specified bean, allowing for lazy on-demand retrieval | |
* of instances, including availability and uniqueness options. | |
* | |
* @param requiredType type the bean must match; can be an interface or superclass | |
* @return a corresponding provider handle | |
* @see #getBeanProvider(ResolvableType) | |
* @since 5.1 | |
*/ | |
public static <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType) { | |
return getContext().getBeanProvider(requiredType); | |
} | |
/** | |
* Return a provider for the specified bean, allowing for lazy on-demand retrieval | |
* of instances, including availability and uniqueness options. | |
* | |
* @param requiredType type the bean must match; can be a generic type declaration. | |
* Note that collection types are not supported here, in contrast to reflective | |
* injection points. For programmatically retrieving a list of beans matching a | |
* specific type, specify the actual bean type as an argument here and subsequently | |
* use {@link ObjectProvider#orderedStream()} or its lazy streaming/iteration options. | |
* @return a corresponding provider handle | |
* @see ObjectProvider#iterator() | |
* @see ObjectProvider#stream() | |
* @see ObjectProvider#orderedStream() | |
* @since 5.1 | |
*/ | |
public static <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) { | |
return getContext().getBeanProvider(requiredType); | |
} | |
/** | |
* Does this bean factory contain a bean definition or externally registered singleton | |
* instance with the given name? | |
* <p>If the given name is an alias, it will be translated back to the corresponding | |
* canonical bean name. | |
* <p>If this factory is hierarchical, will ask any parent factory if the bean cannot | |
* be found in this factory instance. | |
* <p>If a bean definition or singleton instance matching the given name is found, | |
* this method will return {@code true} whether the named bean definition is concrete | |
* or abstract, lazy or eager, in scope or not. Therefore, note that a {@code true} | |
* return value from this method does not necessarily indicate that {@link #getBean} | |
* will be able to obtain an instance for the same name. | |
* | |
* @param name the name of the bean to query | |
* @return whether a bean with the given name is present | |
*/ | |
public static boolean containsBean(String name) { | |
return getContext().containsBean(name); | |
} | |
/** | |
* Is this bean a shared singleton? That is, will {@link #getBean} always | |
* return the same instance? | |
* <p>Note: This method returning {@code false} does not clearly indicate | |
* independent instances. It indicates non-singleton instances, which may correspond | |
* to a scoped bean as well. Use the {@link #isPrototype} operation to explicitly | |
* check for independent instances. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @return whether this bean corresponds to a singleton instance | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #isPrototype | |
*/ | |
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { | |
return getContext().isSingleton(name); | |
} | |
/** | |
* Is this bean a prototype? That is, will {@link #getBean} always return | |
* independent instances? | |
* <p>Note: This method returning {@code false} does not clearly indicate | |
* a singleton object. It indicates non-independent instances, which may correspond | |
* to a scoped bean as well. Use the {@link #isSingleton} operation to explicitly | |
* check for a shared singleton instance. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @return whether this bean will always deliver independent instances | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #isSingleton | |
* @since 2.0.3 | |
*/ | |
public static boolean isPrototype(String name) throws NoSuchBeanDefinitionException { | |
return getContext().isPrototype(name); | |
} | |
/** | |
* Check whether the bean with the given name matches the specified type. | |
* More specifically, check whether a {@link #getBean} call for the given name | |
* would return an object that is assignable to the specified target type. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @param typeToMatch the type to match against (as a {@code ResolvableType}) | |
* @return {@code true} if the bean type matches, | |
* {@code false} if it doesn't match or cannot be determined yet | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #getType | |
* @since 4.2 | |
*/ | |
public static boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException { | |
return getContext().isTypeMatch(name, typeToMatch); | |
} | |
/** | |
* Check whether the bean with the given name matches the specified type. | |
* More specifically, check whether a {@link #getBean} call for the given name | |
* would return an object that is assignable to the specified target type. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @param typeToMatch the type to match against (as a {@code Class}) | |
* @return {@code true} if the bean type matches, | |
* {@code false} if it doesn't match or cannot be determined yet | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #getType | |
* @since 2.0.1 | |
*/ | |
public static boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException { | |
return getContext().isTypeMatch(name, typeToMatch); | |
} | |
/** | |
* Determine the type of the bean with the given name. More specifically, | |
* determine the type of object that {@link #getBean} would return for the given name. | |
* <p>For a {@link FactoryBean}, return the type of object that the FactoryBean creates, | |
* as exposed by {@link FactoryBean#getObjectType()}. This may lead to the initialization | |
* of a previously uninitialized {@code FactoryBean} (see {@link #getType(String, boolean)}). | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @return the type of the bean, or {@code null} if not determinable | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #isTypeMatch | |
* @since 1.1.2 | |
*/ | |
@Nullable | |
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException { | |
return getContext().getType(name); | |
} | |
/** | |
* Determine the type of the bean with the given name. More specifically, | |
* determine the type of object that {@link #getBean} would return for the given name. | |
* <p>For a {@link FactoryBean}, return the type of object that the FactoryBean creates, | |
* as exposed by {@link FactoryBean#getObjectType()}. Depending on the | |
* {@code allowFactoryBeanInit} flag, this may lead to the initialization of a previously | |
* uninitialized {@code FactoryBean} if no early type information is available. | |
* <p>Translates aliases back to the corresponding canonical bean name. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the name of the bean to query | |
* @param allowFactoryBeanInit whether a {@code FactoryBean} may get initialized | |
* just for the purpose of determining its object type | |
* @return the type of the bean, or {@code null} if not determinable | |
* @throws NoSuchBeanDefinitionException if there is no bean with the given name | |
* @see #getBean | |
* @see #isTypeMatch | |
* @since 5.2 | |
*/ | |
@Nullable | |
public static Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { | |
return getContext().getType(name, allowFactoryBeanInit); | |
} | |
/** | |
* Return the aliases for the given bean name, if any. | |
* <p>All of those aliases point to the same bean when used in a {@link #getBean} call. | |
* <p>If the given name is an alias, the corresponding original bean name | |
* and other aliases (if any) will be returned, with the original bean name | |
* being the first element in the array. | |
* <p>Will ask the parent factory if the bean cannot be found in this factory instance. | |
* | |
* @param name the bean name to check for aliases | |
* @return the aliases, or an empty array if none | |
* @see #getBean | |
*/ | |
public static String[] getAliases(String name) { | |
return getContext().getAliases(name); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment