`
garrincha
  • 浏览: 13573 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

2Spring xml配置IOC——注入对象

阅读更多
上一讲介绍了如何使用xml注入值类型,这里我们要注入的是对象。
这里我们需要用到2个类,分别是UserDao和UserService,UserDao是直接与数据库打交道的类,而UserService是面向业务给业务提供调取方法的类。

UserService是需要调取UserDao用于实现自己的业务逻辑的。

继续使用上一个例子的代码

1、新建UserDao类,包com.spring.dao
这里我们并没有真正的操作数据库,打印一行文字来代替
package com.spring.dao;

public class UserDao {

	public void add()
	{
		System.out.println("执行UserDao.add()方法");
	}
}

2、新建UserService类 包com.spring.service
package com.spring.service;

import com.spring.dao.UserDao;

public class UserService {

	private UserDao dao;
	public UserDao getDao() {
		return dao;
	}
	public void setDao(UserDao dao) {
		this.dao = dao;
	}
	public void add()
	{
		dao.add();
	}
	
}

3、xml文件springbeans.xml
我们将要使用xml把dao这个属性通过setDao方法注入到UserService中。
xml文件如下
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
            
            <bean id = "dao" class="com.spring.dao.UserDao"></bean>
            <bean id="userService" class ="com.spring.service.UserService">
            		<property name="dao" ref="dao"></property>
            </bean>        
</beans>

这段xml中配置了2个bean,分别对应UserDao类和UserService类的实例。这两个bean经过spring的解析之后会生成2个对象。而ref = "dao"这里的dao对应了id="dao"这句。把UserDao的对象实例注入到了UserService的dao属性中。
4新建测试类UserServiceTest包com.spring.service.test
package com.spring.service.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.UserService;
public class UserServiceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ApplicationContext ctx = new ClassPathXmlApplicationContext("springbeans.xml");		
		UserService service = (UserService) ctx.getBean("userService");
		service.add();
	}

}

如果没有spring,这段代码会报null的异常,因为UserService中的dao属性并没有被设置,是null,这样调用service.add()方法时候会调用到dao.add()方法。会报null的exception。而spring帮我们根据名字自动注入了dao属性。这就是spring做的工作。
现在测试一下。

2014-8-26 19:45:15 [color=red]org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61b383e9: display name [org.springframework.context.support.ClassPathXmlApplicationContext@61b383e9]; startup date [Tue Aug 26 19:45:15 HKT 2014]; root of context hierarchy
2014-8-26 19:45:15 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [springbeans.xml]
2014-8-26 19:45:15 org.springframework.context.support.ClassPathXmlApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@61b383e9]: org.springframework.beans.factory.support.DefaultListableBeanFactory@4839e5b5
2014-8-26 19:45:15 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4839e5b5: defining beans [dao,userService]; root of factory hierarchy[/color]
执行UserDao.add()方法


正确执行

下面是错误的调用方法
倘若测试代码部分改为
package com.spring.service.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.UserService;
public class UserServiceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UserService service = new UserService();
		service.add();//因为service对象中的dao属性是null,所以在这里会报错
	}

}

会报空指针异常,结果如下
Exception in thread "main" java.lang.NullPointerException
	at com.spring.service.UserService.add(UserService.java:16)
	at com.spring.service.test.UserServiceTest.main(UserServiceTest.java:12)


分享到:
评论

相关推荐

    Spring IOC:找对象的一次革命(1)

    Spring IoC的配置主要通过XML或注解的方式进行,它支持复杂的依赖关系配置,并提供了强大的依赖注入机制,使得开发者可以专注于业务逻辑,而无需关心对象的创建和管理细节。 ### 结论 Spring IoC作为一种革命性的...

    Spring的ioc小案例

    本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...

    Spring IOC之方法注入

    本文将深入探讨Spring中的一个特殊概念——方法注入,它是IOC的一种扩展形式。 方法注入允许我们在运行时通过容器调用特定的方法来传递依赖。这种方法与传统的构造器注入和属性注入相比,提供了更大的灵活性,因为...

    Spring与IoC系列三:基于XML的依赖注入测试程序di.rar

    总结来说,这个"Spring与IoC系列三:基于XML的依赖注入测试程序di.rar"涵盖了Spring框架的核心特性——依赖注入,通过XML配置文件管理对象间的依赖关系,是学习和实践Spring框架不可或缺的一部分。通过学习和操作这...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    Spring源码分析_Spring_IOC

    对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的中心,同时也是实现依赖注入(Dependency Injection,DI)的关键所在。在Spring框架中,IOC容器扮演着至关重要的角色,它负责管理...

    Spring之IOC示例

    Spring实现IOC的方式主要有两种:依赖注入(Dependency Injection,简称DI)和基于接口的配置。依赖注入是指通过构造函数、设值方法或者属性来将依赖的对象传入,而不是由类自己去查找或创建。这种设计模式降低了类...

    Spring IoC简单示例-注解配置-Maven构建

    在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...

    Spring——IOC(控制反转)与DI(依赖注入).docx

    Spring容器会根据配置(XML或注解)来决定注入哪个UserDao实现,可能是UserDaoMysqlImpl或UserOracleImpl。这样,即使需要更改数据库,只需要修改配置,无需改动UserService的代码,体现了控制权的反转。 Spring...

    Spring实现原理及IoC容器的优点

    Spring IoC容器通过XML配置文件或注解来管理对象及其依赖。XML配置文件中定义了bean的定义,包括类名、属性等,而注解如@Autowired则可以自动匹配和注入依赖。Spring容器通过反射机制实例化对象,解析并注入依赖。...

    Spring2的IOC利器统管Bean世界.rar

    总的来说,Spring2的IOC机制通过控制反转和依赖注入,实现了对Bean的集中管理和灵活配置。无论是XML配置还是注解驱动,都极大地提高了开发效率,降低了系统复杂性。理解并熟练运用这些知识,对于任何Java开发者来说...

    Spring的IoC实现案例

    在Spring框架中,IoC容器负责创建对象、管理它们之间的依赖关系,并在需要时注入这些依赖。 让我们开始分析“Priter”类。这个类代表了打印机,它可能有一个或多个方法用于执行打印操作。为了实现灵活性,我们不...

    spring ioc+mvc代码

    Spring通过容器来管理对象的生命周期和依赖关系,开发者只需定义对象的配置信息,由容器负责实例化、装配和管理对象。 1.1 容器的构建与初始化 在实现中,我们可以创建一个`ApplicationContext`类作为容器,它负责...

    Spring IOC测试

    【Spring IOC测试】\n\n在Java开发领域,Spring框架是不可或缺的一部分,尤其其核心特性——Inversion of Control(IOC,控制反转),更是备受推崇。本文将深入探讨Spring的IOC特性,并通过一个XML配置文件的示例来...

    Spring————面试题库

    在Spring框架中,通常会把应用程序对象定义在XML配置文件中,Spring IoC容器会解析这些XML文件,并根据文件中定义的bean的配置信息来创建和管理这些对象。举例来说,使用ClassPathXmlApplicationContext可以从...

    Spring的IoC容器初始化源码解析

    #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...

    Spring基础:IoC容器(1)

    在“Spring基础:IoC容器(1)”这个主题中,我们将深入探讨Spring的核心组件——IoC容器,以及它如何管理对象的生命周期和依赖关系。 IoC(Inversion of Control),也称为控制反转,是一种设计模式,它将对象的创建...

    spring的ioc说明

    IoC是一种设计模式,它改变了传统对象创建和管理的方式,将对象的创建和组装的控制权从对象自身转移到了外部的容器,即Spring的IOC容器。 Spring作为IOC容器,负责管理对象的生命周期和对象间的依赖关系。这使得...

    Spring基础:IoC容器(2)

    在本篇博文中,我们将深入探讨Spring框架的基础概念,特别是其核心特性——控制反转(Inversion of Control,IoC)容器。IoC容器是Spring框架的基石,它负责管理对象的生命周期和对象间的依赖关系。通过IoC,我们...

    自己动手做框架(27)——配置IOC框架.rar

    【标题】"自己动手做框架(27)——配置IOC框架"揭示了这一主题的核心,即探讨如何构建自己的依赖注入(DI)框架,特别是通过配置XML文件来实现控制反转(IOC)。IOC是一种设计模式,它将对象的创建和管理的责任反转,...

Global site tag (gtag.js) - Google Analytics