`
windFeng
  • 浏览: 72376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Spring注入取值为null的说明

阅读更多

 

前言:

在SSH组合中,用到了JDBC连接,需要给一个类中注入JdbcTemplate,注入后,在其他地方调用的时候,报空指针异常。

后来,写了个小实例,也是SSH环境,只有几个类,结构如下。

<!--StartFragment -->



 
 
spring中配置为
 
<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName"
			value="net.sourceforge.jtds.jdbc.Driver">
		</property>
		<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/mytest"></property>
		<property name="username" value="sa"></property>
		<property name="password" value=""></property>
	</bean>
 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
	</bean>
	
	<bean id="myDb" class="com.mini.MyDB" lazy-init="default" autowire="default">
		<property name="jdbcTemplate">
			<ref bean="jdbcTemplate" />
		</property>
		<property name="strAbc">
			<value>57ui</value>
		</property>
		<!-- 
		<constructor-arg index="0">
			<ref bean="jdbcTemplate" />
		</constructor-arg>
		<constructor-arg index="1">
			<value>8uiw</value>
		</constructor-arg> -->
	</bean>
 MyDB的代码
package com.mini;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;

public class MyDB {
	
	private Connection conn;
	private JdbcTemplate jdbcTemplate;
	private String strAbc;
	
//	private DataSource dataSource;

//	public DataSource getDataSource() {
//		return dataSource;
//	}
//
//	public void setDataSource(DataSource dataSource) {
//		this.dataSource = dataSource;
//	}
	

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
		try {
			conn = jdbcTemplate.getDataSource().getConnection();
			System.out.println("-------  " + conn.getCatalog());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println("............ jdbcTemplate : " + jdbcTemplate.getDataSource().toString());
	}
	
	public MyDB() {}
	
	public MyDB(JdbcTemplate jdbcTemplate, String strAbc) {
		this.jdbcTemplate = jdbcTemplate;
		this.strAbc = strAbc;
	}
	
	public void getConn() {
		
		System.out.println(">>>>>> get >> str >>>>  " + strAbc);
		
		conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
		
		try {
			System.out.println(">>>>>>>>>>>>  " + conn.getCatalog());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String getStrAbc() {
		return strAbc;
	}

	public void setStrAbc(String strAbc) {
		this.strAbc = strAbc;
		System.out.println(">>>>>> set >> str >>>>  " + this.strAbc);
	}
}
 
而在Action中调用代码为
public ActionForward dbconn(ActionMapping mapping, 
			 ActionForm form,
			 HttpServletRequest request, 
			 HttpServletResponse response) {

		MyDB mydb  = new MyDB();
		mydb.getConn();
		
//		MyDB mydb  = (MyDB) getLogicBean("myDb");
//		mydb.getConn();
		
		return mapping.findForward("moving");
	}
 
 测试setter方式注入,报空指针,后来换为构造方式注入,还是如此。
到最后发现,原来我调用getConn()的时候,是new的一个新对象,不是从spring上下文中取的,问题就出现在这里。
我spring整合struts是通过插件方式植入的,这里由下面的代码可以取到我所需要的:
	public Object getLogicBean(String logicBean) {
		 WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServlet().getServletContext());
		 return wac.getBean(logicBean);
	}
 在struts中关键配置
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
		<set-property property="contextConfigLocation" value="classpath:/applicationContext.xml" />
	</plug-in>
 
最后,在Action中通过这样的方式调用就没有问题了
	public ActionForward dbconn(ActionMapping mapping, 
			 ActionForm form,
			 HttpServletRequest request, 
			 HttpServletResponse response) {

//		MyDB mydb  = new MyDB();
//		mydb.getConn();
		
		MyDB mydb  = (MyDB) getLogicBean("myDb");
		mydb.getConn();
		
		return mapping.findForward("moving");
	}
 
  • 大小: 13.4 KB
分享到:
评论
1 楼 yuguanquan1990 2014-01-18  
最近就在看Spring dataSource注入的内容,一直都在这个问题这个问题上烦着,看了这个文章,检查了下service层的方法,把new改成了@Resource之后,问题解决了,真是多谢了

相关推荐

    详解Spring关于@Resource注入为null解决办法

    Spring @Resource 注解解决 null 问题 Spring 框架中,@Resource 注解是一种常用的依赖注入方式,用于将对象注入到应用程序中。但是,在实际开发中,经常会遇到 @Resource 注解的对象为 null 的问题。本文将详细...

    关于spring boot中几种注入方法的一些个人看法

    Spring Boot 中的几种注入方法 在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的...

    Spring三种注入方式(三)

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本篇主要介绍Spring中的三种注入方式,包括构造器注入、设值注入和...

    Spring注入的方式

    本文将详细探讨Spring中的两种主要注入方式:构造器注入和setter注入,以及它们各自的特点和适用场景。 首先,让我们理解什么是依赖注入(Dependency Injection,简称DI)。在传统的编程模式中,一个类通常会直接...

    spring注入配置文件

    spring注入配置文件,使用注解注入的

    Web服务器端在Action、dao、service之外实现spring注入

    我们在开发过程中经常会发生spring注入错误或失败的情况,其实Web服务器端在Action、dao、service包之内是很容易实现的,在这些包之外实现spring注入就不容易了,总是出错,其实根本原因是无法获得相应的spring上...

    spring依赖注入例子

    Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得对象之间的关系在运行时由Spring容器管理,而不是硬编码在类内部。这样可以提高代码的可测试性和可维护性,因为对象的依赖关系变得松...

    spring注入原理

    Spring框架是Java开发中不可或缺的一部分,它通过提供依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)等核心功能,极大地简化了企业级应用的开发工作。...

    spring的注入方式

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象间的依赖关系得以解耦,提高了代码的可测试性和可维护性。Spring提供了多种注入方式,包括set注入、构造注入和自动注入...

    Spring依赖注入检查.

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际...

    spring依赖注入底层详解

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...

    SpringIoc注入

    **Spring Ioc 注入详解** Spring 框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),也常被称为控制反转(Inversion of Control,IoC)。它是一种设计模式,可以减少代码之间的耦合,提高系统的可...

    request.getParameter()取值为null的解决方法

    根据上述文件信息,造成`request.getParameter()`取值为null的原因是页面元素的id属性和name属性设置不一致。 在HTML中,一个表单元素可以同时拥有id和name属性。id属性用于在同一个页面内唯一标识该元素,便于...

    用Spring注入Servlet文件 实现注入set

    使用spring的依赖注入,来实现servlet中注入dao层

    Spring定义bean的三种方式和自动注入

    下面将详细介绍这三种方式以及Spring的自动注入机制。 1. **基于XML的Bean定义**: 在XML配置中,我们通常在`applicationContext.xml`文件中定义Bean。例如,对于`Student`和`Teacher`类,我们分别创建`bean`标签...

    spring注入文件写法

    在Spring框架中,注入是一种将依赖关系从代码中解耦并允许对象在运行时自动配置的方法。本示例主要展示了如何使用Spring配置文件来实现数据源、Hibernate会话工厂、事务管理和DAO注入。以下是详细的知识点解析: 1....

    Spring注解注入属性

    为了防止这种异常发生,可以在`@Autowired`注解中设置`required`属性为`false`,此时,如果没有找到匹配的bean,该属性会被设为`null`。 2. **`@Resource`**:这是一个由JSR-250标准定义的注解,不仅被Spring支持,...

    Spring依赖注入使用构造设注入demo

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本篇将详细讲解如何使用构造器注入作为Spring依赖注入的一种方式,...

    Spring三种注入方式(二)

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本篇主要介绍Spring中的三种注入方式,着重讲解在"Spring三种注入...

    spring mvc拦截器过滤json中的null值

    在Spring MVC框架中,我们经常需要处理JSON数据,这些数据可能包含null值。在某些情况下,为了保持数据的整洁和避免后端处理null值时出现异常,我们需要在数据传输前过滤掉这些null值。本教程将详细介绍如何使用...

Global site tag (gtag.js) - Google Analytics