Spring容器啟動(dòng)時(shí),為什么先加載BeanFactoryPostProcess
- 因?yàn)锽eanDefinition會(huì)在ioc容器加載的時(shí)候先注冊(cè), 而BeanFactoryPostProcess就是在所有的BeanDefinition注冊(cè)完后做擴(kuò)展的,所以要先加載BeanFactoryPostProcess
- 解析配置類的組件 它就實(shí)現(xiàn)BeanFactoryPostProcess, 所以要先去加載BeanFactoryPostProcess
Bean獲取方式
- 方式一:通過BeanFactory獲取
- 方式二 :通過BeanFactoryAware獲取
- 方式三:?jiǎn)?dòng)獲取ApplicationContext
- 方式四:通過繼承ApplicationObjectSupport
- 方式五:通過繼承WebApplicationObjectSupport
- 方式六:通過WebApplicationContextUtils
- 方式七:通過ApplicationContextAware
- 方式八:通過ContextLoader
使用ContextLoader提供的getCurrentWebApplicationContext方法,也是常用的獲取WebApplicationContext的一種方法。
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
wac.getBean(beanID);
- 方式九:通過BeanFactoryPostProcessor
Spring工具類,方便在非Spring管理環(huán)境中獲取Bean。
@Componentpublic
final class SpringUtils implements BeanFactoryPostProcessor {
/**
* Spring應(yīng)用上下文環(huán)境
*/
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtilsS.beanFactory = beanFactory;
}
/**
* 獲取對(duì)象 * * @param name * @return Object 一個(gè)以所給名字注冊(cè)的bean的實(shí)例 * @throws BeansException *
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) beanFactory.getBean(name);
}
/**
* 獲取類型為requiredType的對(duì)象 * * @param clz * @return * @throws BeansException *
*/
public static <T> T getBean(Class<T> clz) throws BeansException {
T result = (T) beanFactory.getBean(clz);
return result;
}
/**
* 如果BeanFactory包含一個(gè)與所給名稱匹配的bean定義,則返回true * * @param name * @return boolean
*/
public static boolean containsBean(String name) {
return beanFactory.containsBean(name);
}
/**
* 判斷以給定名字注冊(cè)的bean定義是一個(gè)singleton還是一個(gè)prototype。 如果與給定名字相應(yīng)的bean定義沒有被找到,將會(huì)拋出一個(gè)異常(NoSuchBeanDefinitionException) * * @param name * @return boolean * @throws NoSuchBeanDefinitionException *
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return beanFactory.isSingleton(name);
}
/**
* @param name * @return Class 注冊(cè)對(duì)象的類型 * @throws NoSuchBeanDefinitionException *
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getType(name);
}
/**
* 如果給定的bean名字在bean定義中有別名,則返回這些別名 * * @param name * @return * @throws NoSuchBeanDefinitionException *
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return beanFactory.getAliases(name);
}
/**
* 獲取aop代理對(duì)象 * * @param invoker * @return
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker) {
return (T) AopContext.currentProxy();
}
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764177.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764177.html
到了這里,關(guān)于31、Spring容器啟動(dòng)時(shí),為什么先加載BeanFactoryPostProcess的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!