IoC,Inversion of Control,控制反转指对象以前由程序构造,现在由ioc容器构造。DI,Dependency Injection,依赖注入指对象的依赖资源以前由程序注入,现在由ioc容器注入。spring的核心是ioc容器,体现为一个类,代表是BeanFactory接口,其所做的一切都是基于容器管理的对象bean。该接口的直接实现类XmlBeanFactory从文件系统加载xml文件,直接扩展接口ApplicationContext的实现类FileSystemXmlApplicationContext从文件系统加载xml文件,另一个实现类ClassPathXmlApplicationContext从类路径classpath加载xml文件,内部通过BeanReader读取并解析xml,并根据解析内容生成BeanDefinition配置元数据类,最后由此类来构造对象bean。
<beans>
// 注册java自带的类型,程序中若果有多个类使用同一个类型的同一份数据,且此数据经常变化,可拿出来维护,由spring管理
<bean id="xxHashMap" class="java.util.HashMap">
// 构造注入
<constructor-arg>
<map>
<entry key="k1" value="v1"/>
<entry key="k2" value="v2"/>
..
</map>
</constructor-arg>
</bean>
// 无参构造器注册bean
<bean id="xxDao" class="..XxDaoImpl" />
<bean id="yyServiceRpc" class="..YyServiceRpc" />
<bean id="xxService" class="....XxServiceImpl">
// set注入
<property name="xxDao" ref="xxDao" />
<property name="yyServiceRpc" ref="yyServiceRpc" />
<property name="xxHashMap" ref="xxHashMap" />
</bean>
// 有参构造器注册bean
<bean id="xxService" class="..XxServiceImpl">
// 构造注入
<constructor-arg name="xxDao" ref="xxDao" />
<constructor-arg name="yyServiceRpc" ref="yyServiceRpc" />
<constructor-arg name="xxHashMap" ref="xxHashMap" />
</bean>
</beans>
public class XxDao implements XxDaoImpl {
..
}
public class YyServiceRpc {
// 外部服务
private YyService yyService;
..
public void setYyService(YyService yyService) {
this.yyService = yyService;
}
}
public class XxService implements XxServiceImpl {
private HashMap<String, String> xxHashMap;
public XxDao xxDao;
public YyServiceRpc yyServiceRpc;
..
// 构造注入必须提供有参构造方法
public XxService(XxHashMap xxHashMap, XxDao xxDao, YyServiceRpc yyServiceRpc) {
this.xxHashMap = xxHashMap;
this.xxDao = xxDao;
this.yyServiceRpc= yyServiceRpc;
}
// set注入必须提供set方法
public void setXxHashMap(XxHashMap xxHashMap) {
this.xxHashMap = xxHashMap;
}
public void setXxDao(XxDao xxDao) {
this.xxDao = xxDao;
}
public void setYyServiceRpc (YyServiceRpc yyServiceRpc) {
this.yyServiceRpc = yyServiceRpc;
}
}