前の 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>
ここには親プロジェクトが追加されており、インポートされるのは 1 つだけです。 spring-boot-starter-web に依存して、すべての関連パッケージが最終的に導入されます。
プロセス全体を通じて、パッケージの導入の問題について心配する必要はありません。
すべての springboot プロジェクトには親プロジェクトがあり、通常は依存関係の管理に使用されます。
親プロジェクトは多くの依存関係を宣言する可能性があるため、サブプロジェクトが親プロジェクトを継承している限り、後で依存関係を追加するときにバージョン番号を追加する必要はありません。
上記を例にとると、親プロジェクトは Springboot バージョンの 2.3.4.RELEASE を使用しているため、以下に追加する依存関係のバージョン番号を記述する必要はありません。
(1) 親プロジェクトによるバージョン管理方法
Ctrl キーを押しながら親プロジェクトをクリックすると確認できます。
#入社後、彼が親プロジェクトの spring-boot 依存関係も持っていることがわかりました。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> </parent>
spring-boot-dependency の入力を続けると、以下のプロパティ タグが表示されます:
これは、開発におけるすべての可能性をほぼ宣言しています。使用される jar パッケージのバージョン。
Continue down to see the specific dependency Management dependencyManagement. ここで引用されているバージョンは、プロパティで宣言されているバージョンです。
例:
左側に logback というパッケージがあったので、中を検索したところ、ここで定義されているバージョンは 1.2.3 であることがわかりました。
つまり、親プロジェクトの主な機能は依存関係管理であり、開発で一般的に使用される依存関係のバージョン番号をほぼ宣言します。
(2) 指定バージョンを使用する
自動調停バージョンを使用したくない場合は、指定バージョンを使用することもできます。
たとえば、mysql のバージョンの場合、自動調停の結果は 8.0.21 ですが、バージョン 5.1.43 のみを使用したいと考えています。
#プロパティ タグを追加し、その中でバージョンを宣言します。<properties> <mysql.version>5.1.43</mysql.version> </properties>インポートされた依存関係を再度確認すると、指定されたバージョンになっています。 2. シナリオ スターター 最初にインポートされた依存関係 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 を使用することです。 なぜ 1 つのスターターだけがシーン全体の依存関係をインポートできるのかというと、これは実際には上記の親プロジェクトと同じ Maven の依存関係機能です。 spring-boot-starter-web と入力し、下にスクロールすると、Web シナリオの開発で使用される依存関係が表示されます。 #したがって、今後どのシナリオを開発する必要があるかは、公式ドキュメントを参照して、対応するランチャーをインポートするだけです。 2. 自動構成 前の helloworld プロジェクトで Springboot が自動的に構成したものを確認してみましょう:
默认的包结构:主程序所在包以及下面所有子包里的组件都会被默认扫描
各种配置拥有默认值
按需加载所有自动配置项
......
不管自动配置好什么,步骤都是:先引入、再配置。
比如 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 中国語 Web サイトの他の関連記事を参照してください。