Spring是一个轻量级的Java框架,解决了业务逻辑和其他各层的耦合问题,简化了Java开发
Spring的框架的核心:IOC控制反转和AOP切面编程
Spring利用了很多的反射,会影响性能,但是和它的优点相比,是完全可以接受的
Core:提供了框架的基本组成部分,包括IOC和DI
Beans:提供了BeanFactory,工厂模式的实现,用于管理对象
Context:提供了对象访问方法
JDBC:提供了对JDBC的支持,省去了JDBC繁杂的编码
AOP:提供了切面编程的实现,可以自定义拦截器等
Web:提供了针对Web开发特性,比如文件上传等
Test:提供了测试支持,支持使用Junit方便进行测试
IOC(Inversion of Control)即控制反转,把传统的由程序代码手动操控对象的调用权交给容器,通过容器完成对象的创建和管理 ;IOC负责创建对象 、通过DI依赖注入维护对象之间的关系,并且管理对象的整个生命周期
管理了对象的创建和依赖关系的维护。当对象关系复杂时,手动创建和维护是很麻烦的
解耦,避免硬编码造成的过度耦合
IOC和DI降低了代码量
IOC的实现原理是工厂模式加反射机制
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。
ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
Bean的加载方式:
BeanFactory是通过延迟加载的方式来注入Bean的,也就是只有在第一次调用获取bean时,bean才会加载,这样的问题就是我们只有在调用才能发现Spring的配置问题
ApplicationContext在容器启动时,一次性创建了所有Bean,这样在容器启动时我们就会发现Spring的配置哪里有问题,ApplicationContext唯一不足就是当配置的Bean有很多,启动就会比较慢
注册方式:
BeanFactory需要手动注册,而ApplicationContext则是自动注册。
ClassPathXmlApplicationContext:加载类路径下的xml文件
FileSystemApplicationContext:加载磁盘任意路径下的xml文件
AnnotationApplicationContext:读取注解
组件之间的依赖关系由Spring容器在运行期决定,由容器动态的将某种依赖关系的目标对象实例注入到应用系统各个关联的组件中
依赖注入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对象,配置对象的工作应该由IoC容器负责
依赖注入的优势:让容器全权负责依赖查询,需要依赖的组件只需要暴露set方法或者构造函数或者接口即可
依赖注入有接口注入、set方法注入、构造函数注入;接口注入由于灵活性比较差,在Spring4的时候废弃掉了
set方法注入:容器通过调用无参构造实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
两者对比:
set方法:可以直接使用默认的构造函数创建对象,获取对象时,如果没有注入,会没有值,不严谨
构造函数:创建对象时必须注入数据,否则创建不成功 ,即使有的数据用不到
对bean的scope属性指定作用域
Spring框架支持以下五种bean的作用域:
虽然只有一个实例,但并不是线程安全的,因为spring没有对单例做线程安全的处理;
但是在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题
ThreadLocal和线程同步机制都是为了解决多线程并发下相同实例访问冲突的问题;不同的是线程同步机制是采用"时间换空间"的方式,仅提供一份变量,不同的线程访问变量通过锁机制来控制;而ThreadLocal是采用的"空间换时间"的方法,每个线程都有一个独享的变量,从而隔离了多线程下的访问冲突问题;
1.Spring对bean进行实例化;
2.Spring将值和bean的引用注入到bean对应的属性中;
3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
6.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
7.如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
此时,bean已经准备就绪,如果被应用程序使用,就会驻留在上下文,直到销毁
1.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起
对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式。
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
使用@Autowired自动装配bean之前需要在配置文件进行配置<context:annotation-config/>
在启动IOC时,容器自动状态了AutowiredAnnotationBeanPostProcessor处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean并装配给该对象的属性。
如果查询的结果刚好为一个,容器就会把@Autowired指定的对象装配该Bean
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。如果不想抛出异常,使用required=false。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。
依赖注入的本质就是装配,装配时依赖注入的具体行为
原文:https://www.cnblogs.com/dingjn/p/12846526.html