Explore a estrutura mais popular do Java, entenda seus mecanismos internos e leve você do iniciante ao proficiente.
⚡ Tecnologia | Introdução | Por que |
⚡Tecnologia
Introdução
Olá a todos, meu nome é Lex?. Sou um desenvolvedor back-end Java com 8 anos de experiência e um programador apaixonado pelo framework Spring❤️. Para ajudar os programadores que desejam aprender mais sobre o framework Spring, criei esta "Série de leitura de código-fonte do Spring". Através desta série, espero explorar o funcionamento interno do Spring com você. Se você tiver o mesmo interesse ou dúvidas, entre em contato comigo!
Por que fazer análise de código-fonte do Spring ?
Em meu trabalho como desenvolvedor trabalhando em frameworks, frequentemente encontro situações em que preciso compreender e ajustar profundamente o comportamento do framework. Essas tarefas não envolvem apenas o uso da API da estrutura, mas também exigem uma compreensão detalhada do funcionamento interno da estrutura. Embora existam versões simplificadas do Spring no Github, que são realmente muito úteis para começar, quando se trata de aplicativos de projetos reais, elas ainda são muito diferentes do framework Spring real. Portanto, comecei a estudar a fundo o código-fonte do Spring, na esperança de entender mais detalhadamente seu mecanismo de funcionamento interno para poder aplicá-lo melhor em meu trabalho real. Compartilhar minha análise de código-fonte também serve para fornecer alguma referência e ajuda aos desenvolvedores que desejam realmente entender o Spring, e não apenas usá-lo.
Apenas me dê uma estrela
Queridos amigos, realmente passei muito tempo pesquisando e organizando esta "Série de leitura de código-fonte do Spring". Se você acha que isso não é ruim ou que lhe trouxe uma ajudinha, clique na estrela. Isso realmente significa muito para mim, e cada estrela me faz sentir que todo o trabalho duro vale a pena. Eu sei que isso é uma coisa pequena, mas seu clique é o melhor incentivo para mim. De qualquer forma, obrigado por reservar um tempo para ler meu conteúdo, agradeço muito!
?Série de leitura de código-fonte Spring
Núcleo da Primavera
Carregamento e acesso a recursos
Recurso: interface abstrata, representando arquivos, caminhos de classe, etc., usada para acessar recursos de diferentes fontes.
ResourceLoader: A interface central para aquisição de recursos, que implementa a estratégia de carregamento uniforme de recursos de diferentes locais.
ResourcePatternResolver: Interface de resolução de padrões de recursos, usada para carregar de forma flexível vários recursos em aplicativos.
DocumentLoader: interface central de carregamento e análise de documentos XML, suportando configuração automática de aplicativos Spring em segundo plano.
Metadados e filtragem
MetadataReader: O núcleo da aquisição de metadados de classe, suportando funções avançadas como varredura de componentes, anotações condicionais e AOP.
AnnotationMetadata: Obtenha e opere dinamicamente informações de anotação de classe de tempo de execução.
TypeFilter: personalize a filtragem de classes durante a verificação de componentes, suportando condições complexas e filtragem precisa.
Condição: Julgamento condicional, um mecanismo flexível que determina a criação e configuração do Bean.
Validação, vinculação de dados e conversão de tipo
Validador: fornece lógica de validação de dados personalizada para garantir que os objetos do modelo atendam às regras de negócios.
PropertyEditor: personalize a lógica de conversão das propriedades JavaBean e lide com a conversão do tipo de propriedade.
Conversor: usado para conversão entre diferentes tipos, definindo regras simples de conversão de tipo de origem para destino.
ConverterFactory: Cria um conversor para um tipo de fonte específico para conversão de tipo.
GenericConverter: um conversor mais complexo que suporta múltiplas conversões de tipo de origem e destino.
ConditionalConverter: um conversor que escolhe se deseja realizar a conversão com base nas condições.
ConversionService: fornece uma interface de serviço de conversão de tipo unificada e gerencia conversores.
Impressora: Usada para formatar objetos em texto, com foco na saída formatada.
Analisador: usado para analisar texto em objetos, com foco na lógica de análise.
Linguagem de Expressão Spring (SpEL)
ExpressionParser: analisa uma expressão SpEL em formato de string, cria e retorna uma instância de Expression.
Expressão: A função de avaliar strings de expressão, suportando operações como conversão de tipo e obtenção de strings originais.
EvaluationContext: gerencia as informações de contexto das expressões SpEL.
PropertyAccessor: usado para ler e gravar propriedades de objetos e pode ser usado para implementar lógica de acesso a propriedades personalizadas.
ConstructorResolver: analisa o construtor para determinar como o bean é instanciado.
MethodResolver: Resolva métodos de classe para garantir chamadas corretas, lidar com sobrecarga e correspondência de parâmetros.
BeanResolver: analisa a definição do bean, incluindo dependências, configurações de propriedades, instanciação e retorno.
TypeLocator: procura classes dinamicamente e retorna objetos de classe, usados na análise de expressões, conversão de tipos, etc.
TypeConverter: função de conversão de tipo que converte dados em uma expressão de um tipo para outro.
TypeComparator: função de comparação de tipos, que define um método para comparar se dois objetos são iguais.
OperatorOverloader: Função de sobrecarga de operadores, um método para customizar operadores em expressões.
Definição e registro de beans
BeanDefinition: Descreva o Bean em detalhes e ofereça suporte a funções essenciais, como injeção de dependência, AOP e controle de escopo.
BeanDefinitionHolder: a classe chave para gerenciar e operar BeanDefinition.
BeanDefinitionRegistry: Interface de chave de gerenciamento de registro de definição de Bean, processando metadados de Bean.
Leitura e verificação de definição de bean
XmlBeanDefinitionReader: carrega e analisa a configuração XML, constrói o contêiner IOC e registra a definição do Bean.
PropertiesBeanDefinitionReader: o arquivo de propriedades é carregado e analisado na definição do Bean.
GroovyBeanDefinitionReader: scripts Groovy são analisados em definições de Bean.
AnnotatedBeanDefinitionReader: configuração de anotação, verifica e registra automaticamente componentes Spring e simplifica a configuração de definição de Bean.
ClassPathBeanDefinitionScanner: A varredura do caminho de classe registra Spring Beans, suportando montagem automática.
Fábrica de feijão
BeanFactory: interface central do Spring, fornecendo funções básicas para configuração, criação e gerenciamento de Bean.
ListableBeanFactory: Suporta a obtenção de uma coleção de beans por tipo.
HierarchicalBeanFactory: suporta relacionamento de contêiner pai-filho e implementa a estrutura hierárquica de definição de Bean.
ConfigurableBeanFactory: Fornece extensões para configuração do BeanFactory, como editor de propriedades, escopo, etc.
AutowireCapableBeanFactory: Interface funcional central para criação, inicialização, injeção e destruição de Bean.
ConfigurableListableBeanFactory: Interface de fábrica de Bean configurável que suporta operações de configuração e lista.
contexto do contêiner
ClassPathXmlApplicationContext: o contexto no qual o caminho de classe carrega o arquivo de configuração XML.
AnnotationConfigApplicationContext: o contexto para carregar informações de configuração na classe de configuração de anotação.
GenericApplicationContext: oferece suporte a vários métodos de configuração, XML, anotações e contextos registrados manualmente.
Importação e combinação de definição de bean
ImportBeanDefinitionRegistrar: registre beans dinamicamente em tempo de execução para obter configuração flexível e expandir funções de classe de configuração.
ImportSelector: importe dinamicamente classes de configuração em tempo de execução para obter seleção condicional e configuração flexível.
DeferredImportSelector: importa dinamicamente a configuração em tempo de execução, suportando seleção condicional e carregamento atrasado por grupo.
Ciclo de vida do feijão
Processo de registro de definição de Bean: carregamento e análise de arquivos de configuração, registro e análise de definições de Bean, nomes de classe, escopos, atributos, etc.
Processo de inicialização do bean: instanciação, injeção de propriedade, retorno de chamada Aware, pós-processador, chamada de método de inicialização.
Processo de resolução de dependências do Bean: declarar dependências, encontrar dependências, injetar dependências, lidar com dependências circulares e atrasar a resolução de dependências.
Processo de destruição de beans: chamada de método de destruição, retorno de chamada de interface, limpeza pós-processamento, acionamento de notificação, reciclagem de recursos de GC.
Análise de propriedade e configuração de ambiente
PropertySource: uma classe abstrata que gerencia várias fontes de configuração e suporta carregamento e acesso flexíveis de configurações de aplicativos.
PropertySources: usado para gerenciar e acessar uniformemente várias instâncias do PropertySource, simplificando o processamento de dados de configuração.
PropertyResolver: análise universal de propriedades, obtenção de valores de configuração, tratamento de propriedades ausentes, simples e flexível.
ConfigurablePropertyResolver: configuração de análise de propriedade e configurações de espaço reservado para se adaptar a diferentes necessidades de configuração.
Ambiente: Representação do ambiente de aplicativo, fornecendo acesso a atributos, suportando arquivos de configuração e realizando configuração dinâmica.
ConfigurableEnvironment: Configure dinamicamente o ambiente do aplicativo, ative e configure o padrão e melhore a flexibilidade do aplicativo.
Inicialização do Bean e pontos de extensão
InitializingBean: Fornece uma interface para executar lógica customizada durante a inicialização do Bean.
DescartávelBean: Define a interface para realizar operações de limpeza antes que o Bean seja destruído.
BeanDefinitionRegistryPostProcessor: modifique ou adicione BeanDefinition dinamicamente quando o contêiner for iniciado.
BeanFactoryPostProcessor: modifique ou configure globalmente o BeanFactory antes de instanciar o Bean.
BeanPostProcessor: Execute o processamento personalizado antes e depois da inicialização do Bean, o que pode afetar todos os Beans.
InstantiationAwareBeanPostProcessor: fornece instanciação mais profunda e controle de injeção de propriedade.
DestructionAwareBeanPostProcessor: Permite operações de limpeza adicionais antes que o Bean seja destruído.
MergedBeanDefinitionPostProcessor: Processa BeanDefinition ao mesclar definições de Bean.
SmartInstantiationAwareBeanPostProcessor: fornece controle de instanciação mais inteligente.
SmartInitializingSingleton: executa a lógica customizada depois que todos os beans singleton são inicializados.
Série de interface consciente
BeanNameAware: permite que o Bean obtenha seu próprio nome no contêiner.
BeanClassLoaderAware: Permite que um bean obtenha seu carregador de classes.
BeanFactoryAware: Fornece Bean para obter o BeanFactory ao qual pertence.
EnvironmentAware: Permite que os beans obtenham a configuração do ambiente da aplicação.
EmbeddedValueResolverAware: permite que beans resolvam marcadores de valor incorporados.
ResourceLoaderAware: Permite que os beans obtenham carregadores de recursos.
ApplicationEventPublisherAware: Permite que o bean publique eventos do aplicativo.
MessageSourceAware: Permite que o Bean obtenha a fonte da mensagem.
ApplicationContextAware: Permite que os beans obtenham o contexto do aplicativo.
ImportAware: Permite que uma classe de configuração importada obtenha informações sobre a classe que a importou.
Anotações principais
@Configuration: Declare a classe como uma classe de configuração e defina dependências entre beans e beans.
@ComponentScan: permite a verificação de componentes para descobrir e registrar automaticamente classes marcadas como componentes.
@Bean: Declare um método na classe de configuração e retorne uma instância do Bean.
@Import: introduza outras classes de configuração e mescle suas definições de Bean no contêiner atual.
@PropertySource: Especifique o arquivo de propriedades e carregue a configuração externa no ambiente.
@DependsOn: Especifique a ordem de dependência dos beans para garantir que beans específicos sejam inicializados antes de outros beans.
@Conditional: determine se deseja criar um bean com base nas condições.
@Lazy: Especifica a inicialização lenta do bean, que só é criada quando é usado pela primeira vez.
@Value: Injete um valor ou expressão simples no campo ou parâmetro de método de um Bean.
@Autowired: Monta automaticamente dependências do Bean.
@Primary: Especifica o bean preferencial a ser selecionado primeiro entre vários beans candidatos.
@Description: Fornece informações descritivas para o Bean.
@Role: Fornece dicas de função para beans para distinguir beans de tipos semelhantes.
@Indexed: Marca o bean para indexação.
@Order: Especifique a ordem de carregamento dos beans.
Especificação JSR
@Inject: anotação de injeção de dependência padrão JSR-330.
@Named: anotação de nomenclatura padrão JSR-330.
@Resource: anotação de injeção de recurso padrão Java EE.
@Qualifier: usado para qualificar beans injetados.
@Scope: Especifica o escopo do Bean.
@Singleton: Especifique o Bean como singleton.
@PostConstruct: Especifique o método de inicialização.
@PreDestroy: Especifique o método de destruição.
Provedor: Uma interface de fábrica Bean comum fornecida pela biblioteca padrão Java.
Primavera AOP
Proxy dinâmico JDK: implementação de interface, geração dinâmica de classes de proxy, processamento de chamadas de método e preocupações transversais unificadas.
Proxy dinâmico Cglib: uma biblioteca baseada na geração de bytecode, nenhuma interface é necessária e pode interceptar métodos de classe e aprimorá-los.
ClassFilter: determina se a classe corresponde à condição de interceptação.
MethodMatcher: determine se o método corresponde à condição de interceptação.
Pointcut: Defina o ponto de entrada e corresponda ao método interceptado.
Conselho: A interface principal do AOP que define vários comportamentos de tipo de notificação.
MethodInterceptor: Intercepta a execução do método, permitindo que lógica adicional seja adicionada antes e depois.
MethodBeforeAdvice: permite que lógica personalizada seja inserida antes das chamadas de método.
AfterReturningAdvice: Permite que lógica personalizada seja inserida após uma chamada de método. <
ThrowsAdvice: notificação de exceção, captura exceções lançadas por métodos e executa lógica adicional.
IntroduçãoInterceptor: introduz dinamicamente novas funcionalidades ou propriedades no objeto de destino.
Orientador: Usado para combinar notificações e pontos de corte para realizar preocupações transversais na programação de aspectos.
Aconselhável: Configure as notificações, notificadores, alvos, etc. do agente AOP.
ProxyFactory: Uma maneira conveniente de criar objetos proxy.
AopProxyFactory: Crie uma fábrica de proxy AOP, com suporte para JDK e CGLIB.
AopProxy: Crie e gerencie objetos proxy AOP.
AdvisorChainFactory: Interface de fábrica para criação de cadeia de Advisor.
AdvisorAdapterRegistry: Adapte vários conselhos aos interceptadores AOP, registre e gerencie adaptadores Advisor.
AdvisorAdapter: Adapte diferentes tipos de notificações às cadeias de interceptadores.
ProxyMethodInvocation: proxy de invocação de método AOP, lida com cadeias de interceptadores e invocações de métodos.
@EnableAspectJAutoProxy: habilita o proxy automático do aspecto AspectJ.
AnnotationAwareAspectJAutoProxyCreator: Cria um proxy AOP para aplicar aspectos do estilo AspectJ.
BeanFactoryAdvisorRetrievalHelper: ajuda a recuperar e gerenciar Advisor Beans no Spring AOP.
BeanFactoryAspectJAdvisorsBuilder: Construa aspectos de anotação @AspectJ e gere Spring AOP Advisors.
AspectInstanceFactory: Cria instâncias de aspecto e oferece suporte a vários métodos de implementação.
MetadataAwareAspectInstanceFactory: gerencia instâncias de aspecto e metadados e oferece suporte a várias estratégias de instanciação.
AspectJAdvisorFactory: Cria uma instância do notificador AspectJ e gerencia a criação e configuração de notificações de aspecto.
TargetSource: gerencia a aquisição e liberação de objetos proxy AOP.
TargetSourceCreator: Cria fontes de destino especiais e personaliza a criação e o gerenciamento de objetos proxy.
AopContext: Ferramenta para obter objetos proxy Spring AOP.
ExposeInvocationInterceptor: um interceptor que expõe o contexto de invocação do método Spring AOP.
@EnableLoadTimeWeaving: habilita a tecelagem do tempo de carregamento do Spring.
Transação de primavera
Conexão: gerencia conexões de banco de dados, executa SQL e processa transações.
DataSource: Fornece uma interface para gerenciamento eficiente de conexões de banco de dados.
DriverManager: A classe principal para gerenciar e estabelecer conexões de banco de dados.
JdbcTemplate: simplifica as operações JDBC e fornece abstração conveniente de acesso ao banco de dados.
TransactionDefinition: Define o comportamento de propagação da transação e o nível de isolamento.
TransactionAttributeSource: Interface de estratégia para obtenção de atributos de transação.
PlatformTransactionManager: utilizado para gerenciar e coordenar o ciclo de vida e execução de transações.
TransactionTemplate: simplifica o gerenciamento de transações e oferece suporte ao controle programático de transações e ao tratamento de exceções.
SpringTransactionAnnotationParser: analisa a anotação @Transactional e converte-a em configuração de transação.
TransactionInterceptor: interceptor de transação, usado para gerenciar o processamento de transações em nível de método.
EnableTransactionManagement: habilita o gerenciamento de transações baseado em anotações do Spring.
SpringMVC
SpringOpenFeign
entre em contato comigo
✉️ E-mail | Edição | CSDN Me sobre tudo!
⛵Contribuições bem-vindas!
Se você encontrar algum erro ou tiver sugestões de melhorias, envie um problema ou solicitação pull. Seu feedback é muito valioso para mim!
Atualizando continuamente
Para lhe fornecer o conteúdo mais recente e valioso, insistirei em atualizar este armazém todos os dias⏳. Todos os dias, você pode esperar ver algum conteúdo novo ou melhorias no conteúdo existente. Se você tiver alguma sugestão ou feedback, não hesite em entrar em contato comigo? Valorizo cada feedback porque é minha motivação para melhoria contínua.
História das Estrelas
?Observadores das estrelas
?Garfos
?Convide-me para uma lancheira?
O autor tem que escrever um blog à noite✍️ e também precisa trabalhar durante a semana. Se você puder me ajudar, pode me dar um almoço?
Siga a conta pública
Após seguir, responda com a palavra-chave "adicionar grupo" para ingressar em nosso grupo de intercâmbio técnico para se comunicar e aprender com mais desenvolvedores.