针对Spring获取当前的ApplicationContext和spring获取application配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展command模式结合SpringA
针对Spring获取当前的ApplicationContext和spring获取application配置这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展command 模式结合 Spring ApplicationContextAWare 接口获取 ApplicationContext 上下文、java – 之间的关联:SpringIocContainer | ApplicationContext |的WebApplicationContext、Java类获取Spring的ApplicationContext、junit 集成 spring 报错: GenericApplicationContext cannot be cast to WebApplicationContext等相关知识,希望可以帮助到你。
本文目录一览:- Spring获取当前的ApplicationContext(spring获取application配置)
- command 模式结合 Spring ApplicationContextAWare 接口获取 ApplicationContext 上下文
- java – 之间的关联:SpringIocContainer | ApplicationContext |的WebApplicationContext
- Java类获取Spring的ApplicationContext
- junit 集成 spring 报错: GenericApplicationContext cannot be cast to WebApplicationContext
Spring获取当前的ApplicationContext(spring获取application配置)
我将Spring MVC用于我的Web应用程序。我的豆子写在“ spring-servlet.xml
”文件中
现在我有一个课MyClass
,我想用spring bean访问这个课。
在spring-servlet.xml
我写了以下
<bean id="myClass"/>
现在我需要使用 ApplicationContext
ApplicationContext context = ??
这样我就可以
MyClass myClass = (MyClass) context.getBean("myClass");
这该怎么做??
答案1
小编典典只需注入即可。
@Autowiredprivate ApplicationContext appContext;
command 模式结合 Spring ApplicationContextAWare 接口获取 ApplicationContext 上下文
@Service("commandFactory")
public class CommandFactory implements ICommandFactory,ApplicationContextAware {
private ApplicationContext applicationContext;
//private static Logger logger = LoggerFactory.getLogger(CommandFactory.class);
/**
* 功能描述:默认构造函数CommandFactory,
*/
public CommandFactory() {}
/**
* 功能描述: 核心工厂返回真正的接口实例对象
* @method:getCommandTaskType
* @param huoguObject
* @return:IMiniAdviceService
*/
public IMiniAdviceService getCommandTaskType(HuoguObject huoguObject){
return (IMiniAdviceService) applicationContext.getBean(huoguObject.getTaskType());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}
java – 之间的关联:SpringIocContainer | ApplicationContext |的WebApplicationContext
阅读后1 2 3 4 5 6链接我得出以下结论 –
作为Spring mvc设计在一个标准的servlet,并且促进servlet上下文和应用程序上下文相同的功能.在春天有两种类型的上下文ApplicationContext和WebApplicationContext-
ApplicationContext由ContextLoaderListener初始化,每个应用程序单个instanse.
每个dispatcherServlet加载的WebApplicationContext.
我们可以在上面看到这样的ApplicationContext扩展的WebApplicationContext,所以有什么东西与ApplicationContext相关的最后这是WebApplicationContext的一部分.
疑惑
> ApplicationContextAware提供哪个上下文对象.
public class SomeThing implements ApplicationContextAware{ @Override public void setApplicationContext(ApplicationContext ctx) throws BeanException{ //this context object is `ApplicationContext` or `WebApplicationContext`? } }
>上下文和容器似乎是我们大多数人的同义词,我想
给出一个例子.说我们有两个调度器servlet一个
休息等为mvc.
第一个调度员 –
public class Restinitializer extends AbstractAnnotationConfigdispatcherServletinitializer { @Override protected String[] getServletMappings() { return new String[] { "/rest/*" }; } }
第二调度员 –
public class WebAppInitializer extends AbstractAnnotationConfigdispatcherServletinitializer { @Override protected String[] getServletMappings() { return new String[] { "/mvc/*" }; } }
比这里有两个WebApplicationContext的实例,那些
公共部分由ContextLoaderListner加载为定义
rootContext.
我不确定,但在一个SpringApplication中不能有2个IocContainer.
> beanfactory即SpringIocContainer是,其中所有的bean对象
生活,我们与WebApplicationContext相关联的对象是什么
spring容器的一部分,这个容器是如何初始化的
WebApplicationContext?我想知道他们是如何做到的
相互关联?
每当我们做ctx.getBean() – 这会从spring返回对象
容器,上下文和容器之间的这种通信如何
发生?
有一个类似的answer,否认这两者都是一样的,它说
Spring comes with several container implementations,Both load bean deFinitions,wire beans together,and dispense beans upon request,but an ApplicationContext offers much more.
所以我的观点就是为什么两个加载bean的定义,一起是一起的,这是一种返工?
即使网络应用程序是弹簧驱动的,还有一件事情,在Http通信中必须有一个标准servlet提供和使用的上下文
Spring遵循这一点,或者Spring以其他方式处理这个问题.而在spring context中,这意味着只有一个IOC容器,其中一部分由dispacherServlet加载,一部分由ContextLoaderListner加载,并且可以方便更多的诸如I18N,访问静态资源等等..
解决方法
在spring应用程序中有一个单独的上下文实例,它是每个dispatcherServlet的WebAplicationCntext.它可以被一个超级接口ApplicationContext-
public class SomeThing implements ApplicationContextAware{ @Override public void setApplicationContext(ApplicationContext ctx) throws BeanException{ //this context object is `WebApplicationContext` which is refer by `ApplicationContext`. } }
在春天,上下文意味着只有一个IOC容器,一些部分由ContextLoaderListner加载,并且可以促进更多的诸如I18N,访问静态资源等
您以上的理解几乎是正确的.在Spring中所有的WebApplicationContext对象共享一些常见的引用,即RootContext.
这个答案不包括question2,doubt3的答案,以及为什么所有的上下文都执行相同的任务.
Java类获取Spring的ApplicationContext
实现
1.创建一个类让其实现org.springframework.context.ApplicationContextAware接口来让Spring在启动的时候为我们注入ApplicationContext对象.
示例代码:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MyApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext context;
//声明一个静态变量保存
public void setApplicationContext(ApplicationContext contex) throws BeansException {
this.context=contex;
}
public static ApplicationContext getContext(){
return context;
}
public final static Object getBean(String beanName){
return context.getBean(beanName);
}
public final static Object getBean(String beanName, Class<?> requiredType) {
return context.getBean(beanName, requiredType);
}
}
2.在applicationContext.xml文件中配置此bean,以便让Spring启动时自动为我们注入ApplicationContext对象.
例:
<!-- 这个bean主要是为了得到ApplicationContext 所以它不需要其它属性-->
<bean></bean>
3.有了这个ApplicationContext之后我们就可以调用其getBean("beanName")方法来得到由Spring 管理所有对象.
junit 集成 spring 报错: GenericApplicationContext cannot be cast to WebApplicationContext
公司这个项目,不是我来配置构建的, 把 spring 的配置什么的,和 springmvc 的配置没有区分开来,都是在一个配置文件里面,也就是 springmvc 里面。 和我们一般的 配置不一样,我们一般配置都是 配置好 spring 容器的,,然后配置好 springmvc 的分开来。 可是 这个项目不是这样的,,,感觉是有点乱,后期也难维护管理。。。
没办法了。 这个项目,他们是没有 junit 的, 估计他们不喜欢用吧。 可是我是有点喜欢 junit 测试的。 所以想自己集成 junit ,在写代码的时候,方便自己测试使用。
可是在集成的时候 junit 的时候 居然报错了。。。
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''initService'' defined in file [D:\SVN\rpd-p2p\branches\1.3.1.shortcutpay\rpd-p2p\build\classes\com\moneyP2P\p2p\VSFP\spring\service\InitService.class]: Initialization of bean failed; nested exception is java.lang.ClassCastException: org.springframework.context.support.GenericApplicationContext cannot be cast to org.springframework.web.context.WebApplicationContext
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:120)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
... 25 more
Caused by: java.lang.ClassCastException: org.springframework.context.support.GenericApplicationContext cannot be cast to org.springframework.web.context.WebApplicationContext
at com.moneyP2P.p2p.VSFP.spring.service.InitService.setApplicationContext(InitService.java:251)
at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:117)
at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:92)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1505)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
... 39 more
什么意思啊。。。? 百度一下,,,发现这样的问题实在是太少了。。。 使用网上的办法发现也不行啊。 我一点点看的时候,发现是在 某个 service 类初始化的时候,报错了。 这个 service implements ApplicationContextAware 这类。 按理来说,应该可以获取到啊,和 junit 测试看起来是没有问题的。。 继续看报错信息,说是某一些报错了
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
ServletContext application = ((WebApplicationContext) applicationContext)
.getServletContext();
application.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
applicationContext);
columnServic.queryAllTopics(application);
application.setAttribute("application_link", linkService.query());
application.setAttribute("application_banner", bannerService.query());
//页面底部信息
application.setAttribute("footer", footerservice.queryFooter());
//页面系统信息
application.setAttribute("sysconfig", syscfgService.getSysConfig());
initEnumStatus(application);
initSetSafetyQuestion(application);
initSetServiceUser(application);
}
看到了? 这里 是 WebApplicationContext , 和 web 相关要拿到 servlet 容器相关的。 我们一般都是 直接获取 ApplicationContext 就可以了。 而我的 junit 测试,只是想 测试 spring 的 service 而已,并不是 controller 类。 但是这里是 要获取 WebApplicationContext 类的,所以执行 junit 初始化的时候获取不到就报错了。 并且也试过在 junit 测试的之前,构建 WebApplicationContext ,结果也是不行的。
因此只能 使用 junit 的 web 测试 方式来了,这样应该就可以了。 构建来了之后果然可以了。 下面是我的 junit spring mvc 测试类
package com.mytest.junit;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.moneyP2P.p2p.VSFP.spring.controller.test.MyTestController;
import com.moneyP2P.p2p.VSFP.spring.service.UserBaseInfoService;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = "classpath*:config/main/spring-mvc.xml")
// 默认不回滚, 如果需要 回滚,请自己 在方法 加上 回滚, @Rollback(true) 或者是 defaultRollback = true
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
// extends AbstractTransactionalJUnit4SpringContextTests
public class MyJunitTest extends AbstractTransactionalJUnit4SpringContextTests {
// @Autowired
// private WebApplicationContext wac;
@Autowired
private MyTestController myTestController;
private MockMvc mockMvc;
@Autowired
private UserBaseInfoService userBaseInfoService;
@Before
public void setup() {
// 模拟web必须有这个 构建代码否则报错
mockMvc = MockMvcBuilders.standaloneSetup(myTestController).build();
}
@Test
public void test() {
System.out.println("==");
System.out.println(userBaseInfoService.queryUserById(113L).getUserName());
}
}
这样我们写 test 方法的时候,直接就获取 spring 的 bean 来测试了,或者说想 mockMVC 使用 controller 来测试 也是可以的。
参考 http://andy-ghg.iteye.com/blog/1772215
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:applicationContext-core.xml",
"classpath:applicationContext-servlet.xml" })
public class TestController {
@Autowired
private WebApplicationContext wac;
@Autowired
private SYSUserController userController;//你要测试的Controller
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
}
@Test
public void testFindPageUsers() throws Exception {
ResultActions ra = this.mockMvc.perform(MockMvcRequestBuilders
.post("/sysconfig/user/findPageUsers")
.accept(MediaType.APPLICATION_JSON).param("page", "1")
.param("limit", "10"));
MvcResult mr = ra.andReturn();
String result = mr.getResponse().getContentAsString();
log.info(result);
}
}
关于Spring获取当前的ApplicationContext和spring获取application配置的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于command 模式结合 Spring ApplicationContextAWare 接口获取 ApplicationContext 上下文、java – 之间的关联:SpringIocContainer | ApplicationContext |的WebApplicationContext、Java类获取Spring的ApplicationContext、junit 集成 spring 报错: GenericApplicationContext cannot be cast to WebApplicationContext等相关内容,可以在本站寻找。
本文标签: