上篇 : 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深入分析的更多相关文章

  1. Spring Boot 系列教程19-后台验证-Hibernate Validation

    后台验证 开发项目过程中,后台在很多地方需要进行校验操作,比如:前台表单提交,调用系统接口,数据传输等.而现在多数项目都采用MVC分层式设计,每层都需要进行相应地校验. 针对这个问题, JCP 出台一 ...

  2. Spring Boot 系列教程18-itext导出pdf下载

    Java操作pdf框架 iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好 ...

  3. Spring Boot 系列教程17-Cache-缓存

    缓存 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮 ...

  4. Spring Boot 系列教程16-数据国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  5. Spring Boot 系列教程15-页面国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  6. Spring Boot 系列教程14-动态修改定时任务cron参数

    动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...

  7. Spring Boot 系列教程12-EasyPoi导出Excel下载

    Java操作excel框架 Java Excel俗称jxl,可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件,现在基本没有更新了 http://jxl.sourcef ...

  8. Spring Boot 系列教程11-html页面解析-jsoup

    需求 需要对一个页面进行数据抓取,并导出doc文档 html解析器 jsoup 可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操 ...

  9. Spring Boot 系列教程10-freemarker导出word下载

    freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  10. Spring Boot 系列教程9-swagger-前后端分离后的标准

    前后端分离的必要 现在的趋势发展,需要把前后端开发和部署做到真正的分离 做前端的谁也不想用Maven或者Gradle作为构建工具 做后端的谁也不想要用Grunt或者Gulp作为构建工具 前后端需要通过 ...

随机推荐

  1. dp求顺序hdu1160

    题意是仅仅求一次的顺序.先依照速度从大到小排序,速度想等到按体重增序排列. 然后基本就变成了求已定顺序序列的最长递增序列递增,跟那个求一致最大序列和的基本一致. dp[i]里存储的是到当前i最大的递增 ...

  2. bash shell最基本的语法

    1 shell语句的基本构成 shell每个基本的构成元素之间都相隔一个空格. 比如[ -e file ],[.-e.file.]这四个基本元素之间都相隔了一个空格. 同样的道理[ ! -e file ...

  3. a column-oriented DBMS

    https://clickhouse.yandex/docs/en/introduction/what_is_clickhouse.html

  4. C++ JSON解析库RapidJSON

    https://github.com/Tencent/rapidjson jsontext.txt { "result" : [ { "face_id" : & ...

  5. Immutable学习及 React 中的实践

    为什么用immutable.js呢.有了immutable.js可以大大提升react的性能. JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原 ...

  6. 深度学习入门-4.1 AND.py 源码分析

    源代码 ------------------------------------------------------------------------------------------------ ...

  7. 基于Vuejs的搜索匹配功能

    最近一直在看vue,查了很多资料,看了很多文档和博客,大概半知半解了,然后利用所理解的知识写了一个简单的搜索匹配功能. 大概长这个样子:   <!DOCTYPE html> <htm ...

  8. 目录操作(PHP)

    1.创建目录(文件夹)mkdir("./test");2.删除目录(文件夹)只能删除空的文件夹rmdir("./test");3.移动目录(文件夹)rename ...

  9. 推箱子 Sokoban(华中农业比赛)

    点这里 打开题目链接   点击打开链接 题目就是我们玩过的推箱子: 一顿暴力广搜:加状态标记.状态压缩需要用到一个类似于康拓的思想来压缩:所以容易TLE,搜索就是用一个int型的数字来表示一个状态, ...

  10. 如何给lemon开无限栈

    进入终端 输入"ulimit -s unlimited" 输入"lemon" 把lemon源程序拖进来,接着在弹出的lemon界面上操作即可.