当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean。换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象。结合工厂模式写个demo,比如说ApplicationContext 中有两个发送短信的bean,一个是叫移动的Bean,另一个是叫电信的Bean,那么在某一个场景下,你只要用某一个Bean,那么到底用哪一个取决于你自已,也就是你所传的参数。

1.类ChannelFactory实现了ApplicationContextAware接口

  1. package com.tanlu.user.factory;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.ApplicationContextAware;
  6. import org.springframework.stereotype.Component;
  7.  
  8. @Component
  9. public class ChannelFactory implements ApplicationContextAware {
  10. private static ApplicationContext applicationContext;
  11.  
  12. @Override
  13. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  14. this.applicationContext = applicationContext;
  15. }
  16.  
  17. /**
  18. * 获取applicationContext
  19. * @return
  20. */
  21. public static ApplicationContext getApplicationContext() {
  22. return applicationContext;
  23. }
  24.  
  25. public Object getBean(String param) {
  26. return applicationContext.getBean(param);
  27. }
  28.  
  29. /**
  30. * 通过class获取Bean.
  31. * @param clazz
  32. * @param <T>
  33. * @return
  34. */
  35. public static <T> T getBean(Class<T> clazz){
  36. return getApplicationContext().getBean(clazz);
  37. }
  38.  
  39. public SendMessageChannel getChannel(String code){
  40. switch (code){
  41. case "1":
  42. return applicationContext.getBean(YiDongMobile.class);
  43. case "2":
  44. return applicationContext.getBean(DianXinMobile.class);
  45. default:
  46. return applicationContext.getBean(YiDongMobile.class);
  47. }
  48. }
  49.  
  50. }

2.ApplicationContext 中的两个Bean

  1. package com.tanlu.user.factory;
  2.  
  3. import com.tanlu.user.model.ResponseData;
  4. import org.springframework.stereotype.Component;
  5.  
  6. @Component
  7. public class DianXinMobile implements SendMessageChannel {
  8.  
  9. @Override
  10. public ResponseData sendMsg(String s1) {
  11. ResponseData data = ResponseData.susscce();
  12. data.setMessage("电信");
  13. System.out.println("中国电信发送短信");
  14. return data;
  15. }
  16. }
  1. package com.tanlu.user.factory;
  2.  
  3. import com.tanlu.user.model.ResponseData;
  4. import org.springframework.stereotype.Component;
  5.  
  6. /**
  7. *移动
  8. */
  9. @Component
  10. public class YiDongMobile implements SendMessageChannel {
  11.  
  12. @Override
  13. public ResponseData sendMsg(String s1) {
  14. ResponseData data = ResponseData.susscce();
  15. data.setMessage("移动");
  16. System.out.println("我是中国移动发送短信");
  17. return data;
  18. }
  19. }
  1. package com.tanlu.user.factory;
  2.  
  3. import com.tanlu.user.model.ResponseData;
  4.  
  5. public interface SendMessageChannel {
  6. /**
  7. * 发送短信
  8. * @param s1
  9. */
  10. public ResponseData sendMsg(String s1);
  11. }

3.测试,这时候你可以随意注入实现ApplicationContextAware接口的类。

  1. package com.tanlu.user.controller;
  2.  
  3. import com.alibaba.fastjson.JSON;
  4. import com.tanlu.user.factory.ChannelFactory;
  5. import com.tanlu.user.model.ResponseData;
  6. import com.tanlu.user.model.dto.SendMessageDto;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.bind.annotation.*;
  11.  
  12. @RequestMapping("/message")
  13. @RestController
  14. public class SendMessageController {
  15. private static final Logger logger = LoggerFactory.getLogger(SendMessageController.class);
  16.  
  17. @Autowired
  18. private ChannelFactory channelFactory;
  19.  
  20. /**
  21. * 工厂类demo
  22. * @param dto
  23. * @return
  24. * @throws Exception
  25. */
  26. @RequestMapping(value = "/channel", method = RequestMethod.POST, produces = "application/json")
  27. public ResponseData sendMsgCode(@RequestBody SendMessageDto dto) throws Exception {
  28. String code = dto.getCode();
  29. logger.info("code :"+code);
  30. ResponseData data = channelFactory.getChannel(code).sendMsg(code);
  31. System.out.println("test applicationcontextaware :"+ JSON.toJSON(data));
  32. return data;
  33. }
  34.  
  35. }

玩转ApplicationContextAware的更多相关文章

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

    1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...

  3. [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

    了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...

  4. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  5. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  6. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  7. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  8. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  9. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

随机推荐

  1. Location replace() 方法

    replace() 方法可用一个新文档取代当前文档. <!DOCTYPE html> <html> <head> <meta charset="ut ...

  2. idea下载

  3. cmd - 使用curl命令的注意点

    前言 最近在cmd中使用curl命令来测试rest api,发现有不少问题,这里记录一下. 在cmd中使用curl命令的注意事项 json不能由单引号包括起来 json数据里的双引号要用反斜杠\转义 ...

  4. js实现打印正三角

    代码: <html> <head> <title>function</title> </head> <body> <scr ...

  5. C. On Number of Decompositions into Multipliers 组合数学

    http://codeforces.com/contest/397/problem/C 给出n个数字,m = a[1] * a[2] * a[3] ... * a[n] 要求把m分成n个不一样的乘积, ...

  6. Unity小知识记录

    //判断运行的平台 Application.platform == RuntimePlatform.Android EditorPrefs 编辑器储存数据 [AddComponentMenu(&quo ...

  7. Masonry UIScrollView autolayout 的一个奇特的问题

    事情是这样的.... 我一个工程里 一直使用的 masonry 做autolayout,有个gesturerReconizer的bug,找了很久,发现很奇怪一个现象: 我的某个view 是这样的 |- ...

  8. Todolist总结

    一.组件类里面的函数尽可能写成箭头函数的形式,方便绑定this 上面的箭头函数是好的,写面的不好,他需要在用的时候绑定this,或者在constructor绑定,如下: 如上用的时候绑定this是不好 ...

  9. ScrollView中嵌套ListView时,listview高度显示的问题

    方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个Lis ...

  10. linux服务器上的jenkins远程触发构建windows server 2012服务器上的jenkins任务

    本文来自:https://blog.csdn.net/huashao0602/article/details/53318295  非常感谢原博主,亲测可行,这是我做CI持续集成试过的第6套方案了! 背 ...