博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非spring组件servlet、filter、interceptor中注入spring bean
阅读量:6807 次
发布时间:2019-06-26

本文共 4056 字,大约阅读时间需要 13 分钟。

问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个bean一定存在吗?现在总是担心filter调用bean的时候,bean还没被实例化?

答案:因为spring bean、filter、interceptor加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是: ServletContext -> listener -> filter -> servlet 

由于spring bean的初始化是在listener中声明的,因此filter时,spring bean已经实例。 

注入bean方法:

一、自定义一个工具类,在工具类中通过ApplicationContext获取bean

  自定义一个工具类,实现自ApplicationContextAware接口,接口的方法是setApplicationContext,我们实现它,并让其为我们服务,因为Spring在load自己的时候会将上下文环境填充进来。我们所要做的就是将得到的ApplicationContext保存下来用。

@Componentpublic class SpringUtil implements ApplicationContextAware {    private static Logger log = LoggerFactory.getLogger(SpringUtil.class);        /**     * 当前IOC     */    private static ApplicationContext applicationContext;    /*     * @param arg0     *      * @throws BeansException     *      * @see     * org.springframework.context.ApplicationContextAware#setApplicationContext     * (org.springframework.context.ApplicationContext)     */    @Override    public void setApplicationContext(ApplicationContext arg0) throws BeansException {        log.info("====================arg0:"+arg0);        applicationContext = arg0;    }        public static 
T getBean(String id,Class
type){ return applicationContext.getBean(id,type); }}

需要注意的是该工具类需要纳入spring的bean管理(注解:增加扫描配置component-scan或bean.xml中配置)哟,否则applicationContext 将会是空的。

二、自定义一个工具类,在工具类中通过BeanFactory 获取bean

  自定义一个工具类,实现自BeanFactoryAware 接口,接口的方法是setBeanFactory,我们实现它,并让其为我们服务,因为Spring在load自己的时候会将上下文环境填充进来。我们所要做的就是将得到的BeanFactory 保存下来用。

 
@Component
public class BeanHelper implements BeanFactoryAware {        private static BeanFactory beanFactory;    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        this.beanFactory = beanFactory;    }    public static 
T getBean(String id,Class
type){ return beanFactory.getBean(id,type); }}

同样,需要注意的是该工具类需要纳入spring的bean管理(注解:增加扫描配置component-scan或bean.xml中配置)哟,否则applicationContext 将会是空的。

 

二、使用了注解和静态化的方式来产生SpringFactory对象

 

  上文的方法有个麻烦的地方:需要配置。而Spring2.5及之后的版本实际上加入了注解的方式进行依赖项的注入,使用如下代码也许更好:

 

 

public class SpringWiredBean extends SpringBeanAutowiringSupport {        /**     * 自动装配注解会让Spring通过类型匹配为beanFactory注入示例     */    @Autowired    private BeanFactory beanFactory;    private SpringWiredBean() {    }    private static SpringWiredBean instance;    static {        // 静态块,初始化实例        instance = new SpringWiredBean();    }    /**     * 实例方法 使用的时候先通过getInstance方法获取实例     *      * @param beanId     * @return     */    public 
T getBean(String id,Class
type){ return beanFactory.getBean(id,type); } public static SpringWiredBean getInstance() { return instance; }}

 

但是要增加一个扫描,让spring能知道注解:

 

 

servlet中注入bean的方法

步骤:

1 配置spring文件

2 在web.xml中加载spring的配置文件

contextConfigLocation
classpath*:/spring/applicationContext_*.xml

3 在servlet中获取名字为jdbcTemplat的bean.

public class UserAuthorizationFilter extends HttpServlet {private WebApplicationContext wac;    public void init(){        //方法一:       wac =WebApplicationContextUtils.getRequiredWebApplicationContext(             this.getServletContext());        //方法二:        wac = WebApplicationContextUtils.getWebApplicationContext(          this.getServletContext());       //方法一和方法二得到的结果是一样的。     //wac的类型:      org.springframework.web.context.support.XmlWebApplicationContext    }public void doPost(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {     JdbcTemplate jdbcTemplate = (JdbcTemplate)wac.getBean("jdbcTemplate");     String sql="select count(*) from customer where name='liwj' and password='1111111'";     int num=jdbcTemplate.queryForInt(sql);     if(num==1){          System.out.println("has");      }else{         System.out.println("hasnot");        }}

 

转载地址:http://gatwl.baihongyu.com/

你可能感兴趣的文章
LINUX Cacti 安装SOP FOR CentOS6.5
查看>>
总结命令----tar
查看>>
FindBugs插件的安装与使用
查看>>
ORA-12154: TNS: 无法解析指定的连接标识符
查看>>
OPNFV发布首个版本Arno
查看>>
菜鸟首篇博客
查看>>
python作业
查看>>
冰上教室
查看>>
内网映射ngrok
查看>>
freemarker 自己常用方法
查看>>
阿里云9折推荐码 CXYE77
查看>>
mysql 数据表中查找重复记录
查看>>
推荐一个插件: The Great Suspender,大大减少chrome浏览器内存占用量
查看>>
Mysql数据库启动命令
查看>>
过滤内网IP—IPv4
查看>>
react-native 解决“Could not get BatchedBridge...” 的问题
查看>>
4: Consolidating Datasets ( Challenge: Data Munging Using The Command Line)
查看>>
MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊
查看>>
http服务器和application服务器区别
查看>>
【渗透】浅谈webshell隐藏
查看>>