天天看點

一文讀懂SpringBoot架構

作者:IT知識分享官

Spring Boot 架構提供了許多注解來簡化配置和開發過程。

什麼是注解式程式設計

注解 annotation 用來定義一個類、屬性和一些方法,以便程式能夠被編譯處理。

它相當于一個說明檔案,告訴應用程式某個類或者屬性是什麼,要怎麼處理。注解可以用于标注包、類、方法和變量等。

注解式程式設計是一種基于注釋的程式編碼風格。它使用特定的注釋來配置和定義應用程式的行為,而不需要顯式編寫大量的配置代碼。

比如:

java複制代碼@RestController
public class Jimmy {
  @RequestMapping("/jimmy")
  public String sayHi() {
    return "Hello, Jimmy."
  }
}
           

常用注解

注解分不同場景使用,使用在類名上,使用在方法上等。

使用在類名上的注解

注解 使用位置 說明
@RestController 類名上 作用相當于 @ResponseBody 加 @Controller
@Controller 類名上 聲明此類是一個 SpringMVC Controller 對象
@Service 類名上 聲明一個業務處理類(實作非接口類)
@Repository 類名上 聲明資料庫通路類(實作非接口類)
@Component 類名上 代表其是 Spring 管理類,常用在無法用 @Service、@Repository 描述的 Spring 管理類上,相當于通用的注釋
@Configuration 類名上 聲明此類是一個配置類,常與 @Bean 配合使用
@Resource 類名上 預設按 byName 自動注入
@Autowired 類名上、屬性或構造函數參數上 預設按 byType 自動注入
@RequestMapping 類名或方法上 用在類上,則表示所有響應請求的方法都是以該位址作為父路徑的
@Transactional 類名或方法上 用于處理事務
@Qualifier 類名或屬性上 為 Bean 指定名稱,随後再通過名稱引用 Bean

下面我們一個個來解析:

@RestController

用于傳回 JSON 、XML 等資料,但是不能傳回 HTML 頁面。相當于 @ResponseBody 和 @Controller 合在一起的作用。

JSON - JavaScript Object Notation, JS 對象标記; XML - eXtensible Markup Language;HTML - HyperText Markup Language
java複制代碼@RestController
public class Hello {
  @RequestMapping("/jimmy")
  public String sayHi() {
    return "Hello, Jimmy.";
  }
}
           

@Controller

用于标注控制器層,在 MVC 開發模式中代表 C(控制器)。

上面 @RestController 的例子,等價于下面的寫法:

java複制代碼@Controller
public class Hello {
  @RequestMapping("/jimmy")
  @ResponseBody
  public String sayHi() {
    return "Hello, jimmy";
  }
}
           

@Service

用于聲明一個業務處理類(實作非接口類),用于标注服務層,處理業務邏輯。

java複制代碼@Service
public class ArticleServiceImpl implements ArticleService {
  @Autowired
  private ArticleRepository articleRepository;
  
  @Override
  public Article findArticleById(long id) {
    return articleRepository.findById(id);
  }
}
           

@Repository

用于标注資料通路層。

java複制代碼@Repository
public class UserRepository {
  @Autowired 
  private JdbcTemplate jdbcTemplate;
  
  public User getUserById(long id) {
    String sql = "SELECT * FROM users WHERE is = ?";
    return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class));
  }
}
           

@Component

@Component 是一個通用的注釋,用于辨別一個類是一個元件。使用 @Component 注釋的類會被架構自動掃描,并建立為一個 Bean,可以在應用程式的其他部分進行注入和使用。

java複制代碼@Component
public class EmailService {
  public void sendEmail(String recipient, String message) {
    // Send email logic
  }
}
           
@Compoent 沒有特定的業務含義。如果在應用程式中有更具體的元件類型,如資料通路元件(@Repository),服務元件(@Service),控制器元件(@Controller)等,推薦使用更加具體的注釋以更好表達其用途和語義。

@Resource

用來标記和注入依賴。它可以用于注入其他 Spring 管理的 Bean、JNDI 資源、以及其他的依賴項。

java複制代碼@Service
public class UserService {
  @Resource
  private UserRepository userRepository;
}
           

@Configuration

用于辨別一個類是配置類。配置類在應用程式中扮演着重要的角色,用于定義群組織應用程式的一些配置。它作為 Bean 的載體。

java複制代碼@Configuration
public class AppConfig {
  @Bean
  public DataSource dataSource() {
    // create and setting datasource object
    DataSource dataSource = new DataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
    dataSource.setUsername("username");
    dataSource.setPassword("password");
    
    return dataSource;
  }
}
           

