zoukankan      html  css  js  c++  java
  • 001-Spring在代码中获取bean的几种方式

    一、概述

    方法一:在初始化时保存ApplicationContext对象

    方法二:通过Spring提供的utils类获取ApplicationContext对象

    方法三:继承自抽象类ApplicationObjectSupport

    方法四:继承自抽象类WebApplicationObjectSupport

    方法五:实现接口ApplicationContextAware

    方法六:通过Spring提供的ContextLoader

    二、详细介绍

    1.在初始化时保存ApplicationContext对象【采用Spring框架的独立应用程序】

    ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");   
    ac.getBean("beanId");  

    说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

    方法二:通过Spring提供的工具类获取ApplicationContext对象【B/S系统】
    ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);   
    ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);   
    ac1.getBean("beanId");   
    ac2.getBean("beanId");  

    说明:这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

    方法三:继承自抽象类ApplicationObjectSupport

    说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取ApplicationContext。

    Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

    方法四:继承自抽象类WebApplicationObjectSupport

    说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

    方法五:实现接口ApplicationContextAware

    说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。

    以下是实现ApplicationContextAware接口方式的代码,前面两种方法类似:

    public class SpringContextUtil implements ApplicationContextAware {  
        private static ApplicationContext applicationContext;  
      
        /** 
         * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. 
         */  
        public void setApplicationContext(ApplicationContext applicationContext) {  
            SpringContextUtil.applicationContext = applicationContext; // NOSONAR  
        }  
      
        /** 
         * 取得存储在静态变量中的ApplicationContext. 
         */  
        public static ApplicationContext getApplicationContext() {  
            checkApplicationContext();  
            return applicationContext;  
        }  
      
        /** 
         * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
         */  
        @SuppressWarnings("unchecked")  
        public static <T> T getBean(String name) {  
            checkApplicationContext();  
            return (T) applicationContext.getBean(name);  
        }  
      
        /** 
         * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
         */  
        @SuppressWarnings("unchecked")  
        public static <T> T getBean(Class<T> clazz) {  
            checkApplicationContext();  
            return (T) applicationContext.getBeansOfType(clazz);  
        }  
      
        /** 
         * 清除applicationContext静态变量. 
         */  
        public static void cleanApplicationContext() {  
            applicationContext = null;  
        }  
      
        private static void checkApplicationContext() {  
            if (applicationContext == null) {  
                throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");  
            }  
        }  
      
    }  

    虽然,spring提供的后三种方法可以实现在普通的类中继承或实现相应的类或接口来获取spring 的ApplicationContext对象,但是在使用是一定要注意实现了这些类或接口的普通java类一定要在Spring 的配置文件applicationContext.xml文件中进行配置。否则获取的ApplicationContext对象将为null。

    <bean id="spring" class="SpringContextUtil" />  

    方法六:通过Spring提供的ContextLoader
    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
    wac.getBean(beanID);  

    最后提供一种不依赖于servlet,不需要注入的方式。但是需要注意一点,在服务器启动时,Spring容器初始化时,不能通过以下方法获取Spring 容器,细节可以查看spring源码org.springframework.web.context.ContextLoader。

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/bjlhx/p/7043651.html
Copyright © 2011-2022 走看看