前面几篇文章简单的介绍了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参数就是我们需要获取的对象
以上是今天文章的所有内容,欢迎大家吐槽
推荐阅读
全网最全技术视频和电子书免费发放
更多优质文章请关注以下公众号查阅: