zoukankan      html  css  js  c++  java
  • Java代码获取spring 容器的bean几种方式

    一、目的

    写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了。但是遇到一个问题,B引用A时候,A的配置信息总是填充不了,获取不到在B中配置好的信息。猜测原因:因为项目的的bean文件没有被统一管理。

    二、方法

    fun1:在初始化时保存ApplicationContext对象

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

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

    fun2:通过Spring提供的utils类获取ApplicationContext对象

    ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); 
    ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); 
    ac1.getBean("beanId"); 
    ac2.getBean("beanId");

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

    fun3:继承自抽象类ApplicationObjectSupport

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

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

    fun4:继承自抽象类WebApplicationObjectSupport

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

    fun5:实现ApplicationContextAware 接口

    说明:Spring 提供了ApplicationContextAware类,通过它可以获取所有bean上下文。

    也就是说,当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean。

    换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象。

    
    
    @Component
    public class SpringContextUtil implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext; // Spring应用上下文环境
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.applicationContext = applicationContext;
        }
    
        /**
         * 获取对象
         * 
         * @param name
         * @return Object 一个以所给名字注册的bean的实例
         * @throws BeansException
         */
        public static Object getBean(String name) throws BeansException {
            return applicationContext.getBean(name);
        }
    
    }

    业务调用

     public String getConfig() throws IOException {
         MyConfig myConfig = (MyConfig)SpringContextUtil.getBean("myConfig");
         System.out.println("my config is"+myConfig.toString());
         return myConfig.toString();
     }

    fun6:通过Spring提供的ContextLoader

    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    wac.getBean(beanID);

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

  • 相关阅读:
    读书笔记 之《Thinking in Java》(对象、集合、异常)
    ArrayList 和 LinkedList的执行效率比较
    Hybris CronJob.
    C# 中的treeview绑定数据库(递归算法)
    identity_insert---实验性插入大批量数据和分页存储过程
    SQL Server 存储过程
    PL/SQL 在64位机上不能使用的问题解决
    登陆Oracle11g的企业管理器
    SQL在oracle和SQLserver将查询结果创建为新表的不同之处
    介绍一下内联、左联、右联
  • 原文地址:https://www.cnblogs.com/DjangoBlogs/p/9035735.html
Copyright © 2011-2022 走看看