- Site oficial: http://spring.io/
- Endereço oficial para download: https://repo.spring.io/libs-release-local/org/springframework/spring/
- GitHub: https://github.com/spring-projects
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.4</version>
</dependency>
vantagem:
- 1.Spring é uma estrutura livre e de código aberto, contêiner.
- 2.Spring é uma estrutura leve, não intrusiva.
- 3. Inversão de controle IoC, Aop face a face
- 4. Suporte para coisas, suporte para estruturas
Composição : O framework Spring é uma arquitetura em camadas que consiste em 7 módulos bem definidos. O módulo Spring é construído no contêiner principal, que define a maneira de criar, configurar e gerenciar beans.
-
Contêiner principal : O contêiner principal fornece as funções básicas da estrutura Spring. O principal componente do contêiner principal é BeanFactory, que é a realização do padrão de fábrica. BeanFactory usa o modelo Inversion of Control (IOC) para separar as especificações de configuração e dependência do aplicativo do código do aplicativo real.
-
Contexto do Spring : O contexto do Spring é um arquivo de configuração que fornece informações de contexto para a estrutura do Spring. O contexto Spring inclui serviços corporativos como JNDI, EJB, e-mail, internacionalização, verificação e funções de agendamento.
-
Spring AOP : Por meio de recursos de gerenciamento de configuração, o módulo Spring AOP integra diretamente funções de programação orientadas a aspectos no framework Spring. Portanto, você pode facilmente fazer com que a estrutura do Spring gerencie qualquer objeto que ofereça suporte a AOP. O módulo Spring AOP fornece serviços de gerenciamento de transações para objetos em aplicativos baseados em Spring. Usando Spring AOP, você pode integrar o gerenciamento de transações declarativas em seu aplicativo sem depender de componentes.
-
Spring DAO : A camada de abstração JDBC DAO fornece uma hierarquia de exceção significativa que pode ser usada para gerenciar o tratamento de exceções e mensagens de erro lançadas por diferentes fornecedores de banco de dados. A hierarquia de exceção simplifica o tratamento de erros e reduz muito a quantidade de código de exceção que precisa ser escrito (como abrir e fechar conexões). As exceções orientadas a JDBC do Spring DAO seguem a hierarquia de exceção geral do DAO.
-
Spring ORM : Spring framework insere vários frameworks ORM, fornecendo assim ferramentas relacionais de objetos ORM, incluindo JDO, Hibernate e iBatis SQL Map. Todos estes seguem a transação geral do Spring e a hierarquia de exceção DAO.
-
Módulo Spring Web : O módulo de contexto da Web é construído na parte superior do módulo de contexto do aplicativo para fornecer contexto para aplicativos baseados na Web. Portanto, a estrutura do Spring oferece suporte à integração com Jakarta Struts. O módulo da web também simplifica o trabalho de processamento de solicitações de várias partes e de parâmetros de solicitação de vinculação a objetos de domínio.
-
Estrutura Spring MVC : a estrutura MVC é uma implementação MVC com todos os recursos para a construção de aplicativos da Web. Por meio da interface de estratégia, o framework MVC torna-se altamente configurável.O MVC acomoda um grande número de tecnologias de visualização, incluindo JSP, Velocity, Tiles, iText e POI.
Spring Boot 与 Spring Cloud
- Spring Boot
1), um conjunto de andaimes de configuração rápida,
2), pode desenvolver rapidamente um único microsserviço baseado no Spring Boot;
3), a convenção é maior do que a configuração! - Spring Cloud
1), Spring Cloud é baseado em Spring Boot;
2), Spring Boot se concentra em um único indivíduo de microsserviço que é rápido e fácil de integrar,
3), Spring Cloud se concentra na estrutura de governança de serviço global;
4), Spring Boot usa Restrições são melhores do que o conceito de configuração. Muitos esquemas de integração foram selecionados para você. Você pode configurá-lo sem configuração?
5) Uma grande parte do Spring Cloud é implementado com base no Spring Boot. Spring Boot pode sair do Spring
Cloud e usar o desenvolvimento projetos de forma independente. Mas Spring Cloud é inseparável do Spring Boot, que é um relacionamento de dependência.
6) SpringBoot desempenha um papel na conexão do acima e do seguinte no SpringClound.Se você quiser aprender SpringCloud, você deve aprender SpringBoot.
Derivação da teoria IoC
No passado, escrevíamos processos de negócios e criamos um maven sem suporte da web, o que não é diferente de escrever código java.
1. Interface UserDao
2. Classe de implementação UserDaoImpl
3. Interface de
negócios UserService 4. Classe de implementação de negócios UserServiceImpl
//UserDao
public interface UserDao {
void getUser();
}
//UserDaoImpl
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
//UserService
public interface UserService {
void getUser();
}
/**
* 业务层调dao层了,我要用它。 组合的概念,我们要用它就直接new出来就行
*/
//UserviceImpl
public class UserServiceImpl implements UserService{
// private UserDao userDao = new UserDaoImpl();
private UserDao userDao = new UserDaoMysqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
//测试
public class MyTest {
public static void main(String[] args) {
// 实际调用的是业务层,dao层他们不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
/**
* 但是如果我们在增加一个实现,那客户就要改service代码,如果用户又要增加实现,又要改代码,不方便,
*/
//新增实现类
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Mysql获取用户数据");
}
}
A segunda forma: antes, usávamos a nova forma, e quando é difícil escrever, usamos a forma set () , da seguinte maneira:
/**
* 业务层调dao层了,我要用它。 组合的概念,我们要用它就直接new出来就行
*/
public class UserServiceImpl implements UserService{
//private UserDao userDao = new UserDaoImpl();
// 第一种
// private UserDao userDao = new UserDaoMysqlImpl();
//第二种实现方式
private UserDao userDao;
// 使用set进行动态实现值的注入
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
//第二种,直接使用set
public class MyTest {
public static void main(String[] args) {
// 实际调用的是业务层,dao层他们不需要接触
// UserServiceImpl userService = new UserServiceImpl();
//第二种方式:set()
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
Em nosso negócio anterior, as necessidades do usuário podem afetar nosso código original e precisamos modificar a implementação do código original de acordo com as necessidades do usuário. Se a quantidade de código do usuário for muito grande, o custo da modificação uma vez é muito caro.
- Antes, o programa estava criando objetos ativamente e o controle estava nas mãos do programador
- Depois de usar a injeção definida, o programa não está mais ativo, mas se torna passivo.
Esse tipo de pensamento resolve essencialmente o problema, e nós, programadores, não gerenciamos mais a criação de objetos.
COI
Inversão de controle IoC (Inversão de controle) é uma ideia de design. DI (injeção de dependência) é uma maneira de implementar IoC. Em programas sem IoC, usamos a programação orientada a objetos, a criação de objetos e as dependências entre objetos Completamente difícil codificado no programa, a criação do objeto é controlada pelo próprio programa, e a criação do objeto é transferida para um terceiro após a inversão de controle. Eu pessoalmente acho que a chamada inversão de controle é: o caminho de obter objetos dependentes é revertido.
Inversão de controle é uma forma de produzir ou obter objetos específicos por meio de descrição (XML ou anotação) e de terceiros . É o contêiner IoC que implementa a inversão de controle no Spring e seu método de implementação é Dependency Injection (DI).
3. Primeiro projeto Spring da HelloSpring
Spring Quick Start
Injetar atributos de tipo comum por meio do método set e criar objetos
Criar projeto, classe pojo
public class Hello {
private String str;
public String getStr(){
return str;
}
public void setStr(String str){
this.str = str;
}
@Override
public String toString(){
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
Beans.xml é applicationcontext.xml, e o próprio framework vai para o site oficial para encontrá-lo, e o teste não faz sentido.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1、bean就是java对象 , 由Spring创建和管理
2、使用spring来创建对象,在Spring这些都称为Bean
3、对象也new好了,我们可以直接使用它了
类型 变量名 = new 类型();
Hello hello = new Hello();
id = 变量名
class = new 的对象
property 相当于给对象中的属性设置一个值
-->
<bean id="hello" class="com.fengbin.pojo.Hello">
<!-- 此处调用setName方法为name属性赋值-->
<property name="str" value="Spring"/>
</bean>
</beans>
Vamos criar um teste MyTest
// 测试
public class MyTest {
public static void main(String[] args) {
/* 官网中配置文件是可以配置多个的
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
*/
// 获取spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 我们的对象现在都在Spring中的管理了,我们要使用,直接去里面取出来就可以了
Hello hello = (Hello) context.getBean("hello");//我们现在可没有new出来hello
System.out.println( hello.toString());
}
}
Pensamento:
Quem criou o objeto Hello? O objeto hello foi criado pelo Spring.
Como são definidas as propriedades do objeto Hello? As propriedades do objeto hello são definidas pelo contêiner Spring.
Este processo é chamado de inversão de controle:
Controle: Quem controla a criação dos objetos, os objetos das aplicações tradicionais são criados sob o controle do próprio programa, após usar o Spring, os objetos são criados pelo Spring
Reversão: O próprio programa não cria um objeto, mas se torna um objeto receptor passivo.
Injeção de dependência: usa o método set para injetar. O núcleo é o método set. Se o método set () da classe for removido, iremos relatar um erro ao configurar a tag <bean , como segue:
IOC é um tipo de ideia de programação, da programação ativa à recepção passiva
é que se for hospedado na primavera, haverá alguns sinais, como segue, clique para pular, podemos usá-lo diretamente; se não houver folha, significa que o feijão não foi registrado,
Plano de modificação 1:
adicionamos um arquivo de configuração do Spring beans.xml no projeto spring-01-ioc1, da seguinte maneira:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysqlImpl" class="com.fengbin.dao.UserDaoMysqlImpl"></bean>
<bean id="UserServiceImpl" class="com.fengbin.service.UserServiceImpl">
<!-- 普通字段我们用value,ref引向一个bean,就是我们要引向spring容器中创建好的对象
ref : 引用spring容器中创建好的对象
value: 具体的值,基本数据类型
-->
<property name="userDao" ref="mysqlImpl"></property>
</bean>
</beans>
Desta forma, o teste original não precisa do novo objeto
// 原先的测试如下:
public class MyTest {
public static void main(String[] args) {
// 实际调用的是业务层,dao层他们不需要接触
// UserServiceImpl userService = new UserServiceImpl();
//第二种方式:set()
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
É para isso que queremos mudar. A operação direta é a seguinte: