spring不依赖注入得到实体bean
如题,我们一般用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的更多相关文章
- Spring的依赖注入和管理Bean
采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...
- (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)
Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...
- Spring的依赖注入(DI)三种方式
Spring依赖注入(DI)的三种方式,分别为: 1. 接口注入 2. Setter方法注入 3. 构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...
- spring的依赖注入的最常见的两种方法
package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...
- Java Spring各种依赖注入注解的区别
Spring对于Bean的依赖注入,支持多种注解方式: @Resource javax.annotation JSR250 (Common Annotations for Java) @Inject ...
- 一步一步深入spring(3)--spring的依赖注入方式
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...
- spring的依赖注入是什么意思
最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...
- SpringBoot系列: 理解 Spring 的依赖注入(一)
==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...
- 详解Java Spring各种依赖注入注解的区别
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Comp ...
随机推荐
- SVN:One or more files are in a conflicted state
解决代码冲突 如果commit时出现"You have to update your work copy first."红色警告,说明版本库中的此文件已经被其他人修改了. 请先点& ...
- 使用Scala操作Mongodb
介绍 Scala是一种功能性面向对象语言.它融汇了很多前所未有的特性.而同一时候又执行于JVM之上.随着开发人员对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件不可缺 ...
- POJ 3654 & ZOJ 2936 & HDU 2723 Electronic Document Security(模拟)
题目链接: PKU:http://poj.org/problem?id=3654 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!
原文:T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst.语言版本影响! CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ...
- SQL点滴6—“微软不认识闰年2月29日”&字符"N"的作用
原文:SQL点滴6-"微软不认识闰年2月29日"&字符"N"的作用 http://www.cnbeta.com/articles/50580.htm这个 ...
- bundle install 出现 'gem install mysql2 -v '0.3.15' succeeds before bunding '
bundle install 出现 'gem install mysql2 -v '0.3.15' succeeds before bunding ' 解决:sudo apt-get install ...
- SSIS Package to Call Web Service
原文 SSIS Package to Call Web Service SSIS Package to Call Web Service. You can Call WebService from S ...
- Extjs中GridPanel的各个属性与方法
1.Ext.grid.GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充 ...
- 【转】Android 系统菜单与自定义菜单
Android 系统菜单与自定义菜单实现方法如下:系统菜单显示DefaultMenu.java package com.wxz.menu; import com.wxz.menu.R; import ...
- waitFor和waitForAny的实现
waitFor和waitForAny的实现 在实现waitFor方法之前,我们先要搞明白下面这些问题: 1. waitFor方法的形参有限制吗? 没有!如果形参是Task类型,不应该启动Task,如果 ...