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作为构建工具 前后端需要通过 ...
随机推荐
- RSA前端JS加密,后端JAVA解密实现
用RSA非对称加密方式实现.后台生成rsa密钥对,然后在页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,后台再用私钥解密,获取密码明文.这样客户端只需要知道rsa加密方式和公钥,前台不知 ...
- C++设计模式之State模式
这里有两个例子: 1.https://www.cnblogs.com/wanggary/archive/2011/04/21/2024117.html 2.https://www.cnblogs.co ...
- 【bzoj3282】Tree
LCT模板题: 话说xor和的意思是所有数xor一下: #include<iostream> #include<cstdio> #include<cstring> ...
- java邮件发送(含附件)
1. [代码]java邮件发送(含附件)疯狂的IT人站长整理的:利用Java发送邮件(含附件)的例子:1.邮件发送的配置propertity文件内容如下:(utils.properties文件放在sr ...
- 栏目抓取网站日kafka
#!/usr/bin/python3#-*- coding:utf-8 -*-"""create 2018-02-27author zldesc: https://ind ...
- hdu 4463 Outlets(最小生成树)
题意:n个点修路,要求总长度最小,但是有两个点p.q必须相连 思路:完全图,prim算法的效率取决于节点数,适用于稠密图.用prim求解. p.q间距离设为0即可,最后输出时加上p.q间的距离 pri ...
- android项目 res/ 目录内支持的资源目录详解
表 1. 项目 res/ 目录内支持的资源目录 目录 资源类型 animator/ 用于定义属性动画的 XML 文件. anim/ 定义渐变动画的 XML 文件.(属性动画也可以保存在此目录中,但是为 ...
- lucene Index Store TermVector 说明
最新的lucene 3.0的field是这样的: Field options for indexingIndex.ANALYZED – use the analyzer to break the Fi ...
- Python里的一些注释规范
写代码注释是一件很重要的事情,如果你写的一段函数给别人调用那么往往都需要配上一些基本的注释.写好代码可以让别人容易阅读你的代码.试想一 下:如果你在github上面找到一段你想要的代码,这段代码有20 ...
- MyBatis学习 之 四、动态SQL语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...