Spring 注解

Spring註釋允許我們通過Java程序配置依賴關係並實現依賴注入。

Spring註釋

  • Spring框架實現並推廣了控制反轉(IOC)或依賴注入(DI)的原則,實際上是一個IOC容器。
  • 傳統上,Spring允許開發人員使用基於XML的配置來管理bean的依賴關係。
  • 還有一種定義bean及其依賴關係的替代方法,即基於Java的配置。
  • 與XML方法不同,基於Java的配置允許您以編程方式管理bean組件。這就是為什麼引入了Spring註釋。

在本文中,我們將探討最常用的Spring註釋,並查看一些示例程序。

Spring註釋列表

一些Spring核心框架註釋包括:

  1. @Configuration:用於指示類聲明一個或多個@Bean方法。這些類由Spring容器處理,以在運行時生成bean定義和對這些bean的服務請求。

  2. @Bean:表示一個方法生成一個由Spring容器管理的bean。這是最常用和最重要的Spring註解之一。@Bean註解也可以使用name、initMethod和destroyMethod等參數。

    • name – 允許為bean指定名稱
    • initMethod – 允許您選擇在上下文註冊時要調用的方法
    • destroyMethod – 允許您選擇在上下文關閉時要調用的方法

    例如:

    @Configuration
    public class AppConfig {
    
        @Bean(name = "comp", initMethod = "turnOn", destroyMethod = "turnOff")
        Computer computer(){
            return new Computer();
        }
    }
    
    public class Computer {
    
        public void turnOn(){
            System.out.println("加載操作系統");
        }
        public void turnOff(){
            System.out.println("關閉所有程序");
        }
    }
    
  3. @PreDestroy@PostConstruct 是 bean initMethod 和 destroyMethod 的替代方式。它可以在我們定義的 bean 類中使用。例如:

     public class Computer {
    
        @PostConstruct
        public void turnOn(){
            System.out.println("載入操作系統");
        }
    
        @PreDestroy
        public void turnOff(){
            System.out.println("關閉所有程式");
        }
    }
    
  4. @ComponentScan:配置用於 @Configuration 類的組件掃描指令。在這裡,我們可以指定要掃描的基礎包含 spring 組件。

  5. @Component:表示被註解的類是一個 “組件”。當使用基於註解的配置和類路徑掃描時,這樣的類被視為候選對象。

  6. @PropertySource: 为Spring的环境提供了一种简单的声明性机制来添加属性源。类似的注解还有用于添加属性源文件数组的@PropertySources

  7. @Service: 表示被注解的类是一个“服务”。该注解是@Component的特化版本,允许通过类路径扫描自动检测实现类。

  8. @Repository: 表示被注解的类是一个“存储库”。该注解是@Component的特化版本,建议与DAO类一起使用。

  9. @Autowired:用于自动注入Bean。Spring的@Autowired注解与@Qualifier注解一起使用,以避免在同一类型有两个或更多配置的Bean时产生混淆。

Spring MVC注解

一些重要的Spring MVC注解包括:

  1. @Controller
  2. @RequestMapping
  3. @PathVariable
  4. @RequestParam
  5. @ModelAttribute
  6. @RequestBody@ResponseBody
  7. @RequestHeader@ResponseHeader

您可以在Spring MVC教程中了解更多信息。

Spring事务管理注解

@Transactional是Spring的声明式事务管理注解,请在Spring MVC Hibernate中阅读更多内容。

Spring安全性注解

@EnableWebSecurity 用於 @Configuration 類別,以定義 Spring Security 的配置,詳情請參閱 Spring Security 範例

Spring Boot 註解

  1. @SpringBootApplication
  2. @EnableAutoConfiguration

詳情請參閱 Spring Boot 範例

Spring 註解範例

讓我們來看一個簡單的範例,我們將在應用程式中使用 Spring 註解。下面的圖片說明了我的 Spring 註解範例專案。

Spring Framework 依賴

I have created the maven project and added Spring Core Framework dependencies.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.spring</groupId>
	<artifactId>spring-annotations</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring Annotations</name>

	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>

	</dependencies>

</project>

這將拉取我們專案所需的所有 spring core jar 檔案。

元件類別

下一步是创建组件类。这里我模拟了多个数据库组件,一个是MySQL,另一个是Oracle。

package com.journaldev.drivers;

public interface DataBaseDriver {
    public String getInfo();
}

DataBaseDriver是我们将实现的基础接口

package com.journaldev.drivers;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:mysqldatabase.properties")
public class MySqlDriver implements DataBaseDriver {

    @Value("${databaseName}")
    private String databaseName;
    @Value("${disableStatementPooling}")
    private String disableStatementPooling;

