概述
本章涵盖了控制反转 (IoC) 原则的 Spring Framework 实现。IoC 也称为依赖注入 (DI)。这是一个过程,其中对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后在对象实例上设置的属性来定义它们的依赖项(即,它们使用的其他对象) . 然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身的逆过程(因此得名,控制反转),通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖项的实例化或位置。
1.IOC理论推导
(1)前置分析
.在我们之前的业务中,用户的需求会影响我们的代码,我们需要根据用户的需求去改代码,修改一次的成本代价高,而采用注入方法后,程序不再具有主动性,而是被动的接收对象,与之前程序主动创建对象相比,程序不再每次创建对象管理,系统的耦合性大大降低,可以大大专注于业务
(2)ioc本质
a.原理:
为何需要大量的文字描述ioc,因为ioc(控制反转)不是一种技术,而是一种思想,对象的创建转移到第三方,由容器控制
b.实现:
控制反转是一种描述(XML或注解)并通过第三方获取特定对象的方式,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(ID)
c.进阶:
采用XML方式配置Bean 的时候,Bean的定义信息和现实分离,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解方式定义在实现类中,从而达到零配置的目的
图例
私以为文字过于繁杂,可绘制效果图看清楚:
传统创建模式
有IOC容器后的程序设计:
由上图可知,在IOC容器中同样创建了对象,它是如何创建对象的呢,这就引入了IOC容器概念
2.IOC容器
Spring IOC提供了两种基本的容器对象,BeanFactory和ApplicationContext,而BeanFatory是一个接口,ApplicationContext是由BeanFactory派生而来的,也提供了更多的实际应用功能,为了方便研究,可以直接看BeanFactory源码
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
根据源码分析,我们IOC容器创建对象其实是通过反射的方式创建的,那么我们就能理解为何我们要在xml文件中写入ID,source,在实例化对象中使用getBean方法
3.依赖注入方式
Sett方法依赖注入:方法比较直观,把需要注入的类写成属性,给它设置成一个Set方法即可,
构造方法注入:,方法注入时候,也是吧注入的类写成属性,然后再使用构造方法作为参数插入即可
注解依赖注入方式有:Autowired,Required:这两种都可以用于自动注入
,Qualifier,可以注入参数,但不能独立使用必须要定义@Service的注解
Resource,使用属性Name指定的bean的ID
Configration,Bean:前者表示课可以使用SpringIOC容器作为Bean定义的来源,后者表示返回对象,该对象被注册为spring中的Bean
4.练习方式:
网上已经用透了的User,Service 实例