IOC 定义
IOC 是控制反转,其实现方式是 DI,也就是依赖注入。在以前,对象的创建和销毁都是由用户控制的。有了 IOC 之后,这些都交给 spring 来控制,只需关心业务。
IOC 还解决了类之间的耦合性,加入A需要依赖 B 对象,在 spring 中通过在 A 类中标注@Autowired 注解引入 B 即可,B 对象内部修改了代码,A 对象是不用改动的,这也符合软件设计的开闭原则。
IOC 的实现机制是什么?
采用简单工厂模式 + 反射
在没有spring 的时候,使用 new 的方式创建对象,这样耦合度很高,因此可以采用简单工厂模式方式,对工厂方法传入一个参数,根据这个参数判断需要创建哪个对象。这种方式也会存在一个问题,要创建的对象一旦多起来,会频繁改代码,因此使用反射在工厂方法内部创建对象,用来替换new 的方式。
相当于spring 加载 xml 配置文件,然后调BeanFactory 的 getBean 方法,该方法有很多重载方法,传入一个对象的全路径。然后通过getInstance() 创建对象。
IOC的加载
IOC 的加载包括两大步骤:配置文件的注册、IOC 流程
IOC 的加载是从调用 spring 上下文的构造方法开始的
Spring 配置IOC有两种方式
一种是JavaConfig,另一种是xml方式。
- xml 方式是 new 一个 ClassPathXmlApplicationContext,Javaconfig 方式是new 一个 AnnotationConfigApplicationContext,调用它们的有参构造方法。
public static void main(String[] args) {
//JavaConfig的配置方式
AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(IOCConfig.class);
//XML的配置方式
ClassPathXmlApplicationContext context2 = new ClassPathXmlApplicationContext("classpath:IOCConfig.xml");
}
Javaconfig 方式
@Configuration//代替了xml, 保证了baen是单例的
@ComponentScan // 默认扫描当前类所在的包
public class SpringConfig {
@Bean // 代替了 <bean>
public Bean2 getUserServie(){
return new Bean2();
}
}
xml 方式
<componment-scan basePackage = "" />
<bean id="" />