2023年Spring注解完全指南:常用注解详解与实战应用

这是文章《Spring注解》的第1部分(共3部分)。

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定义和服务请求。

@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("关闭所有程序");
    }
}

@PreDestroy@PostConstruct是bean initMethod和destroyMethod的替代方式。当我们定义bean类时,可以使用它们。例如:

public class Computer {

    @PostConstruct
    public void turnOn(){
        System.out.println("加载操作系统");
    }

    @PreDestroy
    public void turnOff(){
        System.out.println("关闭所有程序");
    }
}

@ComponentScan:为@Configuration类配置组件扫描指令。在这里,我们可以指定扫描Spring组件的基本包。

@Component:表示一个带注解的类是一个”组件”。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选项。

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

@Service:指示一个带注解的类是一个”服务”。这个注解是@Component的一个特例,允许通过类路径扫描自动检测实现类。

@Repository:指示一个带注解的类是一个”存储库”。这个注解是@Component的一个特例,并建议与DAO类一起使用。

@Autowired:Spring的@Autowired注解用于自动注入bean。Spring的@Qualifier注解与@Autowired一起使用,以避免在为同一类型配置了两个或更多个bean时造成混淆。

Spring MVC 注解

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

  • @Controller – 控制器
  • @RequestMapping – 请求映射
  • @PathVariable – 路径变量
  • @RequestParam – 请求参数
  • @ModelAttribute – 模型属性
  • @RequestBody@ResponseBody – 请求体和响应体
  • @RequestHeader@ResponseHeader – 请求头和响应头

你可以在Spring MVC教程中更多地了解它们。

Spring事务管理注解

@Transactional是Spring声明式事务管理的注解,在Spring MVC Hibernate上可以获取更多信息。

Spring Security 注解

@EnableWebSecurity和@Configuration类一起使用,以定义Spring Security配置,在Spring Security示例中可以阅读更多内容。

Spring Boot注解

  • @SpringBootApplication
  • @EnableAutoConfiguration

请在 Spring Boot 示例中阅读更多内容。

Spring注解示例

spring annotations

Spring框架的依赖关系

我已经创建了Maven项目并添加了Spring核心框架的依赖。

<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.Olivia.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核心jar包。

组件类别

这是文章《Spring注解》的第2部分(共3部分)。

下一步是创建组件类。在这里,我正在模仿多个数据库组件,一个是用于MySQL,另一个是用于Oracle。

package com.Olivia.drivers;

public interface DataBaseDriver {
    public String getInfo();
}

我们将实现的基本接口是 DataBaseDriver。

package com.Olivia.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.Olivia.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,我们将使用service类将属性注入到这个bean中。

Spring服务类

package com.Olivia.service;

import com.Olivia.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注解》的第3部分(共3部分)。

最后一步是创建我们的Spring Bean和配置类,将所有内容联系起来。

package com.Olivia.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.Olivia.drivers.DataBaseDriver;
import com.Olivia.drivers.MySqlDriver;
import com.Olivia.drivers.OracleDriver;

@Configuration
@ComponentScan("com.Olivia")
@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框架设置为环境变量的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. 最后,我们创建了配置类来定义SpringBean,并设置基础包以扫描Spring组件类并对其进行配置。

Spring注解示例测试

这是我们的主类,用于测试我们的Spring注解示例项目。

package com.Olivia;

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

import com.Olivia.config.AppConfig;
import com.Olivia.drivers.DataBaseDriver;
import com.Olivia.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 annotations example

下载Spring注解示例项目

参考资料:API文档

bannerAds