zoukankan      html  css  js  c++  java
  • 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况

    最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形。而最关键的一步就是获取ApplicationContext,过程中纠结和错误了很久,总结一下获取ApplicationContext的三种方式:

    方式一:使用两种Aware接口获取自定义bean

    • 实现 ApplicationContextAware接口

    对于实现ApplicationContextAware接口的类,spring容器在初始化的时候会扫描他,并把容器的context环境注入给它。如下:

     1 public class BeanUtil implements ApplicationContextAware
     2 {
     3          private  ApplicationContext context;
     4      
     5      @Override
     6         public void setApplicationContext(ApplicationContext ctx)
     7                 throws BeansException {
     8              System.out.println("进入这个set方法...");
     9              System.out.println("容器本身:" + (ctx==null));
    10             this.context = ctx;
    11 }

    注意:

    但同时,必须在spring的配置文件中注入该类:

    <bean id="sys" class="org.test.util.BeanUtil"/>
    或者使用spring注解配置使spring加载此类。

     ps:虽说通过这种方式可以得到spring上下文,但必须考虑到:调用该工具类的Java类也必须注册成bean,并指定一个BeanUtil类型的属性引用sys bean,而不能通过代码的方式去获取这个工具类. 这样就违背了工具类的初衷,因为我们为了使用工具类而去把一个可能并不需要注册成bean的普通java类也注册成一个bean,这显然是多此一举的。

    • 实现   BeanFactoryAware 接口
    @compent
    public class BeanUtil implements BeanFactoryAware {
        
        private static BeanFactory beanFactory;
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        }
        
        public static Object getBean(String beanName){
    
         if(beanFactory == null){
                throw new NullPointerException("BeanFactory is null!");
            }
         return beanFactory.getBean(beanName); 
      } 
    }

    注意:同上!!!

    方式二:WebApplicationContext wc = ContextLoader.getCurrentWebApplicationContext();

    注:我使用这种方式去获取上下文,但一直是null,后来查阅相关API才发现,使用该种方式的Java类必须是一个servlet或者action.普通类是无法直接使用的——或者是在web容器已经开启的情况下可以通过该方法获得上下文,假设此时再通过Resources方式new,得到的上下文将不会是此时容器中的上下文,因而也无法对容器中的bean进行管理了。也就是说,你随便写一个类,在它的main方法中透过调用这个方法,是无法获取到这个类所在项目的spring上下文的!

    方式三:Resource方式

    public class SysBeans 
    {
         private static ApplicationContext context;
         public static ApplicationContext getContext() {
             context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/conf/applicationContext-base.xml");
    //         context = new FileSystemXmlApplicationContext("","");
             return context;
         }
    }

    注:new ClassPathXmlApplicationContext (..)的方式只能获取位于类路径下的配置,而new FileSystemXmlApplicationContext(..)则可以获取到WEB-INF下的配置。通过filesystem的方式时,建议写相对路径,即从webRoot/WEN-INF/...xml开始写。当这两种resource方式需要同时加载多个配置时,参数可以用逗号(,)隔开,或者传入一个string[]类型的路径数组。

  • 相关阅读:
    GDOI 2019 退役记
    SHOI2019 游记
    【WC2014】紫荆花之恋
    PKUWC 2019 & NOIWC2019 比赛总结 Formal Version
    WC 2019 颓废记
    VDUVyRLYJC
    Git学习
    DOM学习笔记
    python基础---->AJAX的学习
    python基础---->进程、线程及相关等
  • 原文地址:https://www.cnblogs.com/weixupeng/p/11159223.html
Copyright © 2011-2022 走看看