對於Bean來說,最佳的情況是它根本不知道自己是被Spring容器所管理,Bean可以作自己該從事的工作,而不會與Spring容器產生耦合。
然而有時候,您必須讓Bean知道容器管理它的一些細節,必須讓Bean知道自己在容器中是以哪個名稱所管理的,或者是讓它知道 BeanFactory、ApplicationContext 的存在,例如若Bean可以意識到ApplicationContext的存在的話,在Bean的某些動作發生時,可以發出事件讓感興趣的接受者來處理。
Spring中提供一些Aware相關介面,像是org.springframework.beans.factory.BeanNameAware、 org.springframework.beans.factory.BeanFactoryAware、 org.springframework.context.ApplicationContextAware等等,實作這些Aware介面的Bean在被初始之後,可以取得一些相對應的資源。
例如實作BeanNameAware介面的Bean,在屬性設定完成後、初始化方法之前(例如InitializingBean的 afterPropertiesSet()方法或自定義的init方法),會將Bean於定義檔中的名稱透過setBeanFactory()方法設定給 Bean:
package org.springframework.beans.factory;
public interface BeanNameAware {
public void setBeanName(String name);
}
實作BeanFactoryAware介面的Bean,在屬性設定完成後、初始化方法之前,Spring容器將會注入BeanFactory的實例:
package org.springframework.beans.factory;
public interface BeanFactoryAware {
public void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
而實作ApplicationContextAware的Bean,在Bean被初始後,將會被注入ApplicationContext的實例:
package org.springframework.context;
public interface ApplicationContextAware {
public void setApplicationContext(ApplicationContext context) throws BeansException;
}
另外還有org.springframework.context.ResourceLoaderAware介面,可以讓Bean取得ResourceLoader實例,並進一步取得相關的資源檔案。
然而必須注意的是,一但Bean意識到Spring的相關資源,就表示Bean開始與Spring產生耦合,因而就不易移植至其它的應用程式或框架之中。
然而有時候,您必須讓Bean知道容器管理它的一些細節,必須讓Bean知道自己在容器中是以哪個名稱所管理的,或者是讓它知道 BeanFactory、ApplicationContext 的存在,例如若Bean可以意識到ApplicationContext的存在的話,在Bean的某些動作發生時,可以發出事件讓感興趣的接受者來處理。
Spring中提供一些Aware相關介面,像是org.springframework.beans.factory.BeanNameAware、 org.springframework.beans.factory.BeanFactoryAware、 org.springframework.context.ApplicationContextAware等等,實作這些Aware介面的Bean在被初始之後,可以取得一些相對應的資源。
例如實作BeanNameAware介面的Bean,在屬性設定完成後、初始化方法之前(例如InitializingBean的 afterPropertiesSet()方法或自定義的init方法),會將Bean於定義檔中的名稱透過setBeanFactory()方法設定給 Bean:
package org.springframework.beans.factory;
public interface BeanNameAware {
public void setBeanName(String name);
}
實作BeanFactoryAware介面的Bean,在屬性設定完成後、初始化方法之前,Spring容器將會注入BeanFactory的實例:
package org.springframework.beans.factory;
public interface BeanFactoryAware {
public void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
而實作ApplicationContextAware的Bean,在Bean被初始後,將會被注入ApplicationContext的實例:
package org.springframework.context;
public interface ApplicationContextAware {
public void setApplicationContext(ApplicationContext context) throws BeansException;
}
另外還有org.springframework.context.ResourceLoaderAware介面,可以讓Bean取得ResourceLoader實例,並進一步取得相關的資源檔案。
然而必須注意的是,一但Bean意識到Spring的相關資源,就表示Bean開始與Spring產生耦合,因而就不易移植至其它的應用程式或框架之中。