package com.somnus.support.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.support.RequestContextUtils;
@WebFilter(filterName = "ContextFilter1",urlPatterns = "/*")
public class ContextFilter1 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
WebApplicationContext ctx = RequestContextUtils.findWebApplicationContext(request);
System.out.println("第一种方式获取Spring中的bean:" + ctx.getBean("baseService"));
filterChain.doFilter(request, response);
}
}
package com.somnus.support.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
import com.somnus.support.holder.ApplicationContextHolder;
@WebFilter(filterName = "ContextFilter2",urlPatterns = "/*")
public class ContextFilter2 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
System.out.println("第二种方式获取Spring中的bean:" + ApplicationContextHolder.getBean("baseService"));
filterChain.doFilter(request, response);
}
}
package com.somnus.support.holder;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static <T> T getBean(String id, Class<T> clazz) {
T bean = getApplicationContext().getBean(id,clazz);
if (bean == null) {
throw new IllegalStateException("bean factory is null");
}
return bean;
}
public static <T> T getBean(Class<T> clazz) {
T bean = getApplicationContext().getBean(clazz);
if (bean == null) {
throw new IllegalStateException("bean factory is null");
}
return bean;
}
public static Object getBean(String beanName) {
return getApplicationContext().getBean(beanName);
}
public static ApplicationContext getApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicationContext is not init.");
}
return applicationContext;
}
@SuppressWarnings("static-access")
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static void cleanHolder() {
applicationContext = null;
}
}
[方式三]
package com.somnus.support.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.filter.OncePerRequestFilter;
@WebFilter(filterName = "ContextFilter3",urlPatterns = "/*")
public class ContextFilter3 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
System.out.println("第三种方式获取Spring中的bean:" + ctx.getBean("baseService"));
filterChain.doFilter(request, response);
}
}
本文介绍三种在Spring框架中获取Bean的方法:通过RequestContextUtils、ApplicationContextHolder及WebApplicationContextUtils。每种方法都有其适用场景。
1万+

被折叠的 条评论
为什么被折叠?



