bean建立過程、spring BeanFactory的實現、spring aware

Bean的建立過程:
spring

image.png

Spring beanFactory的工廠模式實現:api

    解析<bean>標籤,存到一個Map<String, Object> beans中app

    People o = (People)factory.getBean("p");ide

    由於map存的是object類型,因此取出時須要強制類型轉換this

Bean的生命週期:spa

image.png

spring aware的目的是爲了讓Bean得到spring容器的服務,bean繼承applicationContextAware能夠得到spring容器的全部服務,但原則上仍是用到什麼接口,繼承什麼接口。(如beanNameAware,BeanFactoryAware...)繼承

beanNameAware接口:得到自己bean的id屬性。接口

    void setBeanName(String name)生命週期

    該方法的name參數就是該bean的id屬性,調用setBeanName方法可讓bean獲取得自身的id屬性資源

@Service public class BeanNameAwareTest implements BeanNameAware {   

    private String name;    

    @Override    

    public void setBeanName(String name) { 

        System.out.println("setBeanName方法,id是"+name);        

        this.name = name;    

    }    

    public String getBeanName() {        

        return this.name;    

    } 

}

獲取bean:

@Autowired private BeanNameAwareTest beanNameAwareTest; 

public void aware()  {   

    System.out.println("beanName:"+beanNameAwareTest.getBeanName()); 

    beanNameAwareTest.setBeanName("beanName"); 

    System.out.println("beanName:"+beanNameAwareTest.getBeanName()); 

}

結果:

    setBeanName方法,id是beanNameAwareTest//bean被實例化時自動調用的

    beanName:beanNameAwareTest

    setBeanName方法,id是beanName//手動調用的setBeanName方法   beanName:beanName


BeanFactoryAware接口:相應的beanfactory的實例引用

    void setBeanFactory(BeanFactory beanFactory)

    經過這個方法的參數建立它的BeanFactory實例,實現了BeanFactoryAware接口,就可讓Bean擁有訪問Spring容器的能力。缺點:致使代碼與spring的api耦合在一塊兒。

@Service 

public class BeanFactoryAwareTest implements BeanFactoryAware {    

    private BeanFactory beanFactory;    

    @Override    

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {            

        this.beanFactory = beanFactory;    

    } 

}

獲取bean工廠進行bean操做:

@Autowired 

private BeanFactoryAwareTest beanFactoryAwareTest; 

public void aware()  {        

    System.out.println("經過bean工廠獲得一個bean:"+beanFactoryAwareTest.getBeanFactory().getBean("beanFactoryAwareTest")); 

}


ApplicationContextAware接口:被注入applicationContext實例

    setApplicationContext(ApplicationContext context)

    使用參數context用來建立它的applicationContext實例,缺點:致使代碼與spring的api耦合在一塊兒。

public class ContextAwareTest implements ApplicationContextAware{

        @Override

    public void setApplicationContext(ApplicationContext arg0){

          applicationContext = arg0;

          People= (People)applicationContext.getBean("people");

        }

}

使用場景:

image.png

    好比,根據環境的不一樣,target須要對應不一樣的資源,能夠首先加載一個source類,其中有一個與環境有關的屬性mode;

    獲得beanFactory,getBean(source)再對其mode屬性判斷,作出不一樣的處理,get相同的bean,賦給target

相關文章
相關標籤/搜索