谈谈IOC
IOC是Spring的两大核心概念之一,IOC通过Bean容器自动的帮助我们创建对象,不需要手动去创建。IOC有一个很强大的功能DI(依赖注入),我们可以通过xml或者Java代码的方式,把我们想注入的对象属性或方法注入到IOC容器中。
依赖注入体现了Spring强大的特性:解耦。举个例子,我们使用JdbcTmeplate或者Durid时,如果他俩强耦合在一起,会导致使用JDBCTemp必须使用Durid数据源,依赖注入可以保证使用JdbcTemp只需要依赖于数据源接口,不需要强依赖于任何一个数据源。
Spring在启动时就会把Bean创建后,这样运行速度更快。并且我们使用的大多数Bean对象都是单例的,用的时候直接注入就行了,我们不需要手动写单例,非常方便。
谈谈AOP
在日常工作中会遇见很多重复性的代码,比如日志。我们需要在很多类中都写日志,这样每个类都手动写非常麻烦。Spring提供了AOP的概念,我们可以把这些共有的代码抽取出来。然后切入到我们需要的类中,这样减少代码,提高代码复用性。
Aop基于动态代理实现,如果要代理的对象有接口,我们就是用java原生的动态代理实现,如果没有提供接口就会采用cj-lib来创建动态代理。
聊聊SpringBoot自动装配的原理
SpringBoot是从main方法开始启动的。在main方法中我们会调用SpringApplication.run方法。run方法执行会调用refreshContext方法,刷新容器,扫描解析@SpringBootApplication注解。此时开始调用@SpringBootApplication注解里面的内容。
这个注解里面包含了一个EnableAutoconfigure的开启自动配置的注解。这个注解里面又包含了一个Import注解,Import进来一个AutoConfigurationImportSelector类,这个类里面提供一下核心方法,例如getResources,帮助我们从类路径下,Meta-INF/spring-factories下,扫描所有sprintboot提供的启动器标签,根据导入的jar包就是启动器,以及注入的Bean容器来把符合条件的标签注入到Bean容器中,即实现自动装配。
如果没有引入对应的starter启动器,@ConditonalOnClass注解会因为扫描不到不会把相应的Template代码注入到bean容器中。