@RestController和@RequestMapping注解
我們的Example類上使用的第一個注解是 @RestController 敛苇。這被稱為一個構(gòu)造型(stereotype)注解绵载。它為閱讀代碼的人們提供建議笋庄。對于Spring,該類扮演了一個特殊角色虏劲。在本示例中,我們的類是一個web @Controller ,所以當(dāng)處理進來的web請求時寨典,Spring會詢問它。@RequestMapping 注解提供路由信息房匆。它告訴Spring任何來自"/"路徑的HTTP請求都應(yīng)該被映射到 home 方法耸成。 @RestController 注解告訴Spring以字符串的形式渲染結(jié)果,并直接返回給調(diào)用者浴鸿。
注: @RestController 和 @RequestMapping 注解是Spring MVC注解(它們不是Spring Boot的特定部分)
@EnableAutoConfiguration注解
第二個類級別的注解是 @EnableAutoConfiguration 井氢。這個注解告訴Spring Boot根據(jù)添加的jar依賴猜測你想如何配置Spring。由于 spring-boot-starter-web 添加了Tomcat和Spring MVC岳链,所以auto-configuration將假定你正在開發(fā)一個web應(yīng)用并相應(yīng)地對Spring進行設(shè)置花竞。Starter POMs和Auto-Configuration:設(shè)計auto-configuration的目的是更好的使用"Starter POMs",但這兩個概念沒有直接的聯(lián)系掸哑。你可以自由地挑選starter POMs以外的jar依賴约急,并且Spring Boot將仍舊盡最大努力去自動配置你的應(yīng)用寇仓。
你可以通過將 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一個 @Configuration 類上來選擇自動配置。
注:你只需要添加一個 @EnableAutoConfiguration 注解烤宙。我們建議你將它添加到主 @Configuration 類上。
如果發(fā)現(xiàn)應(yīng)用了你不想要的特定自動配置類俭嘁,你可以使用 @EnableAutoConfiguration 注解的排除屬性來禁用它們躺枕。
[](javascript:void(0); "復(fù)制代碼")
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">import org.springframework.boot.autoconfigure.; import org.springframework.boot.autoconfigure.jdbc.; import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration {
}</pre>
](javascript:void(0); "復(fù)制代碼")
@Configuration
Spring Boot提倡基于Java的配置。盡管你可以使用一個XML源來調(diào)用 SpringApplication.run() 供填,我們通常建議你使用 @Configuration 類作為主要源拐云。一般定義 main 方法的類也是主要 @Configuration 的一個很好候選。你不需要將所有的 @Configuration 放進一個單獨的類近她。 @Import 注解可以用來導(dǎo)入其他配置類叉瘩。另外,你也可以使用 @ComponentScan 注解自動收集所有的Spring組件粘捎,包括 @Configuration 類薇缅。
如果你絕對需要使用基于XML的配置,我們建議你仍舊從一個 @Configuration 類開始攒磨。你可以使用附加的 @ImportResource 注解加載XML配置文件泳桦。
@Configuration注解該類,等價 與XML中配置beans娩缰;用@Bean標(biāo)注方法等價于XML中配置bean
@ComponentScan
你可以自由地使用任何標(biāo)準(zhǔn)的Spring框架技術(shù)去定義beans和它們注入的依賴灸撰。簡單起見,我們經(jīng)常使用 @ComponentScan 注解搜索beans拼坎,并結(jié)合 @Autowired 構(gòu)造器注入浮毯。
如果使用上面建議的結(jié)構(gòu)組織代碼(將應(yīng)用類放到根包下),你可以添加 @ComponentScan 注解而不需要任何參數(shù)泰鸡。你的所有應(yīng)用程序組件( @Component , @Service , @Repository , @Controller 等)將被自動注冊為Spring Beans债蓝。
@SpringBootApplication
很多Spring Boot開發(fā)者總是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他們的main類鸟顺。由于這些注解被如此頻繁地一塊使用(特別是你遵循以上最佳實踐時)惦蚊,Spring Boot提供一個方便的 @SpringBootApplication 選擇。
該 @SpringBootApplication 注解等價于以默認(rèn)屬性使用 @Configuration 讯嫂, @EnableAutoConfiguration 和 @ComponentScan 蹦锋。
](javascript:void(0); "復(fù)制代碼")
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">package com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}</pre>
](javascript:void(0); "復(fù)制代碼")
@ConfigurationProperties
屬性注入
[](javascript:void(0); "復(fù)制代碼")
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Component
@ConfigurationProperties(prefix="connection") public class ConnectionSettings { private String username; private InetAddress remoteAddress; // ... getters and setters
}</pre>
](javascript:void(0); "復(fù)制代碼")
為了使用@ConfigurationProperties beans,你可以使用與其他任何bean相同的方式注入它們
[](javascript:void(0); "復(fù)制代碼")
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Service public class MyService {
@Autowired private ConnectionSettings connection; //...
@PostConstruct public void openConnection() {
Server server = new Server(); this.connection.configure(server);
}
}</pre>
](javascript:void(0); "復(fù)制代碼")
正如使用@ConfigurationProperties注解一個類欧芽,你也可以在@Bean方法上使用它莉掂。當(dāng)你需要綁定屬性到不受你控制的第三方組件時,這種方式非常有用千扔。
為了從Environment屬性配置一個bean憎妙,將@ConfigurationProperties添加到它的bean注冊過程:
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@ConfigurationProperties(prefix = "foo")
@Bean public FooComponent fooComponent() {
...
}</pre>
和上面ConnectionSettings的示例方式相同库正,任何以foo為前綴的屬性定義都會被映射到FooComponent上。
Spring Boot將嘗試校驗外部的配置厘唾,默認(rèn)使用JSR-303(如果在classpath路徑中)褥符。你可以輕松的為你的@ConfigurationProperties類添加JSR-303 javax.validation約束注解:
[](javascript:void(0); "復(fù)制代碼")
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Component
@ConfigurationProperties(prefix="connection") public class ConnectionSettings {
@NotNull private InetAddress remoteAddress; // ... getters and setters
}</pre>
](javascript:void(0); "復(fù)制代碼")
@EnableConfigurationProperties
當(dāng)@EnableConfigurationProperties注解應(yīng)用到你的@Configuration時,任何被@ConfigurationProperties注解的beans將自動被Environment屬性配置
你可以通過在@EnableConfigurationProperties注解中直接簡單的列出屬性類來快捷的注冊@ConfigurationProperties bean的定義抚垃。
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Configuration
@EnableConfigurationProperties(ConnectionSettings.class) public class MyConfiguration {
}</pre>
@Component和@Bean
@Component被用在要被自動掃描和裝配的類上喷楣。@Component類中使用方法或字段時不會使用CGLIB增強(及不使用代理類:調(diào)用任何方法,使用任何變量鹤树,拿到的是原始對象)Spring 注解@Component等效于@Service,@Controller,@Repository
@Bean主要被用在方法上铣焊,來顯式聲明要用生成的類;用@Configuration注解該類,等價 與XML中配置beans罕伯;用@Bean標(biāo)注方法等價于XML中配置bean曲伊。
現(xiàn)在項目上,本工程中的類追他,一般都使用@Component
來生成bean坟募。在把通過web service取得的類,生成Bean時邑狸,使用@Bean
和getter方法來生成bean
@Profiles
Spring Profiles提供了一種隔離應(yīng)用程序配置的方式婿屹,并讓這些配置只能在特定的環(huán)境下生效。任何@Component或@Configuration都能被@Profile標(biāo)記推溃,從而限制加載它的時機昂利。
<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Configuration
@Profile("production") public class ProductionConfiguration { // ...
}</pre>
以正常的Spring方式,你可以使用一個spring.profiles.active的Environment屬性來指定哪個配置生效铁坎。你可以使用平常的任何方式來指定該屬性蜂奸,例如,可以將它包含到你的application.properties中:
spring.profiles.active=dev,hsqldb