Directorio de artículos
BeanDefinition
Es Spring
un concepto muy importante en el mundo. Contiene toda la información necesaria Spring
para la creación y configuración de contenedores . Bean
Comprender el funcionamiento interno BeanDefinition
puede ayudarnos a desarrollar un dominio más profundo .Spring
1. Explora BeanDefinition
Primero, tengamos BeanDefinition
una comprensión general de.
1.1 Interpretación de BeanDefinition en documentos oficiales
La documentación oficial es un recurso muy importante para comprender Spring
los conceptos y componentes del marco . Spring
Acerca de BeanDefinition
, el documento oficial es el siguiente:
BeanDefinition
Contiene una gran cantidad de información de configuración que puede guiar Spring
la creación Bean
, incluidos Bean
parámetros del constructor, valores de atributos, métodos de inicialización, nombres de métodos de fábrica estáticos, etc. Además, el hijo BeanDefinition
puede BeanDefinition
heredar información de configuración del padre y también puede sobrescribir o agregar nueva información de configuración. Este patrón de diseño reduce efectivamente la información de configuración redundante y hace que la configuración sea más concisa.
A continuación, comprendamos mejor a través de un ejemplo concreto BeanDefinition
.
Considere una Java
clase simple Person
:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
}
Podemos definir un tipo usando XML
configuración o configuración , y la información de configuración se encapsulará en .Java
Person
Bean
Bean
BeanDefinition
En XML
una configuración, una Person Bean
podría definirse de la siguiente manera:
<bean id="person" class="com.example.Person">
<constructor-arg name="name" value="John"/>
<constructor-arg name="age" value="25"/>
</bean>
Aquí, BeanDefinition
la información incluye class
los nombres y valores de las propiedades (nombres de clase completamente calificados) y los parámetros del constructor.
En Java
la configuración podemos definir uno como este Person Bean
:
@Configuration
public class AppConfig {
@Bean
public Person person() {
return new Person("John", 25);
}
}
En este ejemplo, BeanDefinition
la información incluye class
propiedades (nombres de clase completos) y parámetros del constructor. Podemos obtener este nombre de clase completo a través del método BeanDefinition
.getBeanClassName()
1.2 Análisis de métodos clave de BeanDefinition
BeanDefinition
Toda la metainformación definida por la interfaz Bean
incluye principalmente los siguientes métodos:
- get/setBeanClassName() - obtiene/establece
Bean
el nombre de la clase - get/setScope() - obtiene/establece
Bean
el alcance - isSingleton() / isPrototype() - Determina si es un alcance singleton/prototipo
- get/setInitMethodName() - Obtiene/establece el nombre del método de inicialización
- get/setDestroyMethodName() - Obtiene/establece el nombre del método de destrucción
- get/setLazyInit() - Obtener/establecer si retrasar la inicialización
- get/setDependsOn() - Obtener/establecer dependencias
Bean
- get/setPropertyValues() - Obtener/establecer valores de propiedad
- get/setAutowireCandidate() - Obtiene/establece si se puede cablear el autowire
- get/setPrimary() - Obtiene/establece si se prefiere el cableado automático
Bean
Debido a BeanDefinition
la longitud del código fuente, no todo está publicado aquí, puedes comprobarlo tú mismo. BeanDefinition
También implementa AttributeAccessor
una interfaz a través de la cual se pueden agregar metadatos personalizados. Se utilizarán ejemplos AttributeAccessor
en las siguientes secciones.
Como se puede ver en lo anterior, BeanDefinition
es el objeto de metadatos Spring
utilizado para describir en el marco . Estos metadatos contienen información básica, incluidos los siguientes aspectos:Bean
Bean
-
Información de clase de Bean : este es
Bean
el nombre de clase completo, es decir,Bean
el tipo específico después de la creación de instancias. -
Información de atributos del bean : incluido
Bean
el alcance de (si es un singleton o un prototipo), si es principalBean
(primary
), información de descripción, etc. -
Características de comportamiento de Bean : por ejemplo,
Bean
si admite carga diferida, si puede ser candidato para cableado automático yBean
sus métodos de inicialización y destrucción, etc. -
La relación entre Bean y otros Beans : por ejemplo,
Bean
de qué más dependeBean
yBean
si tiene un padreBean
. -
Información de configuración del Bean : esto incluye
Bean
los parámetros del constructor, los valores de las propiedades, etc.
1.3 Aplicación práctica de algunos métodos de BeanDefinition
A continuación, se utiliza un ejemplo de código detallado para ilustrar BeanDefinition
el uso de cada método en la interfaz, y el significado real de estos métodos se explica con ejemplos de código reales. A continuación, proporcionaré BeanDefinition
ejemplos de código para algunos aspectos importantes.
El código completo es el siguiente:
Primero, aquí está nuestra Java
clase de configuración y Person
la definición de clase:
package com.example.demo.configuration;
import com.example.demo.bean.Person;
import org.springframework.context.annotation.*;
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "cleanup")
@Scope("singleton")
@Lazy
@Primary
@Description("A bean for person")
public Person person() {
return new Person("John", 25);
}
}
package com.example.demo.bean;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
public void init() {
System.out.println("Initializing Person bean");
}
public void cleanup() {
System.out.println("Cleaning up Person bean");
}
}
A continuación se explica cómo BeanDefinition
obtener cada atributo:
package com.example.demo;
import com.example.demo.configuration.AppConfig;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
String personBeanName = "person";
BeanDefinition personBeanDefinition = context.getBeanFactory().getBeanDefinition(personBeanName);
// 获取Bean的类信息
System.out.println("Bean Class Name: " + context.getBean(personBeanName).getClass().getName());
// 获取Bean的属性
System.out.println("Scope: " + personBeanDefinition.getScope());
System.out.println("Is primary: " + personBeanDefinition.isPrimary());
System.out.println("Description: " + personBeanDefinition.getDescription());
// 获取Bean的行为特征
System.out.println("Is lazy init: " + personBeanDefinition.isLazyInit());
System.out.println("Init method: " + personBeanDefinition.getInitMethodName());
System.out.println("Destroy method: " + personBeanDefinition.getDestroyMethodName());
// 获取Bean的关系
System.out.println("Parent bean name: " + personBeanDefinition.getParentName());
System.out.println("Depends on: " + Arrays.toString(personBeanDefinition.getDependsOn()));
// 获取Bean的配置属性
System.out.println("Constructor argument values: " + personBeanDefinition.getConstructorArgumentValues());
System.out.println("Property values: " + personBeanDefinition.getPropertyValues());
}
}
resultado de la operación:
Este ejemplo contiene BeanDefinition
la mayoría de los métodos y muestra lo que hacen. Tenga en cuenta que en este ejemplo, los resultados devueltos de algunos métodos como getDependsOn()
,,, pueden no mostrar ninguna sustancia, porque no configuramos estos valores . Si estos valores se establecen en la aplicación real, estos métodos devolverán los resultados correspondientes.getParentName()
getConstructorArgumentValues()
getPropertyValues()
person Bean
1.4 Clasificación profunda de la estructura de información de BeanDefinition
En Spring
, BeanDefinition
se incluye la siguiente información principal:
-
Clase : este es el nombre de clase completo.
Spring
Utilice esta información para crearBean
instancias mediante reflexión. Por ejemplo,com.example.demo.bean.Book
cuandoSpring
necesita crearBook bean
una instancia de, crearáBook
una instancia de la clase mediante la reflexión basada en este nombre de clase. -
Nombre : Este es
Bean
el nombre de. En las aplicaciones, normalmente usamos este nombre para obtenerBean
instancias de . Por ejemplo, podríamos tener un nombre"bookService"
yBean
podemoscontext.getBean("bookService")
obtenerBean
una instancia de este a través de . -
Alcance : Esto define
Bean
el alcance de, por ejemplo,singleton
oprototype
. En casoscope
afirmativosingleton
,Spring
el contenedor creará solo unaBean
instancia y devolverá esta instancia en cada solicitud. En casoscope
afirmativoprototype
, el contenedor creará una nueva instancia cadaBean
vez que se solicite .Spring
Bean
-
Argumentos del constructor : Estos son
Bean
los argumentos del constructor utilizados para crear instancias. Por ejemplo, si tenemos unaBook
clase cuyo constructor requiere unString
parámetro de tipotitle
, entonces podemosBeanDefinition
configurarloconstructor arguments
para proporcionar este parámetro. -
Propiedades : estos son
Bean
los valores de propiedad que deben inyectarse. Por ejemplo, podríamos tener unaBook
clase que tenga unatitle
propiedad que podamosBeanDefinition
configurarproperties
para proporcionar el valor de esta propiedad. Estos valores también se pueden inyectar en clases o archivos de configuración mediante<property>
etiquetas o anotaciones.@Value
-
Modo de cableado automático : este es el modo de cableado automático. Si se establece en
byType
,Spring
el contenedor conectará automáticamenteBean
la propiedad, que buscará un tipo de propiedad coincidente en el contenedorBean
y lo inyectará. Si se establece enbyName
, el contenedor buscará un contenedor con un nombre que coincida con el nombre de la propiedadBean
y lo inyectará. También hay una opciónconstructor
que se refiere aBean
borrar automáticamente las dependencias a través de los tipos de parámetros del constructor. -
Inicialización diferida : si se establece en
true
,Bean
se creará en la primera solicitud en lugar de cuando se inicie la aplicación. Esto puede hacer que su aplicación se inicie más rápido, pero puedeBean
introducir cierta latencia en la primera solicitud. -
Método de inicialización y método de destrucción : estos son
Bean
los métodos de inicialización y destrucción de . Por ejemplo, podemos tener unaBookService
clase que tiene uninit
método de inicialización nombrado y uncleanup
método de destrucción nombrado. PodemosBeanDefinition
configurar estos dos métodos en, luego el contenedor llamará al método después deSpring
la creación y al método antes de la destrucción .Bean
init
Bean
cleanup
-
Beans de dependencia : Estas son
Bean
las dependencias de . Por ejemplo , podríamos tener aBookService Bean
, que depende de aBookRepository Bean
, luego podemos configurarloBookService
, luego el contenedor se creará primero antes de crear .BeanDefinition
dependency beans
"bookRepository"
BookService Bean
Spring
BookRepository Bean
Lo anterior es BeanDefinition
la información principal contenida en , que le indicará Spring
cómo se crea y configura el contenedor Bean
. Diferentes BeanDefinition
implementaciones pueden tener más información de configuración. Por ejemplo, RootBeanDefinition
, ChildBeanDefinition
etc. GenericBeanDefinition
son BeanDefinition
clases de implementación concretas de la interfaz y pueden contener más opciones de configuración.
2. Análisis del sistema constructivo BeanDefinition
Primero aclaremos BeanDefinition
los roles. BeanDefinition
Es Spring
el componente central de .Define la bean
información de configuración, incluido el nombre de la clase, el alcance, los parámetros del constructor, los valores de los atributos, etc. Echemos un vistazo a BeanDefinition
cómo Spring
se ve el diseño.
A través de esto IDEA
podemos obtener el siguiente diagrama de relación de herencia:
Si bien hay muchas interfaces, clases abstractas y extensiones, solo debemos centrarnos en las claves.
2.1 Tipos de BeanDefinition y sus aplicaciones
En Spring
, los objetos guardan la bean
información de configuración BeanDefinition
. Según las bean
diferentes fuentes y métodos de configuración, BeanDefinition
se divide en muchos tipos, seleccionaremos algunos de ellos para explicarlos.
- RootBeanDefinition : Cuando
XML
definimos uno en el archivo de configuraciónbean
, se creará un objetoSpring
para este objeto. Este objeto contiene toda la información utilizada para la creación, como nombre de clase, valores de atributos, etc. Por ejemplo:bean
RootBeanDefinition
bean
bean
<bean id="exampleBean" class="com.example.ExampleBean">
<property name="stringProperty" value="stringValue"/>
</bean>
Esta XML
configuración define un nombre "exampleBean"
, bean
su clase es "com.example.ExampleBean"
y hay un "stringProperty"
valor de atributo llamado es "stringValue"
. Cuando Spring
se lee esta configuración, se crea un objeto RootBeanDefinition
para guardar toda la información de configuración de este bean.
Resumen: cuando XML
define uno en un archivo bean
, Spring
se creará una instancia RootBeanDefinition
y esta instancia guardará toda la información de configuración, como el nombre de la clase, los valores de los atributos, etc.
- ChildBeanDefinition : Puede usarse cuando necesitamos que uno
bean
herede la configuración de otro . Por ejemplo:bean
ChildBeanDefinition
<bean id="parentBean" class="com.example.ParentBean">
<property name="stringProperty" value="stringValue"/>
</bean>
<bean id="childBean" parent="parentBean">
<property name="anotherStringProperty" value="anotherStringValue"/>
</bean>
En esta XML
configuración, todas las configuraciones "childBean"
se heredan "parentBean"
y se agrega un nuevo atributo "anotherStringProperty"
. Cuando Spring
se lee esta configuración, primero se creará un objeto "parentBean"
y RootBeanDefinition
luego se creará "childBean"
un objeto al que este objeto hará referencia .ChildBeanDefinition
"parentBean"
BeanDefinition
Resumen: si tiene uno bean
y desea crear uno nuevo bean
, que bean
debe heredar bean
toda la configuración original, pero también necesita agregar o modificar alguna información de configuración, Spring
se creará una ChildBeanDefinition
instancia .
- GenericBeanDefinition : Este es genérico
BeanDefinition
y se puede convertir aRootBeanDefinition
o según sea necesarioChildBeanDefinition
. Por ejemplo, el uso de anotaciones en una clase de configuración@Bean
define unbean
:
@Configuration
public class AppConfig {
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
}
En este código, definimos una clase "myComponent"
llamada . Cuando se analiza esta clase de configuración, se crea un objeto para el método. Este objeto contendrá el nombre del método (que también es su nombre), su tipo de retorno y cualquier parámetro o propiedad del constructor requerido. En este ejemplo, no hemos definido ningún parámetro o propiedad, por lo que el objeto solo contiene información básica. Luego, el contenedor puede utilizar este objeto para las instancias generadas .bean
"MyComponent"
Spring
myComponent()
GenericBeanDefinition
GenericBeanDefinition
bean
GenericBeanDefinition
GenericBeanDefinition
Spring
bean
Resumen: cuando define uno usando anotaciones Java
en una clase de configuración , se crea una instancia .@Bean
bean
Spring
GenericBeanDefinition
- AnnotatedBeanDefinition
@Component
: cuando usamos anotaciones (como ,, etc.) para definir en el código , se creará una@Service
instancia de la interfaz . Por ejemplo:@Repository
bean
Spring
AnnotatedBeanDefinition
@Component("myComponent")
public class MyComponent {
// some fields and methods
}
En este código, definimos una clase "myComponent"
llamada bean
, su clase es "MyComponent"
y hay una anotación en esta clase @Component
. Cuando Spring
se analiza esta clase, se crea un objeto AnnotatedBeanDefinition
. Este AnnotatedBeanDefinition
objeto guardará el nombre de la clase (que también es bean
el nombre), el tipo de clase y toda la información de anotaciones de la clase. En este ejemplo, AnnotatedBeanDefinition
la instancia contendrá @Component
la anotación y todos sus metadatos. AnnotatedBeanDefinition
Luego, el contenedor puede utilizar esta instancia Spring
para generar bean
instancias, y la información de anotaciones Spring
almacenada en ella también se puede utilizar AnnotatedBeanDefinition
para procesamiento posterior, como AOP
proxy, gestión de transacciones, etc.
@Component
Resumen: cuando utiliza anotaciones (como ,,, etc.) en una clase para @Service
definir una , se creará una instancia que implementa la interfaz, como o . Esta instancia guardará el nombre de la clase, el tipo de clase y toda la información de anotaciones de la clase.@Repository
bean
Spring
AnnotatedBeanDefinition
AnnotatedGenericBeanDefinition
ScannedGenericBeanDefinition
GenericBeanDefinition
AnnotatedBeanDefinition
La principal diferencia entre y es que AnnotatedBeanDefinition
la información de anotaciones en la clase se guarda, mientras que GenericBeanDefinition
no. Esto permite que Spring
estas anotaciones se lean y procesen en tiempo de ejecución, lo que proporciona una funcionalidad más completa.
En la mayoría de los casos, no es necesario que nos importe Spring
cuál bean
se crea BeanDefinition
. Spring
Estos se gestionan BeanDefinition
, crean y configuran automáticamente en función de su tipo y de la información que contienen bean
.
2.2 Análisis de los principios de generación de BeanDefinition
Este BeanDefinition
objeto es leído y generado Spring
por varias clases de implementación durante el proceso de inicio .BeanDefinitionReader
Spring
Hay tres formas principales de crearlo en BeanDefinition
:
- Método de configuración XML :
Primero, XML
definimos uno en el archivo bean
:
<bean id="bookService" class="com.example.demo.service.BookService">
<property name="bookRepository" ref="bookRepository"/>
</bean>
<bean id="bookRepository" class="com.example.demo.repository.BookRepository"/>
En este caso, cuando Spring
se inicie, XmlBeanDefinitionReader
se leerá el archivo XML
, se analizarán los elementos que contiene y se creará un objeto <bean>
para cada elemento .<bean>
BeanDefinition
Una descripción simple es: XmlBeanDefinitionReader
leer XML
el archivo, analizar <bean>
los elementos y generarlos BeanDefinition
.
- Método de configuración de anotaciones :
Usamos anotaciones como @Component
, @Service
etc. @Repository
para definir la clase bean
, por ejemplo:
@Repository
public class BookRepository {
// ... repository methods
}
@Service
public class BookService {
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
// ... service methods
}
En este caso, cuando Spring
se inicie, ClassPathBeanDefinitionScanner
se escaneará la ruta del paquete especificado para encontrar todas las clases con anotaciones específicas y BeanDefinition
se crearán objetos para estas clases. Lo que se genera de esta forma BeanDefinition
suele ser ScannedGenericBeanDefinition
de tipo.
La descripción simple es: escanee ClassPathBeanDefinitionScanner
las clases anotadas en la ruta del paquete especificada y generelas BeanDefinition
.
- Método de configuración de Java :
Usamos anotaciones @Configuration
y @Bean
para definir clases de configuración y bean
, por ejemplo:
@Configuration
public class AppConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService(BookRepository bookRepository) {
return new BookService(bookRepository);
}
}
En este caso, al Spring
iniciar, ConfigurationClassPostProcessor
estas clases de configuración se procesarán y se entregarán ConfigurationClassParser
para su análisis. Para cada @Bean
método marcado con en la clase de configuración, BeanDefinition
se creará un objeto. Lo que se genera de esta forma BeanDefinition
suele ser ConfigurationClassBeanDefinition
de tipo.
La descripción simple es: procesar ConfigurationClassPostProcessor
la clase marcada , analizar los métodos y @Configuration
generarlos .@Bean
BeanDefinition
En general, no importa si elegimos XML
configuración, configuración de anotaciones o Java
método de configuración, Spring
estas configuraciones se analizarán al inicio y BeanDefinition
se generarán los objetos correspondientes para guiar Spring
al contenedor sobre cómo crear y administrar Bean
instancias.
Estos contenidos pueden ser abstractos y complejos, pero para principiantes, solo necesita comprender: BeanDefinition
es un objeto Spring
utilizado para almacenar Bean
información de configuración. Se genera Spring
leyendo la configuración durante el proceso de inicio BeanDefinitionReader
. El método de generación específico depende de la configuración utilizada. método ( XML
, anotación o Java
configuración), en cuanto al principio de implementación específico, aprenderemos más sobre él más adelante.
2.3 AttributeAccessor en la práctica: una poderosa herramienta para la manipulación de atributos
AttributeAccessor
es Spring
una interfaz importante en el marco que proporciona una forma flexible de adjuntar metadatos adicionales a los Spring
componentes principales. Spring
Muchas clases importantes incluidas en BeanDefinition
Componentes implementan AttributeAccessor
interfaces para que se puedan agregar y obtener propiedades adicionales de estos componentes dinámicamente. Un beneficio significativo de esto es que los desarrolladores pueden administrar de manera flexible información adicional para estos componentes sin cambiar la definición de clase original.
Echemos un vistazo a un ejemplo: el código completo es el siguiente:
Book
Crea un objeto primero
class Book {
private String title;
private String author;
public Book() {
}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// getter 和 setter 省略...
}
Programa principal:
package com.example.demo;
import com.example.demo.bean.Book;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
public class DemoApplication {
public static void main(String[] args) {
// 创建一个BeanDefinition, BeanDefinition是AttributeAccessor的子接口
BeanDefinition bd = new RootBeanDefinition(Book.class);
// 设置属性
bd.setAttribute("bookAttr", "a value");
// 检查和获取属性
if(bd.hasAttribute("bookAttr")) {
System.out.println("bookAttr: " + bd.getAttribute("bookAttr"));
// 移除属性
bd.removeAttribute("bookAttr");
System.out.println("bookAttr: " + bd.getAttribute("bookAttr"));
}
}
}
En este ejemplo, creamos una RootBeanDefinition
instancia para describir cómo crear una Book
instancia de una clase. RootBeanDefinition
Sí BeanDefinition
, BeanDefinition
implementa AttributeAccessor
la interfaz, por lo RootBeanDefinition
que hereda AttributeAccessor
el método.
Algunas personas pueden preguntarse: Libro no tiene la variable miembro bookAttr. ¿Cómo se le asigna un valor?
En Spring
el marco, AttributeAccessor
las interfaces definen métodos para adjuntar, obtener y eliminar RootBeanDefinition
metadatos asociados con un objeto (por ejemplo), en lugar de manipular Book
campos en el objeto (por ejemplo) en sí.
Entonces, cuando RootBeanDefinition
llamas setAttribute("bookAttr", "a value")
a un método en una instancia, en realidad no estás Book
configurando un bookAttr
campo nombrado en la instancia. En su lugar, RootBeanDefinition
se adjuntan metadatos a la instancia, siendo la clave "bookAttr"
y el valor "a value"
.
En usos posteriores getAttribute("bookAttr")
del método, devolverá el valor de metadatos establecido previamente "a value"
en lugar de intentar acceder a los campos Book
de la clase bookAttr
( Book
que en realidad no tienen bookAttr
campos).
En pocas palabras, estos metadatos se adjuntan al RootBeanDefinition
objeto, no a la instancia RootBeanDefinition
descrita por el objeto Book
.
resultado de la operación:
Resumir:
BeanDefinition
AttributeAccessor
Es una clase importante que implementa la interfaz. BeanDefinition
El objeto es la estructura de datos Spring
utilizada por el marco para almacenar bean
información de configuración. Cuando usamos anotaciones como @Bean
, y para definir a en la clase de configuración , se creará un objeto para esto y los metadatos de estas @Scope
anotaciones se adjuntarán a este objeto.@Lazy
bean
Spring
bean
BeanDefinition
BeanDefinition
Cuando Spring
el contenedor necesite crear una instancia más adelante bean
, examinará este BeanDefinition
objeto y creará y administrará la instancia de acuerdo con los metadatos (como scope
inicialización lazy
, métodos de inicialización y destrucción, etc.) bean
. Estos metadatos no se adjuntan directamente a bean
la instancia, sino que se almacenan en BeanDefinition
objetos y Spring
el contenedor los gestiona y utiliza.
Entonces, cuando obtenemos e main
imprimimos sus propiedades en el método , en realidad estamos mirando las estructuras de datos internas utilizadas por el marco para administrar el , en lugar de mirar directamente el estado de la instancia en sí.ApplicationContext
BeanDefinition
Spring
bean
bean
El beneficio de este enfoque es que desacopla estos metadatos adicionales de bean
la propia instancia, lo que permite bean
la flexibilidad de cambiarlos sin modificar la clase y permite que los datos se compartan entre diferentes subprocesos en AttributeAccessor
el mismo proceso. JVM
Es por eso que podemos cambiar el alcance, ya sea carga diferida, etc., modificando el archivo de configuración o las anotaciones bean
sin modificar bean
la definición de clase.
3. Revisión y resumen de BeanDefinition
A medida que profundizamos en Spring
el marco, aprendemos BeanDefinition
sobre Spring
un concepto muy crítico. BeanDefinition
Su principal responsabilidad es servir como un objeto de datos que almacena información detallada sobre cómo crear, inicializar y configurar una Bean
instancia específica.
En particular, BeanDefinition
contiene la siguiente información principal:
- Nombre de clase completo para que el contenedor cree
Spring
instancias mediante reflexiónBean
. - El nombre y alias del bean , utilizado para hacer referencia y encontrarlo en la aplicación
Bean
. - El alcance de un bean , como singleton o prototipo, determina
Spring
cómoBean
se gestiona el ciclo de vida de la instancia. - Parámetros del constructor y valores de propiedad , utilizados para la creación de instancias
Bean
y la inyección de dependencias. - Modo de cableado automático , que indica
Spring
cómo inyectar dependencias automáticamente. - Los métodos de inicialización y destrucción le permiten saber cómo ejecutar lógica personalizada
Spring
en momentos específicos del ciclo de vida.Bean
- Dependencias de beans , que indican cuáles deben crearse antes de
Spring
crear el actual .Bean
Bean
No importa qué método de configuración usemos ( XML
, anotación o Java
configuración), Spring
estas configuraciones se analizarán al inicio y luego BeanDefinition
se generarán los objetos correspondientes. Estos BeanDefinition
objetos son como Spring
recetas dentro del contenedor, que le dicen Spring
al contenedor cómo crear y configurar cada objeto Bean
.
Bienvenido a la conexión triple con un clic ~
Si tiene alguna pregunta, deje un mensaje, discutamos y aprendamos juntos
----------------------Hablar es barato , muéstrame el código ----- ------------------