ApplicationContextAware使用理解


接口的作用

當一個類實現了這個接口(ApplicationContextAware)之后,Aware接口的Bean在被初始之后,可以取得一些相對應的資源,這個類可以直接獲取spring 配置文件中 所有引用(注入)到的bean對象。

項目中的用法

  1 @Component
  2 public class WebUtil implements ApplicationContextAware {
  3 
  4     private static ApplicationContext applicationContext;
  5     
  6     public static final String COMPUTER   = "C"         ; //"Computer"
  7     public static final String MOBILE     = "M"         ; //"Mobile"
  8     public static final String UNKNOWN    = "Unknown"   ;
  9     public static final String USER_AGENT = "User-Agent";
 10     
 11     /**
 12      * 取得實際路徑
 13      */
 14     public static String getRealPath(String path) {
 15         return getHttpServletRequest().getServletContext().getRealPath(path);
 16     }
 17     
 18     /**
 19      * 從IOC中獲得對象: 根據類型
 20      */
 21     public static <T> T getBean(Class<T> requiredType){
 22         return applicationContext.getBean(requiredType);
 23     }
 24     
 25     /**
 26      * 從IOC中獲得對象: 根據id
 27      */
 28     public static Object getBean(String beanName){
 29         return applicationContext.getBean(beanName);
 30     }
 31     
 32     /**
 33      * 從IOC中獲得多個對象(實現接口或繼承的)
 34      */
 35     public static <T> Map<String, T> getBeansOfType(Class<T> requiredType){
 36         return applicationContext.getBeansOfType(requiredType);
 37     }
 38     
 39     /**
 40      * 獲得當前請求的Request對象
 41      */
 42     public static HttpServletRequest getHttpServletRequest() {
 43         return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 44     }
 45 
 46     /**
 47      * 取得設備類型
 48      */
 49     public static String getDeviceType() {
 50         String userAgent = getHttpServletRequest().getHeader(USER_AGENT);
 51         return getDeviceType(userAgent);
 52     }
 53 
 54     /**
 55      * 當前是否是電腦設備
 56      */
 57     public static boolean isComputer() {
 58         return COMPUTER.equals(getDeviceType());
 59     }
 60     /**
 61      * 獲得設備類型
 62      */
 63     public static String getDeviceType(String userAgentHeader) {
 64         if (userAgentHeader == null) return COMPUTER;
 65         if (userAgentHeader.contains("Andriod") || userAgentHeader.contains("iPhone") || userAgentHeader.contains("iPad"))
 66             return MOBILE;
 67         return COMPUTER;
 68     }
 69     
 70     /**
 71      * 取得瀏覽器
 72      */
 73     public static String getBrowser(String userAgentHeader) {
 74         UserAgent userAgent = UserAgent.parseUserAgentString(userAgentHeader);
 75         String brower = userAgent.getBrowser().getName();
 76         
 77         //考慮手機端的瀏覽器訪問,此處采用解析為Unknown時空格分隔取第一個
 78         if (Browser.UNKNOWN.getName().equals(brower) && userAgentHeader != null) {
 79             brower = userAgentHeader.split(" ")[0];
 80         }
 81         return brower;
 82     }    
 83 
 84     /**
 85      * 取得操作系統
 86      */
 87     public static String getOsName(String userAgentHeader) {
 88         UserAgent userAgent = UserAgent.parseUserAgentString(userAgentHeader);
 89         String osName = userAgent.getOperatingSystem().getName();
 90         return osName;
 91     }
 92     
 93     /**
 94      * 根據Request獲取IP地址
 95      * 
 96      * 使用Nginx等反向代理軟件, 則不能通過request.getRemoteAddr()獲取IP地址
 97      * 如果使用了多級反向代理的話,X-Forwarded-For的值並不止一個,
 98      * 而是一串IP地址,X-Forwarded-For中第一個非unknown的有效IP字符串,則為真實IP地址
 99      */
100     public static String getIpAddr(HttpServletRequest request) {
101         // 代理處理
102         String ip = request.getHeader("x-forwarded-for");
103         if (blankOrUnknown(ip)) ip = request.getHeader("Proxy-Client-IP");
104         if (blankOrUnknown(ip)) ip = request.getHeader("WL-Proxy-Client-IP");
105         if (blankOrUnknown(ip)) ip = request.getHeader("HTTP_CLIENT_IP");
106         if (blankOrUnknown(ip)) ip = request.getHeader("HTTP_X_FORWARDED_FOR");
107         
108         // 多級代理
109         if (StringUtils.isNotBlank(ip) && ip.contains(",")) ip = ip.split(",")[0];
110         
111         // 正常處理
112         if (blankOrUnknown(ip)) ip = request.getRemoteAddr();
113 
114         // 特殊設置
115         if("0:0:0:0:0:0:0:1".equals(ip) || "localhost".equals(ip)) ip = "127.0.0.1";
116         
117         //非空限定
118         if(ip == null) ip = "unknown";
119         
120         return ip;
121     }
122     
123     //IP地址為空(白)或為unknown
124     private static boolean blankOrUnknown(String ip) {
125         return StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip);
126     }
127     
128     /**
129      * 是否為ajax請求
130      */
131     public static boolean isAjax(HttpServletRequest request){
132         //如果是ajax請求響應頭會有,x-requested-with
133          if (request.getHeader("x-requested-with") != null 
134                  && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) { 
135              return true;
136          }
137          return false;
138     }
139 
140     @Override
141     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
142         WebUtil.applicationContext = applicationContext;
143     }
144 
145     public static ApplicationContext getApplicationContext() {
146         return applicationContext;
147     }
148     
149     
150 }

用法:

LogQuartzService logQuartzService =WebUtil.getBean(LogQuartzService.class);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM