Spring依赖注入原理

Spring是一个轻型框架,这应该不是说它的功能小,而是它的功能是可选的。如下图:

spring的core核心提供了spring框架的基本功能。包括BeanFactory,它是spring容器的基础,也是spring依赖注入的基础。

所有spring的应用上下文都是建立在核心框架上面(core)。这种模型使spring可以支持很多企业应用服务,如email、JNDIaccess、EJBintergration、remoting等等。

spring的依赖注入(dependency injection)在2004年之后也叫做控制反转(inversion of control)。其最大的优势是低耦合,如在下面可以简单说明依赖注入的例子:首先我们定义一个HelloWordService接口
public interface HelloWordService{
void sayHello()}
在HelloWord中实现这个接口
public class HelloWord implements HelloWordService{
private string greeting;
public HelloWord(){}
public HelloWord(String greetin){
this.greeting = greeting;
}
public void setGreeting(String greeting){
this.greeting = greeting;
}
public void sayHello(){
System.out.print(greeting);
}
}
在spring的xml配置文件中还要增加hello.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.0.xsd">
  <bean id="helloWordService"
      class="com.test.HelloWord">
    <property name="greeting" value="test DI" />
  </bean>
</beans>

spring的依赖注入一般有两种方法,一在构造方法中注入,二是在setter方法中注入(如本例)。

Foo类定义了Bar接口时,那Foo就并不用关心Bar的实现类,Bar的实现类可以是本地POJO、远程web服务、EJB等,而Foo类并不知道也不用关心。

BeanFactory是spring容器的基础,如使用XmlBeanFactory读取hello.xml:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class HelloApp {
  public static void main(String[] args) throws Exception {
    BeanFactory factory = 
        new XmlBeanFactory(new FileSystemResource("hello.xml"));
    HelloWordService hello= 
        (HelloWordService) factory.getBean("helloWordService");
    hello.sayHello();
  }
}

然而追求低耦合也不是完美的,如低耦合的代码更难测试、重用也有困难、更难理解、特别也会出现这样的情况“解决了一个bug而带来了一个或者多个bug”。

相关推荐