玩转ApplicationContextAware
当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean。换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象。结合工厂模式写个demo,比如说ApplicationContext 中有两个发送短信的bean,一个是叫移动的Bean,另一个是叫电信的Bean,那么在某一个场景下,你只要用某一个Bean,那么到底用哪一个取决于你自已,也就是你所传的参数。
1.类ChannelFactory实现了ApplicationContextAware接口
package com.tanlu.user.factory; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class ChannelFactory implements ApplicationContextAware {
private static ApplicationContext applicationContext; @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} /**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
} public Object getBean(String param) {
return applicationContext.getBean(param);
} /**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
} public SendMessageChannel getChannel(String code){
switch (code){
case "1":
return applicationContext.getBean(YiDongMobile.class);
case "2":
return applicationContext.getBean(DianXinMobile.class);
default:
return applicationContext.getBean(YiDongMobile.class);
}
} }
2.ApplicationContext 中的两个Bean
package com.tanlu.user.factory; import com.tanlu.user.model.ResponseData;
import org.springframework.stereotype.Component; @Component
public class DianXinMobile implements SendMessageChannel { @Override
public ResponseData sendMsg(String s1) {
ResponseData data = ResponseData.susscce();
data.setMessage("电信");
System.out.println("中国电信发送短信");
return data;
}
}
package com.tanlu.user.factory; import com.tanlu.user.model.ResponseData;
import org.springframework.stereotype.Component; /**
*移动
*/
@Component
public class YiDongMobile implements SendMessageChannel { @Override
public ResponseData sendMsg(String s1) {
ResponseData data = ResponseData.susscce();
data.setMessage("移动");
System.out.println("我是中国移动发送短信");
return data;
}
}
package com.tanlu.user.factory;
import com.tanlu.user.model.ResponseData;
public interface SendMessageChannel {
/**
* 发送短信
* @param s1
*/
public ResponseData sendMsg(String s1);
}
3.测试,这时候你可以随意注入实现ApplicationContextAware接口的类。
package com.tanlu.user.controller; import com.alibaba.fastjson.JSON;
import com.tanlu.user.factory.ChannelFactory;
import com.tanlu.user.model.ResponseData;
import com.tanlu.user.model.dto.SendMessageDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RequestMapping("/message")
@RestController
public class SendMessageController {
private static final Logger logger = LoggerFactory.getLogger(SendMessageController.class); @Autowired
private ChannelFactory channelFactory; /**
* 工厂类demo
* @param dto
* @return
* @throws Exception
*/
@RequestMapping(value = "/channel", method = RequestMethod.POST, produces = "application/json")
public ResponseData sendMsgCode(@RequestBody SendMessageDto dto) throws Exception {
String code = dto.getCode();
logger.info("code :"+code);
ResponseData data = channelFactory.getChannel(code).sendMsg(code);
System.out.println("test applicationcontextaware :"+ JSON.toJSON(data));
return data;
} }
玩转ApplicationContextAware的更多相关文章
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法
1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...
- [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...
- 玩转spring boot——开篇
很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...
- 玩转spring boot——结合redis
一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...
- 玩转spring boot——AOP与表单验证
AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 玩转spring boot——结合AngularJs和JDBC
参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...
随机推荐
- 企业级应用,如何实现服务化三(dubbo入门案例)
今天是六一儿童节,从千里之外的广州,回到了贵州老家,真好!好山好水好心情,好了接着写点东西.这是企业级应用,如何实现服务化系列的第三篇.在上一篇:企业级应用,如何实现服务化二(dubbo架构)中,认识 ...
- EasyUI Datagrid换页不清出勾选方法
在1.4版本后: 只要在datagrid中加入 idField:'id',给每条数据id属性,easyui就默认就会保留之前勾选的信息 如果没有id,才会出现换页后,之前勾选的信息没有的情况
- C# 特性之事件
事件的本质---特殊的多路广播委托 定义事件: 事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见 事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler ...
- python虚拟环境四
python虚拟环境管理器 我们在使用python虚拟环境的时候,最好安装一个虚拟环境管理器,这样我们就能很方便的管理python的 虚拟环境,而python的虚拟环境管理工具包就是virtualen ...
- JAVA常用知识总结(十一)——数据库(一)
项目中用到的不常见sql语法 1:空值不在前的排序 select a.* from WZX_SCZY A order by SCZY_START_TIME desc nulls last (不加nul ...
- [已读]了不起的Node.js
2015/1/22 昨天下班前看完了这本,也不算看完,redis与mysql部分没有去翻,觉得暂时用不上. 觉得第一部分的内容还不错. 第二部分主要讲fs,tcp和http这三个模块. 第三个部分是例 ...
- 18002 Z-Scan 模拟题
18002 Z-Scan 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description Z-Scan is a method ...
- body和普通div背景图宽高百分比的区别
body和普通div背景图的区别 background: url(//m.360buyimg.com/mobilecms/s220x220_jfs/t2746/167/831241799/29915 ...
- StarUML安装与Win7不兼容解决
最近在学习建模工具(StarUML)发现 其他功能一切正常 但是无法显示代码导出功能, 正常界面如下: 我的安装确没有导出功能缺少C++,C# ,Java等导出功能 解决办法: 到StarUM ...
- 关于搭建系统直播和Thinkphp的杂谈(持续更新)
Q:Access denied for user 'root'@'localhost' 错误 A:第一种:配置文件中把数据库的用户名密码再改一遍,把runtime里的文件删除 第二种:修改syste ...