相关问题
说明
设计目标 | 设计初衷
为了降低Java开发的复杂性,Spring采取了以下4种关键策略
BOP,bean oriented programming 面向bean编程
优点|好处
缺点
spring是轻量级的一站式开发框架,以 IoC、AOP 为核心,集成了Test模块来支持测试,集成了 Data Access 数据访问模块来操作数据源,集成了Web模块来支持web开发。
spring的5大版块|功能
Core Container 核心容器模块分为4个小模块
spring的核心是bean,核心组件都是围绕bean进行设计的
定义对资源的访问,用于加载资源
public interface Resource extends InputStreamSource {boolean exists();default boolean isReadable() {return exists();}default boolean isOpen() {return false;}default boolean isFile() {return false;}URL getURL() throws IOException;URI getURI() throws IOException;File getFile() throws IOException;default ReadableByteChannel readableChannel() throws IOException {wChannel(getInputStream());}long contentLength() throws IOException;long lastModified() throws IOException;Resource createRelative(String relativePath) throws IOException;String getFilename();String getDescription();}
Resource接口定义的是通用的资源访问,屏蔽了资源的来源、格式的不同,常见的最终实现类如下
用于描述bean的定义、元数据、bean之间的依赖关系。
xml文件或注解定义的bean会被转换为BeanDefinition实例,存储在 BeanFactory 中。
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {//scope常量String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;//role常量,标识bean在系统中的角色int ROLE_APPLICATION = 0; //开发自定义的beanint ROLE_SUPPORT = 1; //spring中对外提供支持、整合能力,暴露给开发使用的beanint ROLE_INFRASTRUCTURE = 2; //基础设施,spring中的基础bean//父BeanDefinition的namevoid setParentName(@Nullable String parentName);String getParentName();//BeanClassName,bean对应的java类的类名void setBeanClassName(@Nullable String beanClassName);String getBeanClassName();//作用域void setScope(@Nullable String scope);String getScope();//懒加载void setLazyInit(boolean lazyInit);boolean isLazyInit();/** 依赖关系。dependsOn 是当前bean依赖的其它bean的name。在getBean()中:合并BeanDefinition修改后,会先通过getBean()获取dependsOn依赖的实例,保证所有dependsOn依赖都已经实例化,再根据bean的scope调用createBean()创建bean实例 */void setDependsOn(@ dependsOn);String[] getDependsOn();/** 自动装配时是否优先选用。有多个可用实例时,会优先使用primary为true的bean */void setPrimary(boolean primary);boolean isPrimary();//要使用的 FactoryBean 的namevoid setFactoryBeanName(@Nullable String factoryBeanName);String getFactoryBeanName();//要使用的 FactoryMethod 的namevoid setFactoryMethodName(@Nullable String factoryMethodName);String getFactoryMethodName();//构造器的参数表,包括参数名、参数类型、参数值ConstructorArgumentValues getConstructorArgumentValues();default boolean hasConstructorArgumentValues() {return !getConstructorArgumentValues().isEmpty();}//属性值,包括属性名、属性值MutablePropertyValues getPropertyValues();default boolean hasPropertyValues() {return !getPropertyValues().isEmpty();}//初始化方法void setInitMethodName(@Nullable String initMethodName);String getInitMethodName();//销毁方法void setDestroyMethodName(@Nullable String destroyMethodName);String getDestroyMethodName();//bean的角色,比如spring本身的bean、第三方框架的bean、开发自定义的beanvoid setRole(int role);int getRole();//bean的描述文字。对bean进行简单介绍,主要给其他开发看void setDescription(@Nullable String description);String getDescription();//一些判断方法。可以把抽象类标识为bean,但抽象类本身是不会实例化的。boolean isSingleton();boolean isPrototype();boolean isAbstract();//bean对应的Resource的描述信息String getResourceDescription();/** 获取原始的BeanDefinition。一个bean可以用多种方式共同配置,在加载过程中会合并BeanDefinition的修改,这个bean最先解析提取到的BeanDefinition即为原始BeanDefinition */BeanDefinition getOriginatingBeanDefinition();}
BeanFactory是容器的顶级接口,定义IoC容器的基础功能,包括bean的创建、装配、获取、管理
spring加载资源、配置得到Resource,根据Resource创建Context。
context:背景、环境、上下文,融合了spring容器中的各种资源,开发者、第三方类库通过与context交互来操作spring容器、获取容器中的资源,相当于spring营造的的应用环境、spring对外暴露的util。
ApplicationContext 就是context模块中的。
IoC:Inversion of Control,控制反转,传统应用是由开发者在代码中控制对象的创建,IoC是将对象创建的控制权交给IoC容器,由IoC容器负责对象的创建、管理。
DL是EJB时代的实现方式,现在主流的实现方式是DI
IoC是一种编程思想,DI是IoC的一种实现方式
镜像问题
核心点:工厂模式+反射机制+工厂方法
主要采用工厂模式实现,通过 BeanFactory 的 getBean() 方法获取所需实例,如果实例不存在,会调用 createBean() 主动创建所需实例。
创建实例可以使用构造方法方式,实质是通过反射机制调用构造方法创建实例;也可以通过工厂方法创建实例。
镜像问题:spring是如何实现DI的?
通过 getBean() 获取bean实例时,如果没有对应的实例,会调用 createBean() 创建bean实例。
在填充属性阶段,根据注入模式选择 autowireByName() 或 autowireByType() 进行注入,在注入过程中使用 getBean() 获取所需依赖。
aop: Aspect-Oriented Programming 面向切面编程,是面向对象编程的一种补充, 在不改变原有业务逻辑的基础上添加额外的处理。
把和业务逻辑无关的横切逻辑剥离出来,不与业务代码耦合在一起,减少系统中的重复代码,使系统变得高内聚、低耦合,更易维护。
1、spring aop
spring早期版本提供的aop实现,只提供了简单的aop实现,局限多,只能对spring容器中的bean应用增强,只能对方法进行增强。
spring aop默认使用的代理策略、织入时机
spring aop的实现原理
2、aspectj
aspectj是一个专业的aop框架,提供了一套完整的aop解决方案,在spring的后续版本中集成aspectj。aspectj比spring aop更加强大,可对所有域中的对象进行增强,可对字段、方法、构造方法等内容进行增强。
aspectj的织入时机、原理
性能比较
aspectj的应用范围更广、性能更好,比spring aop更强大,更常用,也更推荐使用aspectj。
常见问题
简单来说就是实体类,用来封装对象,包含成员属性和对应的getter、setter方法。
bean是spring中的核心概念,使用spring其实是面向bean编程,开发的主要任务就是编写、配置bean。
spring中的bean有2层含义
实现了IoC的容器都可以叫做IoC容器,spring容器只是IoC的一种实现,只是IoC容器中的一种,spring容器 ≠ IoC容器。
相关问题:BeanFactory、ApplicationContext的联系与区别
BeanFactory
ApplicationContext
一般把 BeanFactory 称为低级容器、IoC 容器,把 ApplicationContext 称为应用上下文、高级容器,通常说的Spring容器是指高级容器 ApplicationContext 。
镜像问题
spring提供了2个容器
DefaultListableBeanFactory整合了BeanFactory体系的主要接口,功能齐全,常作为低级容器的实现。
AbstractApplicationContext 实现了加载|刷新配置的 refresh() 方法,是 ApplicationContext 的主要实现类,也是高级容器最终实现类的共同基类。
高级容器中内置了低级容器,通过内置的低级容器提供IoC容器的基础功能。
本文发布于:2024-01-31 14:42:24,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170668334729258.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |