zoukankan      html  css  js  c++  java
  • spring项目启动后,获取bean的方法总结

    如果在web项目中,用到定时器的朋友可能会遇到使用spring注解的方式获取bean的时候报空指针的异常。这是就可以使用手工的方法获取spring容器中的bean了。
    下面是具体的方法:

    1。先说一个最简单的方法

    ContextLoaderListener.getCurrentWebApplicationContext().getBean ("beanName");

    只要传入bean的name就可以获取了,简单方便。

    2。实现BeanFactoryAware接口

    package cn.cupcat.util;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.stereotype.Service;
    @Service
    public class BeanFactotyUtil implements BeanFactoryAware{
    
        private static BeanFactory beanFactory=null;
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        }
    
    
        public static <T> T getBean(String beanName){
            return (T)beanFactory.getBean(beanName); 
        }
    }

    说明:
    这个类的意思大体这么几个意思:

    1,实现BeanFactoryAware接口,这个接口可以让我们在项目启动后获取bena工厂的实例,从而随心所欲的获取我们想要的bean实例。
    
    2,setBeanFactory()方法是用的spring的依赖注入,set方法是三种注入方式之一。这样实例才会注入到该类里。
    
    既然要注入,那么我们必须设置BeanUtils这个类也要在项目启动的时候被spring实例化,我这里是采用注解的方式@service来实现。
    
    3,静态getBean方法,这里方法必须是静态的,因为你如果自己去new这个BeanUtils类的话,beanFactory是不会被注入进去的。
    

    测试:

    @RequestMapping("test")
        public void test(){
            DaoSupport bean = BeanFactotyUtil.getBean("daoSupport");
            System.out.println(bean);
        }

    访问url:http://www.xy.com:8080/news/addressee/test
    控制台打印:

    cn.cupcat.dao.DaoSupport@113f0e57  

    成功获取

    3。方法三

    写一个工具类类继承ApplicationObjectSupport,并将这个加入到spring的容器
    

    4。方法四

    写一个工具类类继承WebApplicationObjectSupport,并将这个加入到spring的容器

    5。方法五

    写一个工具类实现ApplicationContextAware接口,并将这个加入到spring的容器

    示例:

    import java.util.Map;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    /**
     * 获取ApplicationContext和Object的工具类
     * @author yzl
     *
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class SpringContextUtils implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
    
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            applicationContext = arg0;
        }
    
        /**
         * 获取applicationContext对象
         * @return
         */
        public static ApplicationContext getApplicationContext(){
            return applicationContext;
        }
    
        /**
         * 根据bean的id来查找对象
         * @param id
         * @return
         */
        public static Object getBeanById(String id){
            return applicationContext.getBean(id);
        }
    
        /**
         * 根据bean的class来查找对象
         * @param c
         * @return
         */
        public static Object getBeanByClass(Class c){
            return applicationContext.getBean(c);
        }
    
        /**
         * 根据bean的class来查找所有的对象(包括子类)
         * @param c
         * @return
         */
        public static Map getBeansByClass(Class c){
            return applicationContext.getBeansOfType(c);
        }
    }

    方法六:

    ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

    获取不到报错
    方法七:

    ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

    获取不到返回null

    本文参考了:https://my.oschina.net/u/1454202/blog/521204
    http://www.cnblogs.com/yangzhilong/p/3949332.html

  • 相关阅读:
    Delphi常用内存管理函数
    delphi中VirtualStringTree树使用方法
    Delphi常量
    delphi中的copy函数和pos函数
    delphi 中 delete的用法
    字软元件和位软元件的区别
    Virtual Treeview使用要点
    QTreeWidget搜索功能---遍历QTreeWidget
    C 语言使用 sqlite3
    opendir 与 readdir
  • 原文地址:https://www.cnblogs.com/jpfss/p/9447739.html
Copyright © 2011-2022 走看看