>  기사  >  Java  >  스프링부트의 원리는 무엇인가요?

스프링부트의 원리는 무엇인가요?

hzc
hzc원래의
2020-06-16 14:14:357243검색

스프링부트의 원리는 무엇인가요?

Spring Boot의 원리는 무엇인가요?

1. 콘텐츠 소개

"Spring Boot Experience"를 통해 Spring Boot가 할 수 있는 일을 주로 소개합니다. 다양한 기능적 포인트에 대한 기본 구현 아이디어를 분석합니다. , Spring Boot를 이해하려면 전반적으로 합리적인 이해가 필요합니다.

  • 종속성 관리: Spring Boot는 많은 스타터를 수행했으며 스타터는 종속성을 가져오는 데 도움이 되는 입구일 뿐이며 프로젝트 종속성 관리를 단순화합니다.

  • 자동 구성: Spring Boot는 Spring을 기반으로 하는 많은 공통 구성 요소와 구성 요소를 제공합니다. 코드 구성 프레임워크의 구성 클래스를 통해 프로젝트 구성을 단순화

  • 임베디드 컨테이너: Java를 통합하여 개발 환경 구축을 단순화하고 웹 애플리케이션을 실행 파일로 패키징하기 위한 플러그인 패키징의 기반이 되는 공통 웹 컨테이너

  • Maven 플러그인: use 프로젝트에 대한 지원을 즉시 제공하기 위해 직접 실행할 수 있는 jar 파일이나 war 파일을 패키지하는 데 사용됩니다. 물론 개발을 돕는 몇 가지 작은 기능도 있습니다

  • 핫 스타트: 개발 과정에서 컨테이너의 반복 시작 횟수를 줄이고 개발 효율성을 높입니다.

  • 애플리케이션 모니터링: 애플리케이션 감사, 상태 모니터링, 메트릭 데이터 수집을 위한 기본 서비스 제공

  • CLI(명령줄 도구): 신속한 프로토타이핑을 위해

를 사용할 필요가 없습니다. 2. 시작 종속성: starter

일반 Maven 프로젝트에서 특정 프레임워크나 구성 요소를 사용하려면 큰 파일을 가져와야 합니다. Spring Boot는 많은 수의 스타터를 제공하며 이러한 스타터는 Maven을 사용합니다. 종속성 전송은 관련 종속성을 가져오는 데 도움이 됩니다. 예를 들어 다음 pom 파일은 Spring Web, Spring MVC 등을 포함한 웹 관련 종속성을 추가합니다.

    .......    <dependencies>
        <!--Web应用程序的典型依赖项-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>

    </dependencies>
    .......

Principle: 방금 종속성을 가져왔지만 이 종속성은 Maven을 사용합니다. transfer는 웹 개발에 사용되는 많은 패키지를 가져오는 데 도움이 됩니다. 이 종속성에 해당하는 35ffd8e0928e307213da87b63bd3711a 파일의 압축을 풀면 실제로 What이 없다는 것을 알 수 있습니다. 이는 단지 pom 프로젝트이기 때문에 실질적인 콘텐츠는 패키지에 해당하는 af26ebdadc0a793eec8fe280ca9c1087 파일에 있으며, 이는 mavne에서 다음과 같이 다운로드됩니다. jar 파일 다운로드 시 spring-webmvc, spring-web 등과 같은 많은 종속성이 이 파일에 선언됩니다.

간단히 말하면, 프로젝트가 특정 스타터에 의존하는 경우 스타터는 다른 많은 종속성에 의존하게 되며 Maven의 종속성 전송은 스타터가 의존하는 종속성을 프로젝트에 추가합니다. 스타터는 프로젝트 종속성에 대한 가져오기 중개자일 뿐입니다.

Maven의 종속성 전송에 대한 관련 정보를 참조할 수 있습니다. 간략한 설명은 다음과 같습니다.

프로젝트 A는 B에 의존하고 B는 C에 의존합니다. 프로젝트 A는 B에 종속된다는 점만 선언하면 되고 C에 종속된다는 점은 선언할 필요가 없습니다. Maven은 이 종속성 전달을 자동으로 관리합니다.

2. 자동 구성: AutoConfiguration

