이전 helloworld 예제에서 처음에는 springboot가 자동으로 종속성을 가져오고 구성을 완료하는 용이함을 경험했습니다.
그럼 springboot는 어떻게 구현되나요?
먼저 이전 콘텐츠 예제의 pom.xml을 살펴보세요.
<!--导入父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
여기에 상위 프로젝트가 추가되고 spring-boot-starter-web이라는 종속성 하나만 가져옵니다. 관련 패키지가 들어왔습니다.
전체 과정에서 가이드 패키지에 대해 걱정할 필요가 없습니다.
모든 springboot 프로젝트에는 일반적으로 종속성 관리에 사용되는 상위 프로젝트가 있습니다.
상위 프로젝트는 많은 종속성을 선언할 수 있으므로 하위 프로젝트가 상위 프로젝트를 상속하는 한 나중에 종속성을 추가할 때 버전 번호를 추가할 필요가 없습니다.
위의 예를 들어보면 상위 프로젝트는 springboot 버전인 2.3.4.RELEASE를 사용하므로 아래에 추가된 종속성에 대해서는 버전 번호를 작성할 필요가 없습니다.
(1) 상위 프로젝트가 버전을 관리하는 방법
Ctrl을 누른 채 상위 프로젝트를 클릭하면 확인할 수 있습니다.
들어온 후에 그 사람도 spring-boot-dependents 상위 프로젝트를 가지고 있다는 것을 알았습니다.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> </parent>
계속해서 spring-boot-dependents를 입력하면 아래 속성 태그를 볼 수 있습니다.
개발에 사용할 수 있는 거의 모든 jar 패키지 버전이 여기에 선언되어 있습니다.
계속 내려가면 특정 종속성 관리 dependencyManagement를 볼 수 있습니다. 여기에 인용된 버전은 속성에 선언된 버전입니다.
예:
왼쪽에 logback이라는 패키지가 있어서 검색해 보니 여기에 정의된 버전이 1.2.3이었습니다.
그래서 상위 프로젝트의 주요 기능은 종속성 관리인데, 이는 개발에서 일반적으로 사용되는 종속성의 버전 번호를 거의 선언합니다.
(2) 지정된 버전 사용
자동 중재 버전을 사용하지 않으려면 지정된 버전을 사용할 수도 있습니다.
예를 들어 mysql 버전의 경우 자동 중재 결과가 8.0.21인데 5.1.43 버전만 사용하고 싶습니다.
속성 태그를 추가하고 그 안에 버전을 선언하세요.
<properties> <mysql.version>5.1.43</mysql.version> </properties>
가져온 종속성을 다시 보면 지정된 버전이 되었습니다.
첫 번째로 가져온 종속성을 살펴보겠습니다. spring-boot-starter-web:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
앞으로 spring-boot-starter라는 이름의 스타터를 더 많이 보게 될 것입니다. 공식 문서에도 자세한 지침이 나와 있습니다
스타터란 무엇인가요?
starter는 종속성 설명 집합입니다. 즉, 일반적으로 스타터만 소개하면 해당하는 전체 개발 시나리오가 소개됩니다.
예를 들어 데이터베이스 액세스를 위해 Spring 및 JPA를 사용하려면 프로젝트에 spring-boot-starter-data-jpa 종속성을 도입하세요.
또한 공식 스타터 명명 방법은 spring-boot-starter-*라는 점에 유의하세요.
그럼 비공식도 있다는 건가요? 예, 공식 스타터 시나리오가 여전히 귀하의 요구 사항을 충족할 수 없다고 생각되면 스타터를 사용자 정의할 수 있습니다.
그러나 공식적인 권장 사항은 사용자 정의 이름 지정을 위해 thirdpartyproject-spring-boot-starter를 사용하는 것입니다.
하나의 스타터만 가져와 전체 장면의 종속성을 가져올 수 있는 이유는 실제로 위의 상위 프로젝트와 Maven의 종속성 기능과 동일합니다.
spring-boot-starter-web으로 이동하여 아래로 스크롤하면 웹 시나리오 개발에 사용되는 종속성을 확인할 수 있습니다.
그러므로 앞으로 어떤 시나리오를 개발해야 할지 공식 문서를 참고하여 해당 런처를 가져오면 됩니다.
여기서 다시 이전 helloworld 프로젝트에서 자동으로 구성된 springboot를 검토해 보겠습니다.
Tomcat 자동 구성
springMVC 자동 구성
웹 자동 구성 다음과 같은 일반적인 기능: 문자 인코딩 문제
默认的包结构:主程序所在包以及下面所有子包里的组件都会被默认扫描
各种配置拥有默认值
按需加载所有自动配置项
......
不管自动配置好什么,步骤都是:先引入、再配置。
比如 tomcat,那么前提是先引入了 tomcat 依赖,这就由上面第一部分内容所讲的依赖管理完成,在引入了 web starter 后,自动引入场景。
自动引入了场景,也就引入了这个场景下所用到的各种 jar 包,接下来就是要配置这些内容,比如 tomcat、springMVC 等等。
拿 springMVC 举例,在之前要使用 springMVC,肯定要配置DispatcherServlet,帮我们拦截所有请求。
<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
现在看下之前的 helloworld 应用中,springboot 是在哪里帮我们做好配置的。
先看主程序类:
// 标记这是一个 springboot应用,这个类是主程序类,所有启动的入口 @SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
可以创建个本地变量(alt+enter),可以看到这个是个ConfigurableApplicationContext类型。
@SpringBootApplication public class MainApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); } }
可以使用getBeanDefinitionNames()方法,查看里面包含了哪些容器,遍历打印出来。
@SpringBootApplication public class MainApplication { public static void main(String[] args) { // 返回IOC容器 final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); // 查看容器里的组件 final String[] beanDefinitionNames = run.getBeanDefinitionNames(); for (String name: beanDefinitionNames) { System.out.println(name); } } }
接下来启动应用,看下控制台输出。
在控制台输出里ctrl+F搜索下DispatcherServlet:
发现 IOC 容器中已经有了对应的组件。
主程序所在包以及下面所有子包里的组件都会被默认扫描,所以我们不需要配置开启组件扫描,也可以正常使用。
但是要注意这里的范围:
示例中就是com.pingguo.boot包下以及所有子包都可以自动扫描。
如果你就是要放到外面,还希望被扫描到,怎么办?
那么可以使用主程序类中@SpringBootApplication注解中的一个属性scanBasePackages,扩大包的范围即可:
@SpringBootApplication(scanBasePackages = "com.pingguo") public class MainApplication { public static void main(String[] args) { ... ...
比如 tomcat端口,在application.properties配置文件里使用 idea 输入的时候,就可以看到带有默认值8080:
点击进去可看到后面都是绑定了对应的 java 类。
配置文件的值最终会绑定在对应的类上,这个类会在容器中创建对象。
比如应用中只引入了spring-boot-starter-web,那么就只有web场景的自动配置才会开启。
springboot 中的所有自动配置,都在这里:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.3.4.RELEASE</version> <scope>compile</scope> </dependency>
点击spring-boot-starter-web可以找到spring-boot-starter,再进入其中就可以看到spring-boot-autoconfigure。
위 내용은 SpringBoot 자동 구성을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!