    public String getInfo() {
        return "[ Driver: mySql" +
                ", databaseName: " + databaseName +
                ", disableStatementPooling: " + disableStatementPooling +
                " ]";
    }
}

请注意使用@Component注解来指示Spring框架将此类视为组件。我们还使用@PropertySource@Value注解,在运行时,Spring将使用这些注解从指定的属性文件中注入和设置这些变量的值。以下是在mysqldatabase.properties文件中声明的属性。

databaseName=school
disableStatementPooling=true
package com.journaldev.drivers;

public class OracleDriver implements DataBaseDriver {

    protected String url;
    protected String user;
    protected String password;
    protected String driver;
    protected Integer port;


    public String getUrl() {
        return url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getInfo() {
        return "[ Driver: Oracle" +
                ", url: " + url +
                ", port; " + port +
                ", user: " + user +
                ", password: " + password  +
                ", driver: " + driver +
                " ] ";
    }
}

OracleDriver是一个简单的bean,我们将使用服务类向该bean注入属性。

Spring服务类

package com.journaldev.service;

import com.journaldev.drivers.DataBaseDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    @Qualifier("oracleDriver")
    private DataBaseDriver dataBaseDriver;

    public String getDriverInfo(){
        return dataBaseDriver.getInfo();
    }
}

在这里,我们使用@Service注解来指示Spring框架将其视为服务类。然后,我们使用@Autowired@Qualifier("oracleDriver")注解告诉Spring框架将名为oracleDriver的bean注入到类属性dataBaseDriver中。请注意,我们尚未创建此Spring bean。

Spring Bean

最后一步是创建我们的Spring bean和配置类,将所有组件连接在一起。

package com.journaldev.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.drivers.MySqlDriver;
import com.journaldev.drivers.OracleDriver;

@Configuration
@ComponentScan("com.journaldev")
@PropertySource("classpath:oracledatabase.properties")
public class AppConfig {

	@Autowired
        Environment environment;
	
	@Bean
	DataBaseDriver oracleDriver() {
        OracleDriver oracleDriver = new OracleDriver();
	oracleDriver.setDriver(environment.getProperty("db.driver"));
        oracleDriver.setUrl(environment.getProperty("db.url"));
        oracleDriver.setPort(Integer.parseInt(environment.getProperty("db.port")));
        oracleDriver.setUser(environment.getProperty("db.user"));
        oracleDriver.setPassword(environment.getProperty("db.password"));

        return oracleDriver;

	}

	@Bean
	DataBaseDriver mysqlDriver() {
		return new MySqlDriver();
	}
}

请注意oracleDriver的bean定义。在此方法中,我们正在从Spring框架设置的environment变量中读取oracledatabase.properties文件中的属性。以下是在oracledatabase.properties文件中定义的属性。

db.url=localhost
db.port=4444
db.user=vasiliy
db.password=yilisav
db.driver=driver_name

我們的Spring註釋示例項目已經準備好進行測試。總結一下,我們執行了以下步驟:

  1. 創建Maven項目並添加所需的Spring依賴。
  2. 創建組件類並將屬性從資源文件注入到變量中。
  3. 如果我們有第三方組件,我們可以使用Service類將依賴項注入其中。就像我們通過UserService類對OracleDriver進行的那樣。
  4. 最後,我們創建了Configuration類來定義Spring bean並設置基礎包以掃描Spring組件類並對其進行配置。

Spring註釋示例測試

這是我們用於測試Spring註釋示例項目的主要類。

package com.journaldev;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import com.journaldev.config.AppConfig;
import com.journaldev.drivers.DataBaseDriver;
import com.journaldev.service.UserService;

public class Main {
	public static void main(String[] args) {
	AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);

	DataBaseDriver oracle = appContext.getBean("oracleDriver", DataBaseDriver.class);
	DataBaseDriver mysql = appContext.getBean("mysqlDriver", DataBaseDriver.class);
		
        System.out.println("Oracle driver info:");
        System.out.println(oracle.getInfo());
        
        System.out.println("MySQL driver info:");
        System.out.println(mysql.getInfo());

        System.out.println("UserService Information");
	UserService userService = appContext.getBean(UserService.class);
	System.out.println(userService.getDriverInfo());

	appContext.close();
	}
}

下面的圖片顯示了輸出結果。請注意,我們沒有配置任何日誌框架,因此所有Spring框架的日誌都以紅色打印到控制台中。這就是關於Spring註釋的簡要介紹。我在這裡列出了大部分重要的註釋,但還有很多其他用於特定任務的註釋。您可以從下面的鏈接下載我的Spring註釋示例項目。

下載 Spring 注解範例專案

參考: API 文件

Source:
https://www.digitalocean.com/community/tutorials/spring-annotations