@Autowired

表示被修飾的類需要注入對象。Spring 會掃描所有被 @Autowired 标注的類,然後根據類型在 loC 容器中找到比對的類進行注入。被 @Autowired 注釋後的類不需要再導入檔案。

例子見 @Repository
@Resource 和 @Autowired 都可以用來裝配 Bean

@RequestMapping

用來處理請求位址映射,用在類或者方法上。如果用在類上,則表示類中的所有響應請求的方法都是以該路徑作為父路徑的。

例子見 @RestController

其有六個屬性:

  • Params: 指定 Request 中必須包含某些參數值,才讓該方法處理
  • Headers: 指定 Request 中必須包含某些指定的 header 值,才能讓該方法處理請求
  • Value: 指定請求的實際位址,指定的位址可以是 URI Template 模式
  • Method: 指定請求的 method 類型,如 GET, POST, PUT, DELETE 等
  • Consumes: 指定處理請求的送出内容類型 Content-Type,比如 "application/json, text/html"
  • Produces: 指定傳回的内容類型。隻有當 Request 請求頭中的 Accept 類型包含該指定類型時才傳回

@Transactional

可以将一個方法或者類标記為事務性操作。

java複制代碼@Service
@Transactional
public class UserService {
  @Autowired
  private UserRepository userRepository;
  
  public void updateUser(User user) {
    // update user information
    userRepository.save(user);
  }
}
           
慎用,如果事務執行過程中報錯,則需要使用 try{ } catch{ throw Exception } 捕獲

@Qualifier

用于标注哪一個實作類才需要注入的。

@Qualifier 常和 @Autowored 一起使用:

java複制代碼@Component
public class PaymentService {
  @Autowired
  @Qualifier("paypalPaymentProcessor")
  private PaymentProcessor paymentprocessor;
}
           

使用在方法上的注釋

常用的比如:

注釋 使用位置 說明
@RequestBody 方法參數前 常用來處理 application、application/xml 等 Content-Type 類型的資料,意味着 HTTP 消息是 JSON/XML 格式,需将其轉換為制定類型參數
@PathVariable 方法參數前 将 URL 擷取的參數映射到方法參數上
@Bean 方法上 聲明該方法的傳回結果是一個由 Spring 容器管理的 Bean
@ResponseBody 方法上 通過适當的 HttpMessageConverter 将控制器中方法傳回的對象轉換為指定格式 (JSON/XML) 後,寫入 Response 對象的 body 資料區

@RequestBody

java複制代碼@RestController
@RequestMapping("/api")
public class UserController {
  @PostMapping("/user")
  public ResponseEntity<String> addUser(@RequestBody MyData myData) {
    // handle data
    return ResponseEntity.ok("Data received");
  }
}
           

@PathVariable

用于擷取參數中的路徑。

java複制代碼@RestController
@RequestMapping("/api")
public class UserController {
  @GetMapping("/users/{id}")
  public ResponseEntity<String> getUserById(@PathVariable("id") Long userId) {
    // ger user information by id
    return ResponseEntity.ok("User Information");
  }
}
           

注意:

  1. @PathVariable 注解的參數名稱必須與 URL 路徑參數的名稱相比對。
  2. 如果參數名稱與路徑參數相同,則可以省略 @PathVariable 中的參數名稱。

@Bean

用于封裝資料,一般有 Setter、Getter 方法。在 MVC 模式中對應的是 M(模型)。

java複制代碼@Configuration
public class AppConfig {
  @Bean
  public Foo foo() {
    return new Foo(bar())
  }
}
           

@ResponseBody

使用該注解後,資料直接寫入輸入流中,不需要進行視圖渲染。

java複制代碼@RestController
@RequestMapping("/api")
public class HelloController {
  @GetMapping("/hello")
  @ResponseBody
  public String sayHi() {
    return "Hello, Jimmy.";
  }
}
           

其他注解

比如:

标題 使用位置 說明
@EnableAutoConfiguration 入口類/類名上 用來提供自動配置
@SpringBootApplication 入口類/類名上 用來啟動入口類 Application
@EnableScheduling 入口類/類名上 用來開啟計劃任務
@EnableAsync 入口類/類名上 用來開啟異步注解功能
@ComponentScan 入口類/類名上 用來掃描元件,可自動發現和裝配一些 Bean。
@Value 屬性上 用來擷取配置檔案中的值