前面幾篇文章簡單的介紹了spring中bean註解以及怎麼在spring實現bean自動注入對應的bean,未查看的同學可以點擊查看:
深入理解spring註解之@Bean註解
三分鐘瞭解spring-bean生命週期之初始化和銷燬的三種方式
三分鐘學會@Autowired@Qualifier@Primary註解
一分鐘學會spring註解之@Autowired註解(二)
瞭解spring容器的IOC(依賴注入)的同學應該知道,我們的所有的bean對於spring容器是無意識的,啥叫無意識呢,就是你完全可以把spring容器替換成其他的容器而不需要改變你的代碼,並且bean之間也是沒有耦合的,既然這樣,那問題就來,假如現在我們需要對spring有意識,換句話說就是現在我們的業務可能需要用到spring底層的一些功能那麼我們該怎麼實現?這個其實優秀的spring框架早就幫我們想到了,那就是spring提供了一系列的xxxAware接口供我們自己來實現使用
首先我來看一張圖如下:
從這個圖中我們可以看到spring給我們提供了多達12種Aware接口,這邊我們主要演示一下BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware的使用,其他的xxxAware感興趣的同學可以自己下去試試
首先我們新建一個MyAware如下:
/**
* 定義一個繼承了BeanNameAware,
* ResourceLoaderAware,
* ApplicationContextAware,
* BeanFactoryAware
* 的bean
* @author zhangqh
* @date 2018年5月19日
*/
public class MyAware implements BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware{
private String beanName;
private ResourceLoader loader;
private ApplicationContext applicationContext;
private BeanFactory beanFactory;
// BeanFactoryAware中的方法
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
// ApplicationContextAware中的方法
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
// ResourceLoaderAware中的方法
public void setResourceLoader(ResourceLoader resourceLoader) {
this.loader = resourceLoader;
}
public void printResult() throws IOException {
System.out.println("BeanNameAware Bean的名稱是:" + beanName);
Resource resource = loader.getResource("classpath:test.txt");
System.out.println("----------------------------------------" );
System.out.print("ResourceLoaderAware ResourceLoader加載的內容是:");
String line = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(
resource.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
Environment environment = applicationContext.getEnvironment();
System.out.println("----------------------------------------" );
System.out.println("ApplicationContextAware 系統是:" + environment.getProperty("os.name"));
boolean flow = beanFactory.isSingleton(beanName);
System.out.println("----------------------------------------" );
System.out.println("BeanFactoryAware bean【" + beanName+" 】是單例嘛:"+flow);
}
// BeanNameAware中的方法
public void setBeanName(String name) {
this.beanName = name;
}
}
src\main\resources目錄下邊我們有一個test.txt文件內容是:
i'm test data
測試方法如下:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainScanConfig.class);
MyAware myAware = (MyAware) applicationContext2.getBean("myAware");
myAware.printResult();
運行結果如下:
BeanNameAware Bean的名稱是:myAware
----------------------------------------
ResourceLoaderAware ResourceLoader加載的內容是:i'm test data
----------------------------------------
ApplicationContextAware 系統是:Windows 7
----------------------------------------
BeanFactoryAware bean【myAware 】是單例嘛:true
從以上測試結果可以發現我們需要注入spring相關的服務已經成功的加入到了我們自定義的MyAware中了
好了,看了這麼的我們稍微簡單的總結下xxxAware接口
都是Aware接口的子接口,即都繼承了Aware接口
父接口Aware中沒有定義任何方法
接口內均定義了一個set方法,set參數就是我們需要獲取的對象
以上是今天文章的所有內容,歡迎大家吐槽
推薦閱讀
全網最全技術視頻和電子書免費發放
更多優質文章請關注以下公衆號查閱: