玩转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

 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 }

 

posted @ 2019-04-12 14:37  小柴胡颗粒  阅读(304)  评论(0编辑  收藏  举报