IoC称做反转控制,用来消减计算机程序的耦合问题。依赖注入(DI)是IoC的另外一种说法。概念我就不讲了,网上一找一大堆。
我的理解就是把实例化的过程交给Spring容器来实现,就是我们直接从Spring容器里面获取就可以,不需要自己去 new ClassName();。
项目的目录格式如下:
在src的main目录下创建TestDao的接口、TestDaoImple的实现类。在test目录下创建Test测试类。
package dao.itf;
public interface TestDao {
public void sayHello();
}
package dao.impl;
import dao.itf.TestDao;
import org.springframework.stereotype.Service;
public class TestDaoImpl implements TestDao{
public void sayHello() {
System.out.println("Hello, 关注我的博客吧!");
}
}
applicationContext.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.xsd">
<!-- 将指定类TestDaoImpl配置给Spring,让Spring创建其实例 -->
<bean id="test" class="dao.impl.TestDaoImpl" />
<!-- 意思是 创建一个bean 名字(id)是 test ,它的class文件来自dao.impl.TestDaoImpl这个地方 -->
</beans>
我们一会就要从Spring容器中获取到TestDaoImpl的实例对象。介绍三种方式。
先介绍一个类,叫‘ApplicationContext’。是BeanFactory的子接口。详细功能自行在了解,下面讲它的其中一个用法,从XML文件中装配和获取Bean。
第一种:
通过ClassPathXmlApplicationContext创建:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.itf.TestDao;
public class Test {
public static void main(String[] args) {
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDao t = (TestDao)appCon.getBean("test");
t.sayHello();
}
}
ClassPathXmlApplicationContext会从类路径目录(src根目录)中寻找指定的XML配置文件。
运行结果为:
第二种
通过FileSystemXmlApplicationContext从绝对路径中找XML文件。
PS:文件路径的斜杠是两条斜杠 “\\”!
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import dao.itf.TestDao;
public class Test {
public static void main(String[] args) {
ApplicationContext appCon = new FileSystemXmlApplicationContext("F:\\Workspaces\\Myeclipse\\MavenTest\\src\\main\\java\\applicationContext.xml");
TestDao t = (TestDao)appCon.getBean("test");
t.sayHello();
}
}
结果跟第一种一样。
第三种
通过Web服务器实例化ApplicationContext容器,在Web.xml文件中添加以下代码。
<!-- 指定Spring的配置文件,多个配置文件以逗号分隔 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-config/applicationContext.xml
</param-value>
</context-param>
<!-- 指定以Listener方式启动Spring容器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
尚未运行
总结:
采用绝对路径(方法2)的加载方式将导致程序的灵活性变成,一般不这么使用。
通常在Spring的Java应用中采用ClassPathXmlApplicationContext(第一种)来实例化 ApplicatonContext容器(就是我们现在写的不涉及服务器的代码)。
在Web应用中则是用Web服务器来实例化 ApplicatonContext容器(第三种)。