Spring & SpringBoot

177 阅读3分钟

Spring

两个核心IOC和AOP

IOC:依赖注入,由IOC容器来管理对象的依赖关系
AOP:面向切面编程,指定切入点在不改变以前代码的情况下,对之前代码做出加强,基于动态代理(JDK、cglib)

IOC

IOC初始化:将标记的Bean加载到IOC容器的过程,此时不包含Bean的依赖注入, Bean的依赖注入是第一次调用getBean方法发生的。(可以通过定义Bean的lazyinit属性预加载)

Bean在IOC容器中会被包装成BeanDefination被容器管理

IOC双亲容器:子容器可以引用父容器的Bean,但是父容器不能引用子容器的Bean,并且各个子容器中定义的bean是互不可见的,这样也可以避免因为不同的插件定义了相同的bean而带来的麻烦。
应用场景:插件或组件的接入,只需要对方提供JAR即可,由父容器进行引导,各个子容器再完成自己的应该完成的工作即可。

IOC初始化: 初始化主要分为三步:
·1)BeanDefinition的Resource定位 2)载入 将Bean封装成BeanDefination 3)注册 将BeanDefination装入一个HashMap中

依赖注入的过程中Bean实例化使用工厂模式创建,使用CGLIB进行Bean的实例化

springboot约定优于配置

基于spring提供了很多默认配置,可以快速构建一个spring工程,简化使用 Spring 框架的难度,简省繁重的配置,零xml配置,内嵌servlet容器(tomcat、jetty),生态圈强大

启动类@SpringBootApplication中嵌套的三个核心注解,@Cofiguration @ComponentScan @EnableAutoConfiguration

@Configuration表示启动类也是一个Java配置类

@ComponentScan扫描指定路径下(若不指定默认扫面启动类当前目录以及子目录)标注(Component、Configuration、Controller、Service、Respority)的需要被IOC管理的Bean

@EnableAutoConfiguration配合Import,扫描不在指定路径下但是符合条件的Bean加载到IOC容器。

springboot最重要的功能:自动配置

1)加载依赖jar中的bean到ioc容器
2)自动将配置文件中配置注入到对应的配置bean中

具体实现依赖于@EnableAutoConfiguration注解,通过@import注解加载AutoConfigurationImportSelector到IOC容器,在该类中的方法selectImports调用SpringFactoriesLoader.loadFactoryNames方法获取配置在META-INF/spring.factories的自动配置类*AutoConfiguration,在各个AutoConfiguration中配置了需要加载到ioc中的bean并且对需要引入注入配置文件信息的bean使用@ConditionalOnProperties注解注入配置信息。

Enable*实现原理

springboot启动流程

常用注解

@Bean:产生一个由IOC容器管理的bean

@Configuration:定义配置类,把内部带有bean注解标记的方法产生的bena交由IOC容器管理,使用cglib增强方法,使得autowired和直接调用方法返回的都是同一个实例。

@Component: 定义配置类,把内部带有bean注解标记的方法产生的bena交由IOC容器管理,但是调用方法产生不同的实例。

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@scope:作用域 singleton单例 prototype每次产生新的实例 request每个请求都会产生新的 session每次会话

@Conditional根据特定的条件控制bean的创建