Spring应用(二)IoC的理解
一、依赖注入的概念
Spring的两个核心概念:一个是控制反转(Inversion of Control,IoC),也可以叫做依赖注入(Dependency Injection,DI);还有一个面向切面编程(Aspect Oriented Programming,AOP)。Ioc和AOP虽然不是Spring首创,然而它在这两方面都做得很优秀,可以说整个Spring框架都是围绕着其IoC实现及AOP实现架设起来的。
控制反转模式的基本概念:当某个Java对象需要(依赖)另一个Java对象时,不是自身直接创建依赖对象,而是由实现IoC的容器(如Spring框架的IoC容器)来创建,并将它注入需要这个依赖对象的Java对象中。
应用系统系统中通过引入实现了IoC模式的IoC容器,就可以由IoC容器来管理对象的生命周期和依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。
二、Spring的依赖注入
Spring框架就带有一个IoC容器。它使用的依赖注入方式有构造器注入和Setter注入两种。
1、构造器注入
构造器注入,指的是通过构造方法来传入所依赖的对象,从而完成依赖关系的设定。
2、设置注入
设置注入是指通过setter方法传入依赖对象。这种注入方式简单而且直观。
三、综合案例
package cn.csdn.service; public interface SpringService { void display(); } package cn.csdn.service; public class SpringServiceImpl implements SpringService { private String say; private String str; public SpringServiceImpl() { // TODO Auto-generated constructor stub } public SpringServiceImpl(String str, String say) { this.str = str; this.say = say; } public void setSay(String say) { this.say = say; } public void setStr(String str) { this.str = str; } @Override public void display() { // TODO Auto-generated method stub System.out.println(str + "J2EE Spring," + say); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="ssi" class="cn.csdn.service.SpringServiceImpl"> <!-- setter()设置注入 <property name="say" value="IoC控制反转"></property> --> <!-- 构造器注入1,通过参数的索引位置匹配 (索引位置index从0开始) <constructor-arg index="0"> <value>你好!</value> </constructor-arg> <constructor-arg index="1"> <value>O(∩_∩)O哈哈~</value> </constructor-arg> --> <!-- 构造器注入2,通过参数类型匹配(按照构造器中参数的顺序、类型逐个匹配,当构造器中参数顺序、类型发生变化时,下面的参数配置顺序、类型也要进行相应的调整) --> <constructor-arg type="java.lang.String"> <value>你好!</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>O(∩_∩)O哈哈~</value> </constructor-arg> </bean> </beans>
package cn.csdn.junit; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import cn.csdn.service.SpringService; public class SpringJunit { @Test public void test1() { ApplicationContext ac = new ClassPathXmlApplicationContext( new String[] { "applicationContext.xml" }); SpringService se = (SpringService) ac.getBean("ssi"); se.display(); } @Test public void test2() { ApplicationContext ac = new FileSystemXmlApplicationContext( new String[] { "src/applicationContext.xml" }); SpringService se = (SpringService) ac.getBean("ssi"); se.display(); } }
Spring的容器有两个接口:BeanFactory和ApplicationContext,这两个接口的实例被称为Spring应用上下文,它们都是用来产生Bean的工厂,即负责创建和管理Bean。
在实际应用中推荐使用ApplicationContext,它是BeanFactory的子接口,具有比BeanFactory更完善的功能。它的实现类常用的是org.springframework.context.support包中的以下三个类:
ClassPathXmlApplicationContext:主要用来从类路径(CLASSPATH)中的xml文件载入上下文定义信息。
FileSystemXmlApplicationContext:从指定的文件系统路径中的xml文件载入上下文定义信息。
XmlWebApplicationContext:从Web系统中的xml文件载入上下文定义信息。
在创建Spring上下文的实例时,必须提供Spring容器管理的Bean的详细配置信息,Spring的配置信息通常会采用xnl文件。所以,在创建Spring上下文实例时,应该提供xml配置文件作为参数传入。