SPRING-BOOT系列之Spring4深入分析
上篇 : SPRING-BOOT系列之Spring4快速入门
1. 假如我们有这样一个场景,在一个组件中想获取到容器对象,那么我们也可以使用Autowired来完成装配。那么我们还可以让类集成一个接口
// 如果我们不是要autowired生成 context的话,我们可以让类集成ApplicationContextAware接口让其生成
@Configuration
public class TestAppAware implements ApplicationContextAware { private ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} public void show(){
System.out.println("myContext is :" +applicationContext.getClass());
} }
public class App4 { public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TestAppAware.class);
TestAppAware testAppAware = context.getBean(TestAppAware.class);
testAppAware.show();
context.close();
}
}
2. 我们再熟悉下,怎么在每个bean被容器init的时候可以做些什么处理?
我们写一个EchoBeanProcess 让其继承BeanPostProcessor,然后重写他的postProcessBeforeInitialization跟postProcessAfterInitialization方法,我们可以在容器init容器中的
bean的时候做一个处理:
@Component
public class EchoBeanProcess implements BeanPostProcessor{ @Override
public Object postProcessBeforeInitialization(Object bean, String beanName){
// 1. 要手动重写方法
// 2. 可以在return之前我们输入一些东西,相当于我们可以在这里对spring容器生成bean的时候做一个切面,前提
// !!!!!!!! 前提是你往当前容器中注入了
System.out.println("=========>init Before===》 :" +bean.getClass());
return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName){
// 1. 要手动重写方法
// 2. 可以在return之前我们输入一些东西,相当于我们可以在这里对spring容器生成bean的时候做一个切面
System.out.println("=========>init After===》 :" +bean.getClass());
return bean;
} }
public class App4 { public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TestAppAware.class,EchoBeanProcess.class);
TestAppAware testAppAware = context.getBean(TestAppAware.class);
testAppAware.show();
MyBean myBean = context.getBean(MyBean.class);
System.out.println(myBean.getClass());
MyBean myBean2 = context.getBean(MyBean.class);
System.out.println(myBean2.getClass()); context.close(); // 因为我们往容器当中注入了TestAppAware.class,所以我们能够看到Init 之前跟init之后的方法
}
}
3. 从上面以及结合第一篇我们的Init跟destroy分析执行顺序,继承了BeanPostProcessor这个里面的2个方法是2个init方法,一个是init之前,一个是Init之后,而我们在生成bean
的时候是initMethod跟destoryMethod,所以顺序是 init之前 > initMethod > init之后 > detoryMethod.
4. 我们在利用刚才在 BeanPostProcessor 这个的时候写个代理,我们判断如果是DayService类,就返回他的子类DayServiceImpl ;
public class EchoBeanProcess implements BeanPostProcessor{ @Override
public Object postProcessBeforeInitialization(Object bean, String beanName){
// 1. 要手动重写方法
// 2. 可以在return之前我们输入一些东西,相当于我们可以在这里对spring容器生成bean的时候做一个切面,前提
// !!!!!!!! 前提是你往当前容器中注入了;
// 我们在这里做个代理处理
System.out.println("=========>init Before===》 :" +bean.getClass());
if(bean instanceof DayService) {
return new DayServiceImpl();
}
return bean;
}
然后我们就可以在spring容器获取DayService对象的时候 我们就给个DaySerivceImpl返回出去。
SPRING-BOOT系列之Spring4深入分析的更多相关文章
- Spring Boot 系列教程19-后台验证-Hibernate Validation
后台验证 开发项目过程中,后台在很多地方需要进行校验操作,比如:前台表单提交,调用系统接口,数据传输等.而现在多数项目都采用MVC分层式设计,每层都需要进行相应地校验. 针对这个问题, JCP 出台一 ...
- Spring Boot 系列教程18-itext导出pdf下载
Java操作pdf框架 iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好 ...
- Spring Boot 系列教程17-Cache-缓存
缓存 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮 ...
- Spring Boot 系列教程16-数据国际化
internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...
- Spring Boot 系列教程15-页面国际化
internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...
- Spring Boot 系列教程14-动态修改定时任务cron参数
动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...
- Spring Boot 系列教程12-EasyPoi导出Excel下载
Java操作excel框架 Java Excel俗称jxl,可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件,现在基本没有更新了 http://jxl.sourcef ...
- Spring Boot 系列教程11-html页面解析-jsoup
需求 需要对一个页面进行数据抓取,并导出doc文档 html解析器 jsoup 可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操 ...
- Spring Boot 系列教程10-freemarker导出word下载
freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...
- Spring Boot 系列教程9-swagger-前后端分离后的标准
前后端分离的必要 现在的趋势发展,需要把前后端开发和部署做到真正的分离 做前端的谁也不想用Maven或者Gradle作为构建工具 做后端的谁也不想要用Grunt或者Gulp作为构建工具 前后端需要通过 ...
随机推荐
- 从数据源拉取数据,将数据内容与一组搜索项做比对 go func() chanel
https://github.com/goinaction/code [root@hadoop3 sample]# go run main.go 2018/07/30 17:45:39 Registe ...
- org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed to send event
org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed t ...
- pyspark 连 MongoDB复制集
解决问题思路: 核心:0-理解pyspark的执行与java jar的关系: 1-看控制台,看日志: 2-jar缺不缺,版本号,放哪里. [root@hadoop1 mylocalRepository ...
- C标准库中atoi的一种可能的实现
为避免与标准库中的atoi产生歧义, 我将自己编写的函数命名为strToInt, 以下是示例代码 #include <stdio.h> int strToInt(const char *s ...
- jquery 选择器(selector)和事件(events)
页面加载完成后开始运行do stuff when DOM is ready 中的语句! $(document).ready(function() { // do stuff when DO ...
- 按行读入xml文件,删除不需要的行 -Java
删除挺麻烦的,这里其实只是把需要的行存到arraylist中再存到另一个文件中 import java.io.BufferedReader;import java.io.BufferedWriter; ...
- hdu 1963 Investment 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1963 题目意思:有 本金 money,还有一些股票的种类,第 i 种股票买入需要 value[i] 这 ...
- A+B Problem && OJ推荐【持续更新】
目录 List 前言 长郡 Position: code 1. 2. 持续更新,么么哒 List 前言 有没有觉得写这篇文章很奇怪,这个还是有原因的.①很多OJ都有着道题,所以发个博客②这可以介绍很多 ...
- MongoDB之shard_副本集和分片部署
机器角色分配和拓扑环境如下: -------------------配置副本集s1-------------------------------1.创建目录在s1h1上创建如下目录[root@node ...
- Linux和windows下执行sql脚本文件
利用 sqlplus 登录数据库之后 键入: @/全路径/文件名 即可执行*.sql 文件 例 假设有一个 test.sql 文件 所在路径是/home/oracle/ ...