1. 程式人生 > 實用技巧 >java使用jpinyin漢語轉拼音(支援多音字)

java使用jpinyin漢語轉拼音(支援多音字)

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;
    public
MyBean() { this.message = "通過構造方法初始化例項"; } @Override public Object getObject() throws Exception { MyBean myBean = new MyBean(); // 這裡可以做一些複雜的操作,比如解析資源等IOC沒辦法實現的情況 // 這裡並不一定要返回MyBean自身的例項,可以是其他任何物件的例項如:SqlSessionFactory return myBean; } @Override
public 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之後.