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”。
相关推荐
与卿画眉共浮生 2020-11-13
smalllove 2020-11-03
hellowordmonkey 2020-11-02
丽丽 2020-10-30
周太郎 2020-10-28
greensomnuss 2020-10-27
职业炮灰 2020-10-16
与卿画眉共浮生 2020-10-14
feinifi 2020-10-14
feinifi 2020-10-13
yangjinpingc 2020-10-09
davis 2020-09-29
RickyIT 2020-09-27
lisongchuang 2020-09-27
tangxiong0 2020-09-03
meleto 2020-08-17
幸运小侯子 2020-08-14
YangHuiLiang 2020-08-06