IoC
在学习Spring之前,首先需要了解什么是IoC。
IoC的全称是Inversion of Control,中文叫做控制反转。
IoC这个概念其实很常见,只不过是Java里又包装出了一个概念,容易唬住新手。它还有个别名叫依赖注入(Dependency Injection)。额,又冒出来一个概念。大家不要怕,我这里只是为了把已有的概念联系起来。《head first设计模式》中,模板方法模式里提到的好莱坞原则“Don't call us, we will call you.”,也是IoC的思想。
下面上代码,使用IoC之前的代码:
public FXNewsProvider()
{
newsListener = new DowJonesNewsListener();
newPersistener = new DowJonesNewsPersister();
}
使用IoC之后的代码:
public FXNewsProvider(IFXNewsListener newsListner,IFXNewsPersister newsPersister)
{
this.newsListener = newsListner;
this.newPersistener = newsPersister;
}
这就是IoC做的事情,将FXNewsProvider从依赖具体的类中解耦出来。
在Spring中使用IoC
回到Spring,IoC和Spring又有什么关系呢?
Spring使在项目中使用IoC变得非常简单,而且必须。
刚从别的框架转到Spring的开发者可能会感到有点不适应,每次引用一个类,都需要在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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<!-- Definition for textEditor bean -->
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
</bean>
<!-- Definition for spellChecker bean -->
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
</bean>
</beans>
这样配置以后,在类中引用textEditor或者spellChecker,都不需要显式声明了。直接增加Autowired注解,Spring在启动的时候,就会自动为你实例化并注入依赖的类中。
package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Autowired;
public class TextEditor {
@Autowired
private SpellChecker spellChecker;
public TextEditor() {
System.out.println("Inside TextEditor constructor." );
}
public SpellChecker getSpellChecker( ){
return spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
<beans>的属性很多,这里简单介绍一个比较常用的:
default-lazy-init:默认值为false,用来标志是否对所有的<bean>进行延迟初始化。如果想让程序启动速度加快,可以将false改为true,在启动时跳过bean的初始化。
Spring的容器
Spring的容器有两种类型:BeanFactory和ApplicationContext。
BeanFactory是基础类型IoC容器,ApplicationContext在BeanFactory的基础上勾践,是相对比较高级的容器实现。
我们先介绍BeanFactory,上面的xml文件配置了以后,还需要在代码里告诉Spring去哪里加载这个xml文件。
package com.tutorialspoint;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory
(new ClassPathResource("Beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
obj.getMessage();
}
}
参考内容:
《Spring 揭秘》
Sping 的 BeanFactory 容器
Spring @Autowired 注释