如题,我们一般用spring的ioc,通过配置注入接口得到这个实现类,现在通过研究公司平台框架发现还有一种方法得到spring文件配置的bean方法,举个例子(注:这个ApplicationContext是自己定义的):

private static MyTestBean myTestBean = (MyTestBean) ApplicationContext.getInstance().getBizComponent("myTestBean");

配置文件:

<bean id="myTestBean" class="com.wxw.web.demo.MyTestBean"></bean>

通过自己定义的ApplicationContext的getBizComponent(String bean)方法得到实现类。

spring通过接口来注入实现了这个接口的实现类,但我们很多时候并不需要接口来测试开发,比如A业务类调用B业务类的方法,我们如果还是通过在A业务类里声明B业务类的接口,然后再注入这个接口,就略显麻烦。所以下面这个方法的出现就很好的解决了这个问题,还有这个方法可以直接启动spring容器,因为是容器类的单例模式,所以开发的时候可以直接在mian方法里运行,这样测试某个业务方法起来就方便很多。

项目工程文件图:

关键代码:

SpringContextLoad.java:

public class SpringContextLoad extends ContextLoaderListener{

@Override
    public void contextInitialized(ServletContextEvent event) {
        super.contextInitialized(event);//实际加载spring
        SpringContainer.instance = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
       
        Class type = SpringContainer.instance.getType("myTestBean");
        ApplicationContext.getInstance();
        Object obj = ApplicationContext.getInstance().getBizComponent("myTestBean");
    }
}

web启动spring加载ContextLoaderListener,改成自己定义的SPringContextLoad,然后通过WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());得到spring里的applicationContext

ApplicationContext.java

package com.wxw.platform.spring.impl;

public class ApplicationContext {
   
    /**
     * 容器启动锁,如果已有启动进程存在,则抛出异常。避免启动多个容器/循环依赖!
     */
    public static boolean startup_lock = false;
   
    private static ApplicationContext instance;
   
    private Contanier container;
   
    public static ApplicationContext getInstance(){
        if(instance == null){
            instance = new ApplicationContext();
        }
        return instance;
    }
   
    private ApplicationContext(){
        try {
            if (startup_lock) {
                throw new Exception("容器被重复初始化,可能是非法的调用所致");
            }
            startup_lock = true;
            String provider = "com.wxw.platform.spring.impl.SpringContainer";
            container = (Contanier) Class.forName(provider, true,
                    Thread.currentThread().getContextClassLoader()).newInstance();//其他方式获取容器实现
            container.start();
            startup_lock = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    public Object getBizComponent(Object object) {
        try {
            return container.getBizComponent(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

这个主要是想说明一点,一定要写成单例模式,这样的话,就不怕重复启动spring了。

这里想说明有一个很好用的方法:

String provider = "com.wxw.platform.spring.impl.SpringContainer";
            container = (Contanier) Class.forName(provider, true,
                    Thread.currentThread().getContextClassLoader()).newInstance();//其他方式获取容器实现

通过类加载得到这个接口的实现类

总结:还是那句话,如果想了解某个方法实现的原理,最好先自己理解了,然后,自己把这个方法用自己的方法实现起来,那样你会得到很多意想不到的东西。不要眼高手低,一步一个脚印。

下面是打包了的代码:

http://files.cnblogs.com/wxwall/springTestCase.zip

spring不依赖注入得到实体bean的更多相关文章

  1. Spring的依赖注入和管理Bean

    采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...

  2. (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)

    Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...

  3. Spring的依赖注入(DI)三种方式

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...

  4. spring的依赖注入的最常见的两种方法

    package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...

  5. Java Spring各种依赖注入注解的区别

    Spring对于Bean的依赖注入,支持多种注解方式: @Resource javax.annotation JSR250 (Common Annotations for Java) @Inject ...

  6. 一步一步深入spring(3)--spring的依赖注入方式

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...

  7. spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  8. SpringBoot系列: 理解 Spring 的依赖注入(一)

    ==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...

  9. 详解Java Spring各种依赖注入注解的区别

    注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Comp ...

随机推荐

  1. SVN:One or more files are in a conflicted state

    解决代码冲突 如果commit时出现"You have to update your work copy first."红色警告,说明版本库中的此文件已经被其他人修改了. 请先点& ...

  2. 使用Scala操作Mongodb

    介绍 Scala是一种功能性面向对象语言.它融汇了很多前所未有的特性.而同一时候又执行于JVM之上.随着开发人员对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件不可缺 ...

  3. POJ 3654 &amp; ZOJ 2936 &amp; HDU 2723 Electronic Document Security(模拟)

    题目链接: PKU:http://poj.org/problem?id=3654 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  4. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!

    原文:T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst.语言版本影响! CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ...

  5. SQL点滴6—“微软不认识闰年2月29日”&字符"N"的作用

    原文:SQL点滴6-"微软不认识闰年2月29日"&字符"N"的作用 http://www.cnbeta.com/articles/50580.htm这个 ...

  6. bundle install 出现 &#39;gem install mysql2 -v &#39;0.3.15&#39; succeeds before bunding &#39;

    bundle install 出现  'gem install mysql2 -v '0.3.15' succeeds before bunding ' 解决:sudo apt-get install ...

  7. SSIS Package to Call Web Service

    原文 SSIS Package to Call Web Service SSIS Package to Call Web Service. You can Call WebService from S ...

  8. Extjs中GridPanel的各个属性与方法

    1.Ext.grid.GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充 ...

  9. 【转】Android 系统菜单与自定义菜单

    Android 系统菜单与自定义菜单实现方法如下:系统菜单显示DefaultMenu.java package com.wxz.menu; import com.wxz.menu.R; import  ...

  10. waitFor和waitForAny的实现

    waitFor和waitForAny的实现 在实现waitFor方法之前,我们先要搞明白下面这些问题: 1. waitFor方法的形参有限制吗? 没有!如果形参是Task类型,不应该启动Task,如果 ...