一. 一些概念
应用程序中说的依赖一般指类之间的关系。
泛化:表示类与类之间的继承关系、接口与接口之间的继承关系;
实现:表示类对接口的实现;
依赖:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。
关联:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示;
聚合:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;
组合:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;
Spring IOC容器的依赖有两层含义:Bean依赖容器管理生命周期和Bean依赖容器注入Bean的依赖资源。Bean依赖容器:Bean依赖IOC容器创建Bean并管理Bean的生命周期。Bean依赖容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以使Bean、外部文件、常量等,在java中都反应为对象,并且由容器负责组装Bean之间的依赖关系。
依赖注入的好处:(1)更好实践面向接口编程,代码清晰,可以动态替换bean依赖对象(外部资源)。(2)增加Bean的复用性、降低Bean之间的耦合。
二. 注入
注入的方式有两种:构造器注入和setter注入。
构造器注入:
<!-- 构造器注入 静态工厂实例化注入、实例工厂实例化注入省略-->
<bean id="dIHelloService1" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<!-- 参数索引注入 -->
<constructor-arg index="0" value="Hello World,DI"/>
<constructor-arg index="1" value="1"/>
</bean>
<bean id="dIHelloService2" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<!-- 参数名注入 bean构造器注入-->
<constructor-arg name="msg" value="Hello World,DI"/>
<constructor-arg name="size" value="2"/>
<constructor-arg name="city" ref="city"/>
</bean>
<bean id="dIHelloService3" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<!--参数类型 -->
<constructor-arg type="java.lang.String" value="Hello World,DI"/>
<constructor-arg type="java.lang.Integer" value="3"/>
</bean>
setter注入,包含一些数据类型注入的演示(构造器注入也可以):
<!-- setter方法注入 bean的setter方法 --> <bean id="dIHelloService4" class="self.springmvc.diConfig.service.impl.HelloServiceImpl"> <!-- 注入不同的数据类型实例 --> <!-- 注入常量 --> <property name="msg" value="Hello World,DI"/> <property name="size" value="4"/> <!-- 注入Bean setter注入--> <property name="city" ref="city"/> <property name="city2"> <ref bean="city"/> </property> <!-- 注入List--> <property name="list" > <list value-type="java.lang.String"> <value>张三</value> <value>李四</value> <value>王五</value> </list> </property> <!-- 注入Set--> <property name="set"> <set value-type="java.lang.String"> <value>张三S</value> <value>李四S</value> <value>王五S</value> </set> </property> <!-- 二维数组注入--> <property name="twoDiList"> <array> <array> <value>1</value> <value>2</value> </array> <array> <value>5</value> </array> </array> </property> <!-- Map注入 --> <property name="map"> <map key-type="java.lang.String" value-type="java.lang.String"> <entry> <key> <value>厦门</value> </key> <value>0592</value> </entry> <entry> <key> <value>泉州</value> </key> <value>05995</value> </entry> </map> </property> <!-- 注入java.util.Properties--> <property name="properties"> <props> <prop key="1">李四</prop> <prop key="2">张三</prop> </props> </property> <!-- null值处理--> <property name="times"> <null/> </property> </bean> <bean id="city" class="self.springmvc.diConfig.entity.City"> <property name="code" value="350300"></property> <property name="name" value="XiaMen"></property> </bean>
bean的注入:
<!-- bean的注入-->
<!-- 构造器注入-->
<bean id="dIHelloService5" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<constructor-arg ref="city" name="city"></constructor-arg>
</bean>
<!-- setter注入 -->
<bean id="dIHelloService6" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<property name="city">
<ref bean="city"></ref>
</property>
</bean>
<!-- 内部bean定义,对外部不可见-->
<bean id="dIHelloService7" class="self.springmvc.diConfig.service.impl.HelloServiceImpl">
<property name="city">
<bean class="self.springmvc.diConfig.entity.City"/>
</property>
</bean>