Spring Boot는 특정 조건에 따라 기본값을 사용하여 관련 구성 요소나 프레임워크를 자동으로 구성하므로 Spring의 자동 스캐닝을 기반으로 프로젝트 구성 파일이 크게 줄어듭니다. 코드 기반 구성. 자체 처리 흐름. 다음 콘텐츠에서는 먼저 Spring의 코드 기반 구성을 간략하게 소개한 다음 Spring Boot가 수행하는 작업을 소개합니다.

(1) 코드 구성에 따른 Spring

Spring 3 이전에는 Spring 컨텍스트를 사용하는 방법이 일반적으로 다음과 같았다.

Spring 구성 파일

<!-- 数据源 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
 <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
 <property name="username" value="hr" />
 <property name="password" value="hr" /></bean>
 <!--组件扫描-->
 <context:component-scan base-package="com.demo.spring.sample.step03.?rvic?" />

비즈니스 코드

package com.demo.spring.sample.step03.service.impl;.......@Service("userService")
public class UserService implements IUserService {   
   @Autowired
   private IUserDAO userDAO = null;
}

Spring 컨텍스트 생성

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

요약:

전달된 컴포넌트 스캔은 클래스 경로에서 @Component, @Repository, @Service 및 @Controlle로 주석이 달린 클래스를 스캔하도록 Spring에 지시합니다. Spring은 이러한 클래스를 인스턴스화하고 인스턴스를 Spring 컨텍스트에 등록하지만 데이터 소스, 속성 파일 등은 등록합니다. 타사 Bean은 여전히 ​​XML 파일을 사용하여 구성됩니다. XML 구성 파일을 완전히 제거하려는 경우에도 이를 수행해야 한다면 상대적으로 번거롭습니다.

XML 구성 파일을 사용하면 장점과 단점이 있습니다. 단점 중 하나는 Bean 인스턴스화 프로세스를 너무 많이 사용자 정의할 수 없다는 것입니다. 예를 들어 클래스 경로에 Oracle의 jdbc 드라이버가 있는 경우 위의 dataSource를 인스턴스화하려는 경우입니다. , 완료할 수 없습니다. 또 다른 단점은 코드 로직이 분산되어 있다는 것입니다. 물론 로직의 일부가 XML로 구성되기 때문에 구성이 중앙 집중화되어 구성 전환이 편리하다는 장점이 있습니다.

Spring 3 이후에는 다음과 같은 방법으로 Spring 컨테이너를 사용할 수 있습니다.

Spring 구성 클래스

@Configuration // 表明当前类提供Spring配置文件的作用,Spring上下文会从当前类的注解中提取配置信息
@ComponentScan(basePackages = "com.demo.spring.sample.step08") 
// 开启组件扫描
public class AppConfig {
    @Bean // 表示这个方法实例化一个bean,id=dataSource
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        return dataSource;
    }}

비즈니스 코드

package com.demo.spring.sample.step03.service.impl;.......@Service("userService")
public class UserService implements IUserService {   
   @Autowired
   private IUserDAO userDAO = null;
}

Spring 컨텍스트 생성

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

요약:

XML 기반 구성은 생성 시 더 이상 사용되지 않습니다. 구성 파일은 사라지고 AppConfig 클래스로 대체됩니다. 이 클래스는 @Configuration으로 주석을 달아야 하며, 이 클래스에는 @Bean으로 주석이 달린 메서드가 있을 수 있습니다. .

(2), Spring Boot의 자동 구성

Spring Boot는 @Configuration으로 주석이 달린 많은 클래스를 작성하는 데 도움이 되었습니다. 각 클래스는 DataSourceConfiguration.java의 정적 내부 클래스 Dbcp2와 같은 구성 요소 또는 프레임워크 구성을 제공합니다. DBCP 데이터 소스 구성

//DBCP 数据源配置.
@Configuration //这个注解在实际代码中没有加,当前类被其它配置类Import
@ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type",  matchIfMissing = true,havingValue = "org.apache.commons.dbcp2.BasicDataSource")
static class Dbcp2 {

