hive視覺化工具dbeaver
FactoryBean介面
Spring中有兩種型別的Bean:一種是普通的JavaBean;另一種就是工廠Bean(FactoryBean),這兩種Bean都受Spring的IoC容器管理。
FactoryBean 是一個特殊的bean,要想得到FactoryBean本身,必須通過&FactoryBeanName,可以在BeanFactory中通過getBean(&FactoryBeanName)來得到 FactoryBean。
一般來說我們自己寫的Bean在只繼承自己的介面時建立Bean的過程是交給IOC容器來實現的。但是某些特殊情況如果單純的交給Spring的IOC容器來實現會配置非常複雜有時甚至沒辦法實現。所以這種情況下Spring為我們提供了FactoryBean這個介面來實現這個建立的過程。
public interface FactoryBean<T> { //獲取FactoryBean初始化的Bean例項 T getObject() throws Exception; //獲取Bean例項的型別 Class<?> getObjectType(); //判斷是否是單例模式 boolean isSingleton(); }
示例:
@Component public class MyBean implements FactoryBean { private String message; publicMyBean() { this.message = "通過構造方法初始化例項"; } @Override public Object getObject() throws Exception { MyBean myBean = new MyBean(); // 這裡可以做一些複雜的操作,比如解析資源等IOC沒辦法實現的情況 // 這裡並不一定要返回MyBean自身的例項,可以是其他任何物件的例項如:SqlSessionFactory return myBean; } @Overridepublic Class<?> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return false; } }
BeanFactory介面
BeanFactory有三個是子類:AutowireCapableBeanFactory,HierarchicalBeanFactory,ListableBeanFactory。最終的預設實現類是 DefaultListableBeanFactory。
BeanFactory介面是Spring bean容器(也就是IoC容器)的核心根介面,主要是用於建立bean的工廠介面,其定義的介面方法分為以下幾個部分:獲取bean例項、判斷容器中是否包含某個bean、判斷例項是否為單列模式或則原型模式、型別匹配、例項型別、獲取別名。
// 用於區分FactoryBean例項,列如:如果myJndiObject是一個FactoryBean,通過 &myJndiObject獲取返回的是工廠,而不是工廠返回的例項。 String FACTORY_BEAN_PREFIX = "&"; // 獲取bean Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; // 獲取bean的提供者(物件工廠) <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); boolean containsBean(String name); // 是否包含指定名字的bean boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 是否為單例 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 是否為原型 // 指定名字的bean是否和指定的型別匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch); boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 獲取指定名字的bean的型別 String[] getAliases(String name); // 獲取指定名字的bean的所有別名
BeanDefinition介面
管理每個bean的定義資訊,容器啟動的時候,spring會將配置檔案中定以的資訊或則使用註解(如@Componet @Service @Controller等)定義的bean封裝成一個個 BeanDefinition 物件,每個bean對應一個BeanDefinition物件,在物件例項化期間,使用bean對應的BeanDenifition物件通過反射生成例項物件。BeanDefinition介面方法用來管理bean的屬性資訊。
BeanDefinition介面中的屬性資訊跟xml配置檔案中的標籤中的屬性一一對應,也就是說一個BeanDefinition對應一個標籤資訊。在容器啟動的時候,就會先將標籤資訊解析封裝成BeanDefinition介面實現類物件。
BeanDefinition有一個子介面 AnnotatedBeanDefinition;三個間接實現類,分別是RootBeanFactory、ChildBeanFactory和GenericBeanDefinition。其中RootBeanFactory是用來封裝父類定義資訊(沒有顯示繼承其他類的類)、ChildBeanDefinition是用來封裝子類定義資訊。
BeanDefinitionRegistry介面
定義了關於 BeanDefinition 的註冊、移除、查詢等一系列的操作。BeanDefinition 最終註冊的容器為 DefaultListableBeanFactory下
/** Map of bean definition objects, keyed by bean name. */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); /** Map from bean name to merged BeanDefinitionHolder. */ private final Map<String, BeanDefinitionHolder> mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256); /** Map of singleton and non-singleton bean names, keyed by dependency type. */ private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); /** Map of singleton-only bean names, keyed by dependency type. */ private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64); /** List of bean definition names, in registration order. */ private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
4. BeanDefinitionRegistryPostProcessor介面: bean的註冊資訊的註冊後置處理器; 在所有bean定義資訊將要被載入,bean例項還未建立的,也就是說在BeanFactoryPostProcessor方法執行之前執行的.
1. BeanFactoryPostProcessor介面: Spring允許BeanFactoryPostProcessor在容器例項化任何其它bean之前讀取配置元資料,並可以根據需要進行修改;同時配置多個BeanFactoryPostProcessor,並通過設定'order'屬性來控制各個BeanFactoryPostProcessor的執行次序
2. BeanPostProcessor介面:在spring容器載入了bean的定義檔案並且在呼叫初始化方法前後執行的;初始化方法的執行順序是,先執行afterPropertiesSet,再執行init-method。BeanPostProcessor的執行順序是在BeanFactoryPostProcessor之後.