当一个类实现了这个接口之后,这个类就可以方便地获得 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
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 36 }