   @Bean
   @ConfigurationProperties(prefix = "spring.datasource.dbcp2")
   public org.apache.commons.dbcp2.BasicDataSource dataSource(
         DataSourceProperties properties) {
      return createDataSource(properties,
            org.apache.commons.dbcp2.BasicDataSource.class);
   }

}

요약:

当Spring Boot启动的基本步骤走完后,  如果启用了自动配置,Spring Boot会加载50d40f95c57eb2493885ff1d73d54fff下的24f1ab0d6dc6fb50ace902cbd083b53c文件中的内容,该文件中定义了有关自动配置的信息,其中EnableAutoConfiguration对应的每一个类中都加入了注解@Configuration,也就是说这样的每一个类都相当于Spring的一个或多个配置文件,而其中加注解@Bean的方法是bean的工厂方法,会由Spring上下文自动调用,并且将返回的对象注册到上下文中。

spring.factories文件中自动配置类的部分内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
......
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
......

(三)、如何覆盖自动配置的属性

Spring Boot的自动配置会采用大量的默认值(约定由于配置),可以通过在类路径下提供application.properties或者application.yml配置文件来覆盖默认值,当然部分属性值必须通过该配置文件来提供,比如如果要使用Spring Boot对数据源的自动配置,则在配置文件中必须提供jdbc的url,否则会抛出异常。

三、集成内嵌容器 :main方法

Spring Boot支持的内嵌容器Tomcat、Jetty、Undertow本身就支持在Java中内嵌使用,因为这些容器本身就是使用Java编写的,只不过Spring Boot在main方法的调用链中根据自动配置嵌入了这样的容器。

不使用这样的内嵌容器也是可以的,在Maven中移除这样的依赖就可以,当然这个时候如果要通过Spring Boot使用Web相关框架,则需要打包为war包后独立部署,或者在开发过程中使用IDE环境的开发部署功能。

不使用内嵌容器的Web应用在打包时需要对工程进行一定的修改。

四、打包可运行文件 :maven-plugin

Maven使用的默认打包工具支持打包jar文件或者war文件,但是打包后的jar文件中不能再嵌入jar文件,而打包后的war文件不能直接运行,为了把工程所有文件打包为一个可直接运行的jar文件或war文件,spring提供了一个maven插件来解决这样的问题。当然这个插件还提诸如spring-boot:run这样的开发功能

五、热启动 :devtools

在开发过程中,当完成一个功能单元后,我们会启动程序查看运行效果,如果代码需要再次修改,则修改后需要关掉程序,然后重启程序,这个过程不断迭代,从而完成代码的编写、调试。

Spring Boot 热启动通过重写容器的类加载器,完成程序的部分重启,从而简化、加速程序的调试过程。spring-boot-devtools通过两个类加载器分别加载依赖库和项目代码,当spring-boot-devtools发现项目的编译输出路径下有变化时,通过其中的一个类加载器重新加载所有的项目自有代码,从而完成热启动。这样的热启动比冷启动(关闭、重启)要快很多,到底快多少取决于项目自有代码的数量。

和热启动对应的还有一个热替换,是指单独地替换被修改的某一个class到jvm中,甚至可以单独替换class的某个方法,这种方式比热启动要快,通常使用 JavaAgent 拦截默认加载器的行为来实现,spring有个独立的项目Spring Loaded就是这么做的,但是项目已经被移到了 attic 了,也就是被Spring束之高阁,所以不建议使用。

六、应用监控:actuator

如果类路径中有actuator这个组件的话,Spring Boot的自动配置会自动创建一些端点(端点:遵循Restful设计风格的资源,对应于Controller的某一个处理请求的方法),这些端点接受请求后返回有关应用的相关信息,比如:健康信息、线程信息等。返回的是json格式的数据,而使用 Spring Boot Admin 可以实现这些 JSON 数据的视图展现,当然也可以为其他应用监控系统监控当前系统提供服务。

七、问题:

为什么pom文件中要继承spring-boot-starter-parent?

spring-boot-starter-parent是spring-boot提供的一个pom,在该pom中定义了很多属性,比如:java源文件的字符编码,编译级别等,还有依赖管理、资源定义的相关pom配置,项目的pom如果继承starter-parent,可以减少相关配置

推荐教程: 《java教程

위 내용은 스프링부트의 원리는 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.