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();
    }

}
相关推荐
九转苍翎3 分钟前
掌控消息全链路(2)——RabbitMQ/Spring-AMQP高级特性之消息可靠性和重试机制
spring·java-rabbitmq
Zfox_13 分钟前
【Docker#2】容器化虚拟化
运维·后端·docker·容器
小北方城市网24 分钟前
Spring Cloud Gateway实战:路由、限流、熔断与鉴权全解析
java·spring boot·后端·spring·mybatis
晨非辰26 分钟前
Linux权限实战速成:用户切换/文件控制/安全配置15分钟掌握,解锁核心操作与权限模型内核逻辑
linux·运维·服务器·c++·人工智能·后端
ZealSinger30 分钟前
Nacos2.x 事件驱动架构:原理与实战
java·spring boot·spring·spring cloud·nacos·架构·事件驱动
正在努力Coding9 小时前
SpringAI - 工具调用
java·spring·ai
Loo国昌9 小时前
【LangChain1.0】第五阶段:RAG高级篇(高级检索与优化)
人工智能·后端·语言模型·架构
我尽力学9 小时前
面试 总结
java·spring boot·面试
爬台阶的蚂蚁9 小时前
Spring AI Alibaba基础概念
java·spring·ai
计算机学姐10 小时前
基于SpringBoot的演唱会抢票系统
java·spring boot·后端·spring·tomcat·intellij-idea·推荐算法