SpringBoot之获取Spring容器上下文组件的工具类封装

SpringBoot之获取Spring容器上下文组件的工具类封装

文章目录

  1. 如在一个普通类中获取HttpServletRequestHttpServletResponse...等等
  2. 以工具类的形式getBen,而不需要@Component、@Service、@Repository 或使用@Autowired注入Ben等
  3. 在使用的地方以静态方法获取对象即可

1. SpringBoot版本

xml 复制代码
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
    </parent>

2. Spring容器上下文工具类封装

创建一个工具类,如SpringContextUtils,并实现ApplicationContextAware接口

SpringContextUtils.java配置类如下

java 复制代码
package com.yuan.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.ClassUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
yuan
/**
 * <p>
 * Description: Spring上下文及核心包中一些公用的核心方法工具类
 * </p>
 *
 * @author jinshengyuan
 * @since 2022/12/17 20:20
 */
@Configuration
public class SpringContextUtils implements ApplicationContextAware {


    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取HttpServletRequest
     */
    public static HttpServletRequest getHttpServletRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    /**
     * 获取HttpServletResponse
     */
    public static HttpServletResponse getHttpServletResponse() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    }

    public static String getDomain() {
        HttpServletRequest request = getHttpServletRequest();
        StringBuffer url = request.getRequestURL();
        return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
    }

    public static String getOrigin() {
        HttpServletRequest request = getHttpServletRequest();
        return request.getHeader("Origin");
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    /**
     * 在普通类中获取StringRedisTemplate对象
     *
     * @return
     */
    public static StringRedisTemplate getStringRedisTemplate() {
        return (StringRedisTemplate) SpringContextUtils.getBean("stringRedisTemplate");
    }

    /**
     * 在普通类中获取RedisTemplate对象
     *
     * @return
     */
    public static RedisTemplate getRedisTemplate() {
        return (RedisTemplate) SpringContextUtils.getBean("redisTemplate");
    }

    /**
     * 在普通类中获取JdbcTemplate对象
     *
     * @return
     */
    public static JdbcTemplate getJdbcTemplate() {
        return (JdbcTemplate) SpringContextUtils.getBean("jdbcTemplate");
    }

    /**
     * 获取项目的绝对路径
     *
     * @return
     */
    public final static String getProjectClasspath() {
        return ClassUtils.getDefaultClassLoader().getResource("").getPath();
    }

}
相关推荐
Victor3565 分钟前
MongoDB(39)如何使用聚合进行过滤?
后端
Victor35617 分钟前
MongoDB(38)如何使用聚合进行投影?
后端
AI_56781 小时前
基于智优达平台的Python教学实践:从环境搭建到自动评测
开发语言·前端·人工智能·后端·python
IT_陈寒1 小时前
JavaScript开发者必备的5个高效调试技巧,90%的人都不知道最后一个!
前端·人工智能·后端
会编程的土豆1 小时前
Set 深度解析:去重、唯一性与你的智能抽屉
java·开发语言·后端·数据结构与算法
颜酱1 小时前
二分图核心原理与判定算法
javascript·后端·算法
奋斗小强2 小时前
前端工程化:从 Webpack 到 Vite,打包速度提升 10 倍的秘密
后端
我叫黑大帅2 小时前
Golang中实时推送的功臣 - WebSocket
后端·面试·go
朱雨鹏2 小时前
图解RocketMQ运行原理
后端·rocketmq
颜颜颜yan_2 小时前
从千毫秒到亚毫秒:连接条件下推如何让复杂 SQL 飞起来
后端