了解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参数就是我们需要获取的对象
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