如题,我们一般用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. sql级联删除

    原文:sql级联删除 功能:在删除主表时,自动删除副表(外键约束)相应内容 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用.在级联删除中,还删除其外键值引用删除的主键值的所有行. 如: ...

  2. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  3. 利用docker搭建yii2 详细步骤

    定位镜像 在hub.docker.com 搜索yii2,并且最后定位到 https://hub.docker.com/r/codemix/yii2-base/codemix/yii2-base 然后在 ...

  4. thinkphp 支付宝错误 Class 'Think' not found

    Class 'Think' not found D:\www\DonatePlatform\ThinkPHP\Extend\Vendor\alipay\lib\alipay_submit.class. ...

  5. Codeforces Round #FF 446A DZY Loves Sequences

    预处理出每一个数字能够向后延伸多少,然后尝试将两段拼起来. C. DZY Loves Sequences time limit per test 1 second memory limit per t ...

  6. 让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式

    让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式 那么就要用下面的方法:让网页兼容ie9 复制代码 代码如下: <!–[if lte IE 8]> <meta http ...

  7. Hbuilder jQuery 自定义代码块

    =begin 本文档是jquery代码块的编辑文件.修改其他的代码块,请在对应的激活代码助手点右下角的修改图标. HBuilder可使用ruby脚本来编辑代码块和增强操作命令. 1.编辑代码块 如果要 ...

  8. 使用AutoTools自动生成Makefile

    前两天赶时间写了个简易的数据库系统,实现了简单的增删改查等功能.因为赶实验...无节操的我用shell实现的文件读写...咳咳...这都不是重点,重点是自己写Makefile感觉有点不伦不类...虽然 ...

  9. 文件合并工具DiffMerge发布4.2版本

    DiffMerge一直是文件对比合并工具的佼佼者,其最大特点是多文件对比与合并,并提供可视化界面用于编辑. 此次DiffMerge v4.2发布,提高了文件差异对比,并提供了快速匹配功能,以及更好的用 ...

  10. Guava之简介

    1.介绍 Guava最初是在2007年作为“Google Collection  Library” 出现的,这个项目在处理Java集合时提供了一些有用的工具,Google的这个guava项目已经成为了 ...