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[]类型的路径数组。

  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/weixupeng/p/11159223.html
Copyright © 2011-2022 走看看