springboot实现ApplicationContextAware接口、使用ThreadLocal获得当前上下文请求的HttpServletRequest

前端请求的参数可以用requestparam、requestbody获得,也可以用HttpServletRequest来获得参数,这里讲用HttpServletRequest来获取前端参数的办法:

举例:

  @GetMapping("/index.do")
    @ResponseBody
    public String index() {
        Map map = BasicUtil.assemblyRequestMap();
        ...
        }

BasicUtil.assemblyRequestMap():


	/**
	 * 将请求的request的参数重新组装。主要是将空值的替换成null,因为requestMap空值是"",这样处理有利于外部判断,
	 * 同时将获取到的值映射到页面上
	 *
	 *            HttpServletRequest对象
	 * @return 返回处理过后的数据
	 */
	public static Map<String, Object> assemblyRequestMap() {
		HttpServletRequest request = SpringUtil.getRequest();
		Map<String, Object> params = new HashMap<String, Object>();
		Map<String, String[]> map = request.getParameterMap();
		Iterator<String> key = map.keySet().iterator();
		while (key.hasNext()) {
			String k = (String) key.next().replace(".", "_");
			String[] value = null;
			if(!StringUtil.isBlank(map.get(k))) {
				try {
					 value = map.get(k);
				} catch (java.lang.ClassCastException e) {
					 value = new String[]{map.get(k)+""};
				}
			}


			if (value == null) {
				params.put(k, null);
				request.setAttribute(k, null);
			} else if (value.length == 1) {
				String temp = null;
				if (!StringUtils.isEmpty(value[0])) {
					temp = value[0];
				}
				params.put(k, temp);
				request.setAttribute(k, temp);
			} else if (value.length == 0) {
				params.put(k, null);
				request.setAttribute(k, null);
			} else if (value.length > 1) {
				params.put(k, value);
				request.setAttribute(k, value);
			}
		}
		return params;
	}

SpringUtil.getRequest()在SpringUtil 类中:
关于实现ApplicationContextAware
一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

@Component
public class SpringUtil implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	private static ThreadLocal<HttpServletRequest> requestThreadLocal=new ThreadLocal<>();
	/**
	 * 获取当前请求对象
	 *
	 * @return
	 */
	public static HttpServletRequest getRequest() {
		try {
			HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
			return request;
		} catch (Exception e) {
			return requestThreadLocal.get();
		}
	}
	/**
	 * 设置当前请求对象
	 *
	 * @return
	 */
	public static void setRequest(HttpServletRequest request) {
		requestThreadLocal.set(request);
	}

	/**
	 * 通过spring的webapplicationcontext上下文对象读取bean对象
	 *
	 * @param sc
	 *            上下文servletConext对象
	 * @param beanName
	 *            要读取的bean的名称
	 * @return 返回获取到的对象。获取不到返回null
	 */
	@Deprecated
	public static Object getBean(ServletContext sc, String beanName) {
		return getApplicationContext().getBean(beanName);
	}

	/**
	 * 通过spring的webapplicationcontext上下文对象读取bean对象
	 *
	 * @param beanName
	 *            要读取的bean的名称
	 * @return 返回获取到的对象。获取不到返回null
	 */
	public static Object getBean(String beanName) {
		return getApplicationContext().getBean(beanName);
	}

	/**
	 * 通过spring的webapplicationcontext上下文对象读取bean对象
	 *
	 * @param cls
	 *            要读取的类名称
	 * @return 返回获取到的对象。获取不到返回null
	 */
	public static <T> T getBean(Class<T> cls) {
		return getApplicationContext().getBean(cls);
	}



	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		if (SpringUtil.applicationContext == null) {
			SpringUtil.applicationContext = applicationContext;
		}
	}
	//获取applicationContext
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
}

这里使用了ThreadLocal,就可以起到线程隔离的作用,不同的客户端的请求互不影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,你可以通过实现`FactoryBean`、`ApplicationContextAware`和`InitializingBean`接口来自定义Bean的创建和初始化过程。 首先,让我们看看如何实现`FactoryBean`接口: ```java import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean<MyBean> { @Override public MyBean getObject() throws Exception { // 创建并返回自定义的Bean对象 return new MyBean(); } @Override public Class<?> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return true; // 返回true表示该Bean是单例的 } } ``` 在上面的示例中,`MyFactoryBean`类实现了`FactoryBean`接口,并重写了`getObject()`、`getObjectType()`和`isSingleton()`方法。通过实现这些方法,你可以定义自己的逻辑来创建和配置Bean。 接下来,让我们看看如何实现`ApplicationContextAware`接口: ```java import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContext; public class MyApplicationContextAware implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } // 可以在这里使用applicationContext访问其他Bean或执行其他操作 } ``` 在上面的示例中,`MyApplicationContextAware`类实现了`ApplicationContextAware`接口,并重写了`setApplicationContext()`方法。通过重写该方法,你可以在Bean初始化时获得`ApplicationContext`对象,并在需要时使用它。 最后,让我们看看如何实现`InitializingBean`接口: ```java import org.springframework.beans.factory.InitializingBean; public class MyInitializingBean implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { // 在这里执行Bean的初始化逻辑 } } ``` 在上面的示例中,`MyInitializingBean`类实现了`InitializingBean`接口,并重写了`afterPropertiesSet()`方法。在该方法中,你可以实现自定义的Bean初始化逻辑。 请注意,以上示例中的类都是自定义的类,你需要将它们注册为Spring Bean,可以使用`@Component`注解或在配置类中进行配置。例如,在配置类中添加如下代码: ```java @Configuration public class AppConfig { @Bean public MyFactoryBean myFactoryBean() { return new MyFactoryBean(); } @Bean public MyApplicationContextAware myApplicationContextAware() { return new MyApplicationContextAware(); } @Bean public MyInitializingBean myInitializingBean() { return new MyInitializingBean(); } } ``` 通过以上配置,你可以将自定义的FactoryBean、ApplicationContextAware和InitializingBean注册为Spring Bean,并在应用中使用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值