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的创建