Spring Boot实战笔记(五)-- Spring高级话题(Spring Aware)
一、Spring Aware
Spring 依赖注入的最大亮点就是你所有的 Bean 对 Spring容器的存在是没有意识的。即你可以将你的容器替换成其他的容器,如Google Guice,这时 Bean 之间的耦合度很低。
但在实际项目中,你不可避免的要用到Spring容器本身的功能资源,这时你的 Bean 必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的 Spring Aware。其实 Spring Aware 本来就是 Spring 设计用来框架内部使用的,若使用了 Spring Aware,你的 Bean 将和 Spring框架耦合。
Spring 提供的 Aware 接口:
- BeanNameAware 获取容器中Bean的名称
- BeanFactoryAware 获取当前的 bean factory,这样可以调用容器的服务
- ApplicationContextAware 获取当前的 application context,这样可以调用容器服务
- MessageSourceAware 获得 message source,这样可以获得文本信息
- ApplicationEventPublisherAware 应用事件发布器,可以发布事件,前面提到的 DemoPulisher 也可实现这个接口来发布事件
- ResourceLoaderAware 获得资源加载器,可以获得外部资源文件
Spring Aware的目的是为了让 Bean 获得 Spring 容器的服务。因为 ApplicationContext 接口集成了 MessageSource接口、ApplicationEventPublisher接口 和 ResourceLoader接口,所以Bean继承 ApplicationContextAware 就可以获得Spring容器的所有服务,但原则上o们还是用到什么接口,就实现什么接口。
示例:
1.准备。在aware文件下新建一个test.txt,内容随意,给下面的外部资源加载使用
2.Spring Aware演示Bean
package com.ecworking.aware; import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service; import java.io.IOException; @Service
public class AwareService implements BeanNameAware,ResourceLoaderAware{ // 实现BeanNameAware和ResourceLoaderAware接口,获得Bean名称和资源加载的服务 private String beanName; private ResourceLoader loader; @Override
public void setBeanName(String beanName) { // 实现BeanNameAware需重写setBeanName方法
this.beanName = beanName;
} @Override
public void setResourceLoader(ResourceLoader loader) { // 实现ResourceLoaderAware需重写setResourceLoader方法
this.loader = loader;
} public void outputResult(){
System.out.println("Bean的名称为:" + beanName); Resource resource = loader.getResource("classpath:com/ecworking/aware/test.txt"); try {
System.out.println("ResourceLoader加载的文件内容为:" + IOUtils.toString(resource.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.配置类
package com.ecworking.aware; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan("com.ecworking.aware")
public class AwareConfig {
}
4.运行
package com.ecworking.aware; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main {
public static void main(String[] args){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class); AwareService service = context.getBean(AwareService.class); service.outputResult(); context.close();
}
}
运行结果:
Spring Boot实战笔记(五)-- Spring高级话题(Spring Aware)的更多相关文章
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...
- Spring Boot实战笔记(一)-- Spring简介
一.Spring 概述 Spring框架是一个轻量级的企业级开发的一站式解决方案.所谓的解决方案就是可以基于Spring解决所有的Java EE开发的所有问题. Spring框架主要提供了Ioc(In ...
- JavaEE开发的颠覆者 Spring Boot实战--笔记
1.Spring boot的三种启动模式 Spring 的问题 Spring boot的特点,没有特别的地方 1.Spring 基础 PS:关于spring配置 PS: 现在都已经使用 java配置, ...
- Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
一.Bean的Scope Scope描述的是Spring容器如何新建Bean实例的.Spring的Scope有以下几种,通过@Scope注解来实现. (1)Singleton:一个Spring容器中只 ...
- Spring Boot学习笔记(五)整合mybatis
pom文件里添加依赖 <!-- 数据库需要的依赖 --> <dependency> <groupId>org.mybatis.spring.boot</gro ...
- spring boot 实战笔记(一)
spring 概述: Bean :每一个被 Spring 管理的 JAVA对象,都称之为 Bean.Spring提供一个IoC容器来初始化对象,负责创建Bean, 解决对象之间的依赖管理和对象的使用. ...
- spring boot学习笔记(二)创建spring boot项目
用eclipse(需要用高版本,要不然弄不出来):new →Spring Sarter Project 用IDEA:一般默认 一般默认 入门级的先 剩下的一般默认... 一.项目至少有下面的东西,里面 ...
- Spring Boot实战笔记(七)-- Spring高级话题(计划任务)
一.计划任务 从Spring3.1开始,计划任务在Spring中的实现变得异常的简单.首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在执行计划任务的方法上注解@Sc ...
- Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...
随机推荐
- 一张图了解cocos2d坐标系
一张图了解cocos2d坐标系 平面直角坐标系
- FFMPEG结构体分析:AVCodecContext
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...
- ATPCS
ATPCS是: Arm Thumb procedure Call Standard的缩写.意思是arm thumb子程序调用规范. C语言函数与C函数之间进行调用是用同一个C函数调用方式进行 ...
- how tomcat works 总结 三
第七章 日志记录器 第 7 章包括日志,该组件是用来记录错误信息和其他信息的. 这一章比较简单,类图如下: 根据名字我想大家都能猜出来三个实现类都是做什么的,一个按常规输出到控制台,一个按错误模式输出 ...
- 【47】java的类之间的关系:泛化、依赖、关联、实现、聚合、组合
java的类之间的关系:泛化.依赖.关联.实现.聚合.组合 泛化: • 泛化关系(Generalization)也就是继承关系,也称为"is-a-kind-of"关系,泛化关系用于 ...
- 实战项目开发细节:C语言分离一个16进制数取出相应的位1或0
最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题. 其中,甄别好坏的方法是通过比如按键,或者其它的操作然 ...
- OpenCV——PS 图层混合算法 (四)
具体的算法原理可以参考 PS图层混合算法之四(亮光, 点光, 线性光, 实色混合) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define ...
- 个人Source Insight使用设置笔记
1.打开SourceInsight, 在菜单栏中点击Options-->Document Options 在显示的对话框中,点击Screen Fonts...., 可改变这个项目的字体,我选的是 ...
- PhpStorm php配置环境
如果你需要在Windows上安装PHP环境,并使用PhpStorm进行脚本编写进行编译,不需要WEB环境展示,那么本小结适合. 软件环境:Windows10+PHP7.1+PhpStorm2018 0 ...
- Thinkphp3.2简单解决多文件上传只上传一张的问题
html简单页面: index.html代码: <form action="{:U('index/upload')}" method="post" enc ...