POR QUE
No início de seu nascimento, o principal objetivo de criar a primavera era substituir mais tecnologias Java em nível de peso pesado, especialmente o EJB. Comparado ao EJB, o Spring fornece um modelo de programação mais leve e mais simples.
O QUE
A primavera é uma estrutura de código aberto criado pela primeira vez por Rodjohnson. A primavera foi criada para resolver a complexidade do desenvolvimento de aplicativos em nível corporativo. O uso da primavera pode permitir que os javabeus simples implementem coisas que apenas o EJB poderia realizar antes. A primavera não se limita ao desenvolvimento do lado do servidor, qualquer aplicativo Java pode se beneficiar da primavera em termos de simplicidade, testabilidade e acoplamento frouxo.
Hoje, a primavera está envolvida no desenvolvimento móvel, integração da API social, banco de dados NOSQL, computação em nuvem e big data. Com o tempo, o EJB também adotou os conceitos de injeção de dependência (DI) e programação orientada a aspectos (AOP). Em suma, a missão mais fundamental da primavera é simplificar o desenvolvimento de Java
COMO
Para reduzir a complexidade do desenvolvimento de Java, a primavera adota uma estratégia de 4 minutos
Programação invasiva leve e mínima com base no POJO Permite o acoplamento frouxo por meio de injeção de dependência e orientação a interface
Programação declarativa com base em seções e convenções reduz o código de estilo através de seções e modelos
Potencial de Pojo
Muitas estruturas forçam os aplicativos a herdar suas classes ou implementar suas interfaces, o que leva a aplicativos que estão vinculados à estrutura, que é uma programação invasiva, resultando na incapacidade de reutilizar blocos de código. A primavera se esforça para evitar estragar seu código de aplicativo devido à sua própria API. Em aplicações construídas na primavera, suas classes geralmente não têm vestígios de nenhum sinal de que você esteja usando o Spring.
classe pública helloworldbean {public string dizhello () {return "hello world"; }} O código de exemplo acima representa uma classe Java muito simples e comum (POJO). Você não pode dizer que é um componente de primavera. A programação não invasiva da Spring é refletida nesta classe que pode desempenhar um papel nas aplicações de primavera e na primavera. Apenas esse código de código na verdade não reflete as funções da Spring e o conhecimento a seguir ainda é necessário.
Injeção de dependência (injetando a própria classe dependente)
A injeção de dependência não é tão alta na primavera, embora tenha evoluído para uma técnica complexa de programação ou conceito de padrão de design. Isso é entendido na primavera, injetando dependências. Um aplicativo com significado prático exige que várias classes colaborem entre si para concluir a lógica de negócios específica. A prática tradicional é que cada objeto é responsável por gerenciar referências a objetos relacionados a si mesmo (este objeto relacionado é o objeto que depende do objeto expresso na primavera), mas isso dificultará o teste e o código.
Considere o seguinte código
/** Este nome de classe difícil de boca foi nomeado especialmente pelo autor para se encaixar em uma cena simulada* Esta classe representa o cavaleiro que resgatou a garota* criada por Wung em 2016/8/25. */classe pública Damselrescuingknight implementa Knight {Private RescuedamselQuest Quest;/*** Criado resguedamselQuest em seu construtor* Isso faz com que os donzenight e resgatemselQuest em seu construtor acoplados*/public DenselSescuingknight () {this.Quest = RECUTELESTES ()/); EmbarkonQuest () {Quest.embark ();}} O acoplamento tem dois lados. Por um lado, é difícil testar, o código fortemente acoplado é difícil de testar, reutilizar e entender, e haverá bugs do tipo "lutando contra o duende". Por outro lado, é necessário um certo grau de acoplamento e diferentes classes devem interagir de maneira apropriada.
O problema surge, então como a primavera resolveu?
Na primavera, por meio de injeção de dependência (DI), as dependências entre os objetos são definidas pelos componentes de terceiros no sistema que coordenam cada objeto ao criar o objeto. Em outras palavras, os objetos precisam apenas gerenciar suas propriedades internas sem criar ou gerenciar suas dependências por si mesmas, e as dependências serão injetadas automaticamente nos objetos que precisam deles.
/*** Este cavaleiro pode executar várias tarefas de aventura em vez de apenas a anterior para resgatar a garota* criada por Wung em 2016/8/25. */classe pública BraveKnight implementa Knight {Private Quest;/*** BraveKnight não cria tipos de aventura por conta própria, mas passa as tarefas de aventura como parâmetros durante a construção* essa é uma das formas de injeção de dependência: injeção de construtor*/public Braveknight (missão) {this.Quest = Quest;} Public; O Braveknight não é acoplado a nenhuma implementação específica da missão. Enquanto uma tarefa implementar a interface da missão, não importa qual tipo de aventura é. Isso alcança o objetivo do acoplamento DI - solto
Se um objeto indicar apenas uma dependência através de uma interface, essa dependência poderá ser substituída por diferentes implementações concretas sem que o próprio objeto esteja ciente.
Então agora, vamos injetar significado prático
Para o código acima, injetaremos uma tarefa de aventura com uma implementação específica no Brave Knight
/** A missão de aventura de matar dragões (este autor é uma boa segunda classe)*criada por Wung em 2016/8/25. */public classe slaydragonquest implementa missão {private printstream stream; public slaydragonQuest (stream PrintStream) {this.stream = stream;} public void embark () {stream.print ("matar o dragão");}}}Então agora a questão é: como injetar o objeto PrintStream de que depende do SlayDragonQuest, como injetar o objeto de missão de que depende do Braveknight. A mola mencionada acima gerenciará centralmente essas dependências, e o comportamento da criação de colaboração entre os componentes do aplicativo geralmente é chamado de montagem (fiação), ou seja, injeção. A Spring fornece uma variedade de métodos de montagem a serem introduzidos em mais detalhes posteriormente. Aqui, apresentamos brevemente a Assembléia com base no XML e na Assembléia com base nas anotações Java.
<!- Este é um processo de montagem. Declare Slaydragonquest como um feijão, chamado "Quest". Por ser uma injeção de construtor, use o valor do atributo construtor-ARG para representar o valor injetado. Este processo resolve o problema anterior. Injete o objeto PrintStream no objeto SlayDragonQuest-> <bean id = "Quest"> <construtor-arg value = "#{t (system) .out}"> </structor-arg> </ean> <!-Este processo é o mesmo que acima. Braveknight declara um feijão chamado "Knight" (esse nome não é necessariamente usado), então o parâmetro construtor do Braveknight deve ser o tipo de missão. Neste momento, outro feijão é aprovado na referência, que é a referência do feijão com o nome "Quest" acima. Neste momento, a injeção do construtor de Braveknight também está concluída-> <bean id = "knight"> <construtor-arg ref = "miss"> </construtor-arg> </i bean>Spring fornece configurações baseadas em Java que podem ser usadas como uma alternativa ao XML
/** O arquivo de configuração baseado em Java implementa a montagem de objetos*criada por Wung em 2016/8/26. */ @ConfigurationPublic Class KnightConfig {@Bean public Knight () {Return New Braveknight (Quest ()); } @Bean public Quest () {return New SlayDragonQuest (System.out); }}Os efeitos são os mesmos e a explicação específica é descrita em detalhes no próximo capítulo. Vamos revisá -lo novamente. Foi dito que a primavera gerenciará automaticamente dependências entre objetos, então o que esse tipo de gerente é? A resposta é o contexto do aplicativo, que é um contêiner para a mola que pode carregar as definições de feijão e montá -las. O contexto de aplicação da primavera é o único responsável pela criação e montagem de objetos. De fato, existem muitas maneiras de implementar a diferença entre esse contexto, apenas a diferença no carregamento da configuração. Vamos ver uma maneira de carregar a configuração.
classe pública knightMain {public static void main (string [] args) {anotationConfigApplicationContext context = new AnoTationConfigApplicationContext (knightConfig.class); // A definição do feijão pode ser obtida no arquivo de configuração. Cavaleiro knight = context.getbean (knight.class); knight.embarkonQuest (); context.Close (); }}Aplique corte de rosto
O DI pode manter os componentes de software colaborativos vagamente acoplados, enquanto a programação de faceta permite separar funções em todo o aplicativo para formar componentes reutilizáveis e, mais especificamente, é uma tecnologia que gera sistemas de software a se esforçarem para o foco. O que é um foco? Os serviços de sistema, como registro, gerenciamento de transações e gerenciamento de segurança, geralmente precisam ser integrados a outros componentes que possuem a lógica de negócios. Esses serviços do sistema geralmente são chamados de foco cruzado porque serão reutilizados em vários lugares, abrangendo vários componentes do sistema. Simplificando, você extrai os serviços que precisam ser reutilizados de vários outros componentes, mas como usá -los? De fato, é para inserir o método nos locais que você precisa usar ao usá -lo. No entanto, de acordo com este termo "seção", ele deve ser expresso como extraindo o componente reutilizado como uma seção e cortando a seção através do componente quando necessário. Portanto, dessa maneira, os aplicativos principais não precisam conhecer a existência dessas seções e as seções não integrarão a lógica de negócios nos aplicativos principais.
/** Uma aula de cantor é usada para elogiar os Cavaleiros, isto é, para servir os Cavaleiros*criados por Wung em 2016/8/26. */public class Minstrel {private printStream Stream; public Minstrel (PrintStream Stream) {this.stream = stream; } // Execute public void singbeforeQuest () {stream.print ("BEGIN"); } // Execute public void SingAfterQuest () {stream.print ("end"); }} Classe public BraveKnight implementa Knight {Private Quest; Private Minstrel Minstrel;/*** Braveknight não cria tipos de aventura por conta própria, mas passa as tarefas de aventura como parâmetros na construção*, essa é uma das maneiras de injeção de dependência: injeção de construtor* // Public Braveknight (missão) {// This.Quest. minstrel) {this.quest = missão; this.minstrel = minstrel;} public void embarkarkonQuest () {minstrel.singbeforeQuest (); miss.embark (); minstrel.singafterQuest ();}} Nesse momento, o corajoso cavaleiro começou a executar, mas ele descobriu que, em seus deveres, não era apenas um risco, mas agora ele tinha que administrar o cantor para louvá -lo, mas isso em si não deve pertencer à categoria que deveria ser gerenciada. Portanto, usando a idéia de seções, precisamos extrair o comportamento de louvor do cantor e nos tornar uma seção. Antes que os Cavaliers assumam o risco, esta seção será atravessada e executará o método SingBeforeQuest e executará o método Singafterquest após o risco. Portanto, isso perceberá o código que não precisa ser elogiado pelo cavaleiro, e o cantor não existe no objeto do cavaleiro. Ele não apenas elogiará o Cavaleiro, mas também elogiará alguém enquanto outros usarem esta seção para entrar.
<!-significa que configurar o feijão com o ID acima como menestrel como uma seção está realmente configurando o cantor como uma seção-> aspecto ref = "minstrel"> <!-Definindo o ponto de entrada, ou seja, onde usar a seção Expressão = "Execution ( * * .BarkonQuest (..) que é um aspecto da linguagem de expressão que se destaca. Execução pré-notícia e pós-nota antes e depois do ponto de entrada-> </aOP: depois> </aOP: antes> </aOP: Pointcut> </aOP: </aOP: config>
A situação é que o menestrel ainda é um pojo independente, e o contexto da primavera o transformou em uma seção. O mais importante é que o cavaleiro não tem idéia da existência desta seção no momento. Esta é apenas uma pequena castanha, que pode realmente fazer muitas coisas importantes.
Use modelos para eliminar o código de estilo
Há uma situação em que quando usamos o JDBC para acessar o banco de dados para consultar dados, o processo completo requer estabelecer conexões, criação de objetos de instrução, conjuntos de resultados de processamento, consulta e fechamento de várias conexões. Além disso, várias exceções são capturadas e, em seguida, consultas em vários cenários requerem essa repetição meticulosa. O JDBC não é apenas o único caso em que há muito código de estilo como esse. A Spring visa eliminar o código de estilo através do encapsulamento de modelo, como o JDBCTemplate da Spring.
Acomodar seu feijão
Em aplicativos baseados em primavera, seus objetos de aplicativos vivem em recipientes de primavera, responsáveis pela criação de objetos de objetos e gerenciar seus ciclos de vida. Então, o que é o Spring Container? Não existe apenas um tipo de contêiner. A primavera vem com várias implementações de contêineres. É dividido em duas categorias: fábricas de feijão, que são os contêineres mais simples para fornecer suporte básico de DI. O contexto do aplicativo é relativamente avançado e fornece serviços de nível de estrutura de aplicativos. Na maioria das vezes, o contexto do aplicativo é mais popular.
O contexto do aplicativo também é dividido em várias maneiras diferentes de carregar configurações.
Vários recursos de primavera
Resumir
A Spring é uma tecnologia de estrutura que pode simplificar o desenvolvimento e seu conteúdo principal é DI e AOP.
O exposto acima é a fofoca sobre este artigo - gradualmente entende o conteúdo inteiro de Spring, espero que seja útil para todos. Amigos interessados podem continuar se referindo a este site:
Springmvc Introdução Exemplo
Explicação detalhada do código para injetar valor de atributo usando arquivos de configuração e @value na primavera
Spring Integrated Redis Código detalhado da amostra
Se houver alguma falha, deixe uma mensagem para apontá -la.