`
hz_chenwenbiao
  • 浏览: 1010354 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring依赖注入不成功,spring 窗口管理

阅读更多

有时我们使用spring的注入的时候不成功,如我们在一个地方实例化一个类,这个类里面就用到依赖注入的方式,我们也在spring配置文件里写好了让它去扫描这个包,将该类纳入spring容器管理,但当我们实例化它的时候,它里面的spring的bean并没有注入,这是为什么,因为我们虽然将这个类纳入spring容器管理,但是当我们实例这个类时,这个是我们自己实例化的对象,它不属于spring管理范围,也就是不是由spring实例化的,所以它里面用到的spring的注入是不成功的。我这个是在使用phprpc里发布一个服务器,遇到的问题,发布如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="org.phprpc.*" %> 
<%@ page import="org.edu.scut.lab24.project.service.impl.RemoteServiceImpl" %>
<%@ page import="org.edu.scut.lab24.project.service.IRemoteService" %> 


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>PHPRPC</title>
	
  </head>
  
  <body>
	<%  
	
	//这里必须使用接口定义
	IRemoteService remoteService = new RemoteServiceImpl();
	//实例化phprpc服务
	PHPRPC_Server phprpc_server = new PHPRPC_Server();

	//在这里把RemoteServiceImpl发布出来
	phprpc_server.add(remoteService);
	
	phprpc_server.start(request, response);
	%>  
  </body>
</html>
 

 

这个实例化就是自己的实例化,不是spring并不纳入spring管理范围,所以在RemoteServiceImpl里用到spring注解里是不能注入成功的,解决的办法,自己手动加载spring配置文件,

也就是再实例化一个spring容器,然后从容器里获取bean,如下:

 

1 可先建一个spring容器实例化的类,这样当你想在自己想使用spring容器的时候就用这同一个(这里以静态变量的形式存在),而不用每次都实例化一个新的spring容器,这样才不会过度消耗内容资源。

 

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 初如化spring上下文环境,初始化xml文件
 * @author Administrator
 *
 */
public class AppContext {
	
	private static AppContext instance;
	private String[] PATH = {"classpath:applicationContext.xml"};

	private AbstractApplicationContext applicationContext;
	
	public synchronized static AppContext getInstance(){
		if(instance == null)
			instance = new AppContext();
		return instance;
	}
	
	public AppContext(){
		this.applicationContext = new ClassPathXmlApplicationContext(PATH);
	}
	
	public AbstractApplicationContext getAbstractApplicationContext(){
		return this.applicationContext;
	}
}

 

 

当你在如上面的例子里的RemoteServiceImpl类用到注入,假设如下

 

@Resource
	private  IFileService fileServiceImpl;
 

 

那你就可以用下面的方式来获得注入的bean(在构造函数或你想用的地方):

 

if(fileServiceImpl == null)
			fileServiceImpl = (FileServiceImpl)AppContext.getInstance().getAbstractApplicationContext().getBean("fileServiceImpl");

 

 你可能会问,不什么不将fileServiceImpl直接用new FileServiceImpl 方式来实现,因为当FileServiceImpl

里面又用到注解,并用到spring对数据库的操作,所以这里只能用spring提供的bean来实例化它,即让它们处于spring容器的管理下

 

你可能还会问你用struts里它跳到action类去,你也不没有实例化它,它里面用到的spring注解怎么又可以用呢?因为在web.xml里面就配置了spring监听web的请求,应该是将请求处理的action纳入spring容器去管理,我的web.xml配置如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<welcome-file-list>
		<welcome-file>upload.jsp</welcome-file>
	</welcome-file-list>
	
	
	<!--###########   初始化日志系统   ##################-->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/classes/log4j.properties</param-value>
	</context-param>
	<!--##########    Spring默认刷新Log4j配置文件的间隔,单位为millisecond   #########-->
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>
	<!--###########   初始化Spring上下文   ##################-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>  
             classpath:applicationContext.xml
         </param-value>
	</context-param>

	<!--Spring log4j Config loader-->
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>

	<!--Spring ApplicationContext 载入    -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	
	<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
 

所以我们的请求跳到action类去处理时,在action类里的注解是可以注入的。

 

而当我在web.xml配置一个servlet,而在客户端(我使用jquery uploadify组件)请求就指定用该servlet来处理,而当这个servlet里面用到spring注解的时候,它会在客户请求时发生异常,出现如下异常:

 

严重: Allocate exception for servlet uploadServlet
javax.naming.NameNotFoundException: Name org.lab24.file.servlet.UploadServlet is not bound in this Context
	at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
	at org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:278)
	at org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:187)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1120)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
	at java.lang.Thread.run(Unknown Source)

 开始我以有是我的web.xml没配置好,老是说servlet不能在邦定,其它是这个servlet里面的的注解不能邦定,所在这里要想用spring注解,可以用上面的方式来自己加载spring容器,或都可以在web.xml里配置使用请求的servlet处理bean也交给spring管理,这个我就不会配置,知道的网友希望告诉一下我。

 

最后总结一下:

1 当你使用直接实倒化一个类(里面用到spring的注解)时,是不没有交给spring容器管理的,除了你自己在类里面加载spring容器。


2 处理用户的请求类,只有在web.xml里配置了交由spring管理的,才能使用spring的注解,不然只能手动实例化spring容器后才能用。

分享到:
评论

相关推荐

    使用MyEclipse查看Spring的依赖视图

    Spring框架作为Java领域中最流行的轻量级框架之一,通过其强大的依赖注入(Dependency Injection, DI)特性极大地简化了这种依赖关系的管理。本文将详细介绍如何使用MyEclipse这一集成开发环境(IDE)来查看Spring...

    官方原版源码 spring-5.2.6.RELEASE.zip

    Spring的核心设计原则是依赖注入,通过反转控制,将对象之间的依赖关系交由框架管理,使代码更易于测试和解耦。在5.2.6.RELEASE版本中,DI的实现更加灵活和强大,支持构造器注入、setter注入以及基于注解的注入方式...

    spring+swing的例子

    1. **依赖注入(DI)**:通过 DI,Spring 可以管理对象之间的关系,使得代码更松耦合。开发者不再需要在代码中直接创建对象,而是通过配置文件或注解声明依赖,由 Spring 容器负责实例化和组装。 2. **面向切面编程...

    官方源码 spring-framework-5.3.4.zip

    2. **依赖注入(Dependency Injection, DI)** Spring的DI是其核心特性之一,通过XML配置或注解方式实现对象之间的依赖关系。在5.3.4版本中,DI机制更加成熟,支持更灵活的构造器注入和方法注入,帮助开发者实现松...

    Spring和Desktop的关系

    Spring Desktop提供了事件模型、窗口管理、服务定位等功能,使得桌面应用的开发变得更加便捷。此外,Spring的IoC(Inversion of Control)容器可以管理桌面应用中的对象生命周期,而AOP(Aspect-Oriented ...

    Spring框架RPG-Game

    依赖注入是Spring的重要特性,它允许我们在不修改代码的情况下更改对象的依赖关系。在本项目中,游戏逻辑中的各种组件可以通过构造函数、setter方法或者接口回调等方式接受它们所需的服务。例如,游戏主角可能依赖于...

    spring-frameword3.0源码

    2. `org.springframework.web.struts`:Spring与Struts的整合模块,展示了Spring如何将依赖注入和AOP等特性引入Struts应用,使得控制层更加灵活和解耦。 3. `org.springframework.context`:这是Spring的核心模块,...

    spring3.0+hibernate3.3+mysql8.0

    在本项目中,Spring主要作为依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的容器。Spring 3.0引入了更多的模块,如Spring MVC用于构建Web应用,Spring JDBC和Spring ORM...

    Spring认证考试流程

    1. 容器(20%):这部分考察对Spring容器的理解,包括Bean的生命周期和依赖注入。 2. AOP(8%):涉及面向切面编程的原理和实践,如何使用AspectJ和Spring AOP实现切面。 3. JDBC(4%):测试考生对数据库连接和操作...

    Spring 5.04 生成eclipse工程

    它通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)来促进良好的编程实践。Spring 5.0.4引入了对Java 9和Java模块系统的支持,同时增强了对反应式编程的支持,这是现代...

    spring3+springMVC3+springJDBC3+jQuery easyui的运行环境

    首先,Spring框架(版本3)是Java开发中的核心组件,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地简化了应用的结构和管理。Spring框架包括多个模块,如Core Container(核心容器)、Data Access/...

    ext + spring + jms 开发 web桌面oa管理系统

    其次,Spring是Java领域的一个核心框架,它为开发者提供了依赖注入(DI)、面向切面编程(AOP)以及各种企业级服务,如数据访问、事务管理等。在本项目中,Spring很可能被用作整个系统的胶水层,连接EXT前端与后端...

    商场管理系统 Spring+SQL server 2005

    Spring框架以其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)能力,为系统提供了稳定且可扩展的基础架构。 首先,Spring框架是Java开发中的一个重要组件,它简化...

    spring插件.rar

    Spring框架是Java开发中的核心组件,它提供了丰富的功能来简化应用程序的构建,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等。Eclipse是一款广泛使用的Java集成开发环境(IDE),对于Java开发者来...

    图书管理系统(struts+hibernate+spring+ext).zip

    3. Spring:Spring框架提供了一个全面的应用程序开发模型,包括依赖注入、面向切面编程、事务管理等。在本系统中,Spring作为整个应用的“胶水”,负责各个组件的组装和管理。例如,通过Spring的依赖注入,我们可以...

    Spring3源码构建与断点

    1. **Spring框架**:Spring是一个开源的Java企业级应用开发框架,它提供了全面的编程和配置模型,简化了Java开发工作,包括依赖注入、面向切面编程、数据访问、事务管理等。 2. **源码获取**:要获取Spring的源码,...

    Spring+SpringMVC+Hibernate4+Ext4 完整的系统

    Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心特性,简化了Java应用的开发和维护。在本项目中,Spring用于管理各个组件的生命周期,实现业务逻辑的解耦。它还可能...

    spring4.1.3+mybatis3.2.8+springmvc+mysql8.0.11的模板

    1. **Spring 4.1.3**: Spring是Java企业级应用的核心框架,提供了依赖注入(DI)和面向切面编程(AOP)等特性。Spring 4.1.3是该版本系列的一个稳定版本,支持Java 8,并改进了对JPA、JMS和WebSocket的支持。 2. **...

    spring入门纲要.pdf

    - **降低组件之间的耦合度**: Spring通过依赖注入等机制帮助实现软件各层之间的解耦,提高了系统的可维护性和灵活性。 - **提供丰富的服务**: 包括但不限于事务管理服务、消息服务、JMS服务、持久化服务等,简化了...

    extjs4 + struct+ spring + hibernate 搭建后台

    本项目使用了`extjs4`作为前端框架,`structs2`作为MVC Web应用框架,`spring`处理业务逻辑和依赖注入,以及`hibernate`作为ORM(对象关系映射)工具,来搭建一个完整的后台系统。下面将详细介绍这四个技术及其在...

Global site tag (gtag.js) - Google Analytics