¡Adéntrate en Spring y comienza desde el código fuente!
Explore el marco más popular de Java, comprenda sus mecanismos internos y llévelo desde principiante hasta competente.
⚡ Tecnología | Introducción | ¿Por qué? Como una estrella | Contáctame |
⚡Tecnología
Introducción
Hola a todos, ¿mi nombre es Lex?. Soy un desarrollador back-end Java con 8 años de experiencia y un programador apasionado por el framework Spring❤️. Para ayudar a los programadores que desean aprender más sobre el marco Spring, creé esta "Serie de lectura de código fuente de Spring". A través de esta serie, espero explorar el funcionamiento interno de Spring contigo. Si tiene el mismo interés o pregunta, ¡contácteme!
¿ Por qué realizar el análisis del código fuente de Spring ?
En mi trabajo como desarrollador de marcos, a menudo me encuentro con situaciones en las que necesito comprender y ajustar profundamente el comportamiento del marco. Estas tareas no consisten simplemente en utilizar la API del marco, sino que también requieren una comprensión detallada del funcionamiento interno del marco. Aunque existen versiones simplificadas de Spring en Github, que de hecho son muy útiles para comenzar, cuando se trata de aplicaciones de proyectos reales, siguen siendo muy diferentes del marco Spring real. Por lo tanto, comencé a estudiar el código fuente de Spring en profundidad, con la esperanza de comprender más a fondo su mecanismo de trabajo interno para poder aplicarlo mejor a mi trabajo real. Compartir mi análisis de código fuente también es para proporcionar referencias y ayuda a los desarrolladores que desean comprender realmente Spring, no solo usarlo.
Sólo dame una estrella
Queridos amigos, realmente pasé mucho tiempo investigando y organizando esta "Serie de lectura de código fuente de Spring". Si cree que esto no está mal o le ha brindado un poco de ayuda, haga clic en la estrella. Realmente significa mucho para mí y cada estrella me hace sentir que todo el trabajo duro vale la pena. Sé que esto es poca cosa, pero tu clic es el mejor estímulo para mí. De todos modos, gracias por tomarte el tiempo de leer mi contenido, ¡realmente lo aprecio!
?Serie de lectura de código fuente de primavera
Núcleo de resorte
Carga y acceso a recursos
Recurso: interfaz abstracta, que representa archivos, rutas de clases, etc., utilizada para acceder a recursos de diferentes fuentes.
ResourceLoader: la interfaz central para la adquisición de recursos, que implementa la estrategia de cargar recursos de manera uniforme desde diferentes ubicaciones.
ResourcePatternResolver: interfaz de resolución de patrones de recursos, utilizada para cargar de manera flexible múltiples recursos en aplicaciones.
DocumentLoader: interfaz principal de carga y análisis de documentos XML, que admite la configuración automática de aplicaciones Spring en segundo plano.
Metadatos y filtrado
MetadataReader: el núcleo de la adquisición de metadatos de clase, que admite funciones avanzadas como escaneo de componentes, anotaciones condicionales y AOP.
AnnotationMetadata: obtenga y opere dinámicamente información de anotaciones de clases en tiempo de ejecución.
TypeFilter: personalice el filtrado de clases durante el escaneo de componentes, admitiendo condiciones complejas y filtrado preciso.
Condición: juicio condicional, un mecanismo flexible que determina la creación y configuración del Bean.
Validación, enlace de datos y conversión de tipos.
Validador: proporciona lógica de validación de datos personalizada para garantizar que los objetos del modelo cumplan con las reglas comerciales.
PropertyEditor: personalice la lógica de conversión de las propiedades de JavaBean y maneje la conversión del tipo de propiedad.
Convertidor: se utiliza para la conversión entre diferentes tipos, definiendo reglas simples de conversión de tipos de origen a destino.
ConverterFactory: crea un convertidor para un tipo de fuente específico para la conversión de tipos.
GenericConverter: un conversor más complejo que admite múltiples conversiones de tipos de origen y destino.
ConditionalConverter: un convertidor que elige si realizar la conversión en función de las condiciones.
ConversionService: proporciona una interfaz de servicio de conversión de tipo unificada y gestiona convertidores.
Impresora: se utiliza para formatear objetos en texto, centrándose en la salida formateada.
Analizador: se utiliza para analizar texto en objetos, centrándose en la lógica de análisis.
Lenguaje de expresión de primavera (SpEL)
ExpressionParser: analiza una expresión SpEL en forma de cadena, crea y devuelve una instancia de expresión.
Expresión: la función de evaluar cadenas de expresión, admitir operaciones como la conversión de tipos y obtener cadenas originales.
EvaluaciónContext: gestiona la información de contexto de las expresiones SpEL.
PropertyAccessor: se utiliza para leer y escribir propiedades de objetos y se puede utilizar para implementar una lógica de acceso a propiedades personalizada.
ConstructorResolver: analiza el constructor para determinar cómo se crea una instancia del bean.
MethodResolver: resuelve métodos de clase para garantizar llamadas correctas, manejar la sobrecarga y la coincidencia de parámetros.
BeanResolver: analiza la definición del bean, incluidas las dependencias, la configuración de propiedades, la creación de instancias y el retorno.
TypeLocator: busca clases dinámicamente y devuelve objetos de clase, utilizados en análisis de expresiones, conversión de tipos, etc.
TypeConverter: función de conversión de tipos que convierte datos en una expresión de un tipo a otro.
TypeComparator: función de comparación de tipos, que define un método para comparar si dos objetos son iguales.
OperadorOverloader: función de sobrecarga de operadores, un método para personalizar operadores en expresiones.
Definición y registro de frijol.
BeanDefinition: describe Bean en detalle y admite funciones principales como la inyección de dependencia, AOP y control de alcance.
BeanDefinitionHolder: la clase clave para administrar y operar BeanDefinition.
BeanDefinitionRegistry: interfaz clave de gestión de registro de definición de Bean, que procesa metadatos de Bean.
Lectura y escaneo de definiciones de beans
XmlBeanDefinitionReader: carga y analiza la configuración XML, crea un contenedor IOC y registra la definición de Bean.
PropertiesBeanDefinitionReader: el archivo de propiedades se carga y analiza en la definición de Bean.
GroovyBeanDefinitionReader: los scripts de Groovy se analizan en definiciones de Bean.
AnnotatedBeanDefinitionReader: configuración de anotaciones, escanea y registra automáticamente los componentes Spring y simplifica la configuración de definición de Bean.
ClassPathBeanDefinitionScanner: el escaneo de rutas de clases registra Spring Beans y admite el ensamblaje automático.
fábrica de frijoles
BeanFactory: la interfaz principal de Spring, que proporciona funciones básicas para la configuración, creación y administración de Bean.
ListableBeanFactory: admite la obtención de una colección de beans por tipo.
HierarchicalBeanFactory: admite la relación de contenedor padre-hijo e implementa la estructura jerárquica de la definición de Bean.
ConfigurableBeanFactory: proporciona extensiones a la configuración de BeanFactory, como editor de propiedades, alcance, etc.
AutowireCapableBeanFactory: interfaz funcional principal para la creación, inicialización, inyección y destrucción de Bean.
ConfigurableListableBeanFactory: interfaz de fábrica de Bean configurable que admite operaciones de configuración y lista.
contexto del contenedor
ClassPathXmlApplicationContext: el contexto en el que el classpath carga el archivo de configuración XML.
AnnotationConfigApplicationContext: el contexto para cargar información de configuración en la clase de configuración de anotación.
GenericApplicationContext: admite múltiples métodos de configuración, XML, anotaciones y contextos registrados manualmente.
Importación y combinación de definiciones de beans
ImportBeanDefinitionRegistrar: registra beans dinámicamente en tiempo de ejecución para lograr una configuración flexible y expandir las funciones de la clase de configuración.
ImportSelector: importe dinámicamente clases de configuración en tiempo de ejecución para lograr una selección condicional y una configuración flexible.
DeferredImportSelector: importa dinámicamente la configuración en tiempo de ejecución, admite selección condicional y carga retrasada por grupo.
ciclo de vida del frijol
Proceso de registro de definiciones de Bean: cargar y analizar archivos de configuración, registrar y analizar definiciones de Bean, nombres de clases, ámbitos, atributos, etc.
Proceso de inicialización de beans: creación de instancias, inyección de propiedades, devolución de llamada consciente, posprocesador, llamada al método de inicialización.
El proceso de resolución de dependencias de Bean: declara dependencias, encuentra dependencias, inyecta dependencias, maneja dependencias circulares y retrasa la resolución de dependencias.
Proceso de destrucción de beans: llamada al método de destrucción, devolución de llamada de interfaz, limpieza posterior al procesamiento, activación de notificaciones, reciclaje de recursos de GC.
Análisis de propiedades y configuración del entorno.
PropertySource: una clase abstracta que gestiona varias fuentes de configuración y admite la carga y el acceso flexibles a las configuraciones de la aplicación.
PropertySources: se utiliza para administrar y acceder de manera uniforme a múltiples instancias de PropertySource, simplificando el procesamiento de los datos de configuración.
PropertyResolver: análisis de propiedades universales, obtención de valores de configuración, manejo de propiedades faltantes, simple y flexible.
ConfigurablePropertyResolver: configuración de análisis de propiedades y configuración de marcador de posición para adaptarse a diferentes necesidades de configuración.
Entorno: representación del entorno de la aplicación, que proporciona acceso a atributos, admite archivos de configuración y realiza una configuración dinámica.
ConfigurableEnvironment: configure dinámicamente el entorno de la aplicación, active la configuración predeterminada y mejore la flexibilidad de la aplicación.
Puntos de inicialización y extensión de beans
InicializandoBean: proporciona una interfaz para ejecutar lógica personalizada durante la inicialización del Bean.
DesechableBean: define la interfaz para realizar operaciones de limpieza antes de que se destruya el Bean.
BeanDefinitionRegistryPostProcessor: modifica o agrega dinámicamente BeanDefinition cuando se inicia el contenedor.
BeanFactoryPostProcessor: modifique o configure globalmente BeanFactory antes de crear una instancia del Bean.
BeanPostProcessor: realiza un procesamiento personalizado antes y después de la inicialización del Bean, que puede afectar a todos los Beans.
InstantiationAwareBeanPostProcessor: proporciona un control más profundo de creación de instancias y de inyección de propiedades.
DestructionAwareBeanPostProcessor: permite operaciones de limpieza adicionales antes de que se destruya el Bean.
MergedBeanDefinitionPostProcessor: procesa BeanDefinition al fusionar definiciones de Bean.
SmartInstantiationAwareBeanPostProcessor: proporciona un control de creación de instancias más inteligente.
SmartInitializingSingleton: ejecuta la lógica personalizada después de que se inicializan todos los beans singleton.
Serie de interfaz consciente
BeanNameAware: permite que el Bean obtenga su propio nombre en el contenedor.
BeanClassLoaderAware: Permite que un bean obtenga su cargador de clases.
BeanFactoryAware: Proporciona Bean para obtener el BeanFactory al que pertenece.
EnvironmentAware: permite que los beans obtengan la configuración del entorno de la aplicación.
EmbeddedValueResolverAware: permite que los beans resuelvan marcadores de posición de valores incrustados.
ResourceLoaderAware: permite que los beans obtengan cargadores de recursos.
ApplicationEventPublisherAware: permite que el bean publique eventos de la aplicación.
MessageSourceAware: permite al Bean obtener la fuente del mensaje.
ApplicationContextAware: permite que los beans obtengan el contexto de la aplicación.
ImportAware: Permite que una clase de configuración importada obtenga información sobre la clase que la importó.
Anotaciones principales
@Configuration: declara la clase como una clase de configuración y define las dependencias entre beans y beans.
@ComponentScan: permite el escaneo de componentes para descubrir y registrar automáticamente clases marcadas como componentes.
@Bean: declara un método en la clase de configuración y devuelve una instancia de Bean.
@Import: introduce otras clases de configuración y fusiona sus definiciones de Bean en el contenedor actual.
@PropertySource: especifique el archivo de propiedades y cargue la configuración externa en el entorno.
@DependsOn: especifique el orden de dependencia de los beans para garantizar que los beans específicos se inicialicen antes que otros.
@Conditional: determine si se debe crear un bean según las condiciones.
@Lazy: especifica la inicialización diferida del bean, que solo se crea cuando se usa por primera vez.
@Value: inyecta un valor o expresión simple en un campo o parámetro de método de Bean.
@Autowired: ensambla automáticamente las dependencias de Bean.
@Primary: especifica el bean preferido que se seleccionará primero entre varios beans candidatos.
@Descripción: proporciona información descriptiva del Bean.
@Role: proporciona sugerencias de funciones para los beans para distinguir beans de tipos similares.
@Indexed: marca el bean para indexarlo.
@Order: especifica el orden de carga de los beans.
especificación JSR
@Inject: anotación de inyección de dependencia estándar JSR-330.
@Named: anotación de nomenclatura estándar JSR-330.
@Resource: anotación de inyección de recursos estándar Java EE.
@Qualifier: utilizado para calificar frijoles inyectados.
@Scope: especifica el alcance del Bean.
@Singleton: especifique el Bean como singleton.
@PostConstruct: especifica el método de inicialización.
@PreDestroy: especifica el método de destrucción.
Proveedor: una interfaz común de fábrica de Bean proporcionada por la biblioteca estándar de Java.
AOP de primavera
Proxy dinámico JDK: implementación de interfaz, generación dinámica de clases de proxy, llamadas a métodos de procesamiento y preocupaciones transversales unificadas.
Proxy dinámico cglib: una biblioteca basada en la generación de código de bytes, no requiere interfaz y puede interceptar métodos de clase y mejorarlos.
ClassFilter: determina si la clase coincide con la condición de interceptación.
MethodMatcher: determina si el método coincide con la condición de interceptación.
Pointcut: define el punto de entrada y hace coincidir el método interceptado.
Consejo: La interfaz principal de AOP que define varios comportamientos de tipos de notificaciones.
MethodInterceptor: intercepta la ejecución del método, lo que permite agregar lógica adicional antes y después.
MethodBeforeAdvice: permite insertar lógica personalizada antes de las llamadas a métodos.
AfterReturningAdvice: permite insertar lógica personalizada después de una llamada a un método. <
ThrowsAdvice: notificación de excepciones, captura excepciones lanzadas por métodos y realiza lógica adicional.
IntroducciónInterceptor: introduce dinámicamente nuevas funciones o propiedades en el objeto de destino.
Asesor: se utiliza para combinar notificaciones y puntos de referencia para realizar inquietudes transversales en la programación de aspectos.
Aconsejado: Configurar las notificaciones, notificadores, objetivos, etc. del agente AOP.
ProxyFactory: una forma conveniente de crear objetos proxy.
AopProxyFactory: cree una fábrica de proxy AOP que admita JDK y CGLIB.
AopProxy: crea y administra objetos proxy AOP.
AdvisorChainFactory: Interfaz de fábrica para crear una cadena de Advisor.
AdvisorAdapterRegistry: adapte varios consejos a interceptores AOP, registre y administre adaptadores de Advisor.
AdvisorAdapter: adapta diferentes tipos de notificaciones a cadenas de interceptores.
ProxyMethodInvocation: proxy de invocación de métodos AOP, maneja cadenas de interceptores e invocaciones de métodos.
@EnableAspectJAutoProxy: habilita el proxy automático del aspecto AspectJ.
AnnotationAwareAspectJAutoProxyCreator: crea un proxy AOP para aplicar aspectos de estilo AspectJ.
BeanFactoryAdvisorRetrievalHelper: ayuda a recuperar y administrar Advisor Beans en Spring AOP.
BeanFactoryAspectJAdvisorsBuilder: cree aspectos de anotación @AspectJ y genere Spring AOP Advisors.
AspectInstanceFactory: crea instancias de aspectos y admite múltiples métodos de implementación.
MetadataAwareAspectInstanceFactory: gestiona instancias de aspectos y metadatos, y admite múltiples estrategias de creación de instancias.
AspectJAdvisorFactory: crea una instancia de notificador de AspectJ y gestiona la creación y configuración de notificaciones de aspectos.
TargetSource: gestiona la adquisición y liberación de objetos proxy AOP.
TargetSourceCreator: crea fuentes de destino especiales y personaliza la creación y gestión de objetos proxy.
AopContext: Herramienta para obtener objetos proxy Spring AOP.
ExposeInvocationInterceptor: un interceptor que expone el contexto de invocación del método Spring AOP.
@EnableLoadTimeWeaving: habilita el tejido en tiempo de carga de Spring.
transacción de primavera
Conexión: gestiona conexiones de bases de datos, ejecuta SQL y procesa transacciones.
DataSource: proporciona una interfaz para la gestión eficiente de las conexiones de bases de datos.
DriverManager: la clase principal para administrar y establecer conexiones de bases de datos.
JdbcTemplate: simplifica las operaciones de JDBC y proporciona una cómoda abstracción de acceso a la base de datos.
TransactionDefinition: define el comportamiento de propagación de la transacción y el nivel de aislamiento.
TransactionAttributeSource: Interfaz de estrategia para obtener atributos de transacción.
PlatformTransactionManager: se utiliza para gestionar y coordinar el ciclo de vida y la ejecución de transacciones.
TransactionTemplate: simplifica la gestión de transacciones y admite el control programático de transacciones y el manejo de excepciones.
SpringTransactionAnnotationParser: analiza la anotación @Transactional y la convierte en una configuración de transacción.
TransactionInterceptor: interceptor de transacciones, utilizado para gestionar el procesamiento de transacciones a nivel de método.
EnableTransactionManagement: habilite la gestión de transacciones basada en anotaciones de Spring.
primaveraMVC
PrimaveraOpenFeign
contactame
✉️ Correo electrónico | Problema | CSDN ¡Yo sobre todo!
⛵ ¡Se aceptan contribuciones!
Si encuentra algún error o tiene sugerencias para mejorar, envíe un problema o una solicitud de extracción. ¡Tus comentarios son muy valiosos para mí!
Actualización continua
Para brindarle el contenido más reciente y valioso, insistiré en actualizar este almacén todos los días⏳. Todos los días, puede esperar ver contenido nuevo o mejoras al contenido existente. Si tiene alguna sugerencia o comentario, no dude en ponerse en contacto conmigo. Valoro cada comentario porque es mi motivación para la mejora continua.
Historia de las estrellas
?Observadores de estrellas
?horquillas
?Invitarme a un box lunch?
El autor tiene que escribir un blog por la noche✍️ y también necesita trabajar entre semana. Si puedes ayudarme, ¿puedes darme un almuerzo?
Sigue la cuenta pública
Después de seguir, responda con la palabra clave "agregar grupo" para unirse a nuestro grupo de intercambio técnico para comunicarse y aprender con más desarrolladores.