侧边栏壁纸
博主头像
QM博主等级

行动起来,活在当下

  • 累计撰写 13 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Spring Framework 中的注解

wangqm
2025-02-19 / 0 评论 / 0 点赞 / 11 阅读 / 10803 字

Spring Framework 中的注解

Spring Framework 是 Java 开发中广泛使用的开源框架,它通过注解(Annotation)提供了强大的功能,简化了开发流程,提高了代码的可读性和可维护性。本文将详细介绍 Spring Framework 中常见的注解,帮助开发者更好地理解和使用这些注解。

一、Spring Framework 简介

Spring Framework 是一个开源的 Java 应用框架,由 Rod Johnson 创建,旨在简化企业级应用的开发。Spring 提供了全面的基础架构支持,包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)、事务管理、数据访问、Web 开发等功能。

二、Spring Framework 中的注解详解

1. 依赖注入相关注解

(1)@Autowired

@Autowired 注解用于自动注入依赖的 Bean。Spring 会根据类型自动匹配并注入相应的 Bean。例如:

java复制

@Service
public class UserService {

    @Autowired
    private UserRepoistory userRepository;
}

(2)@Qualifier

@Qualifier 注解用于指定具体的 Bean 名称,当有多个相同类型的 Bean 时,可以通过 @Qualifier 指定注入哪一个。例如:

java复制

@Service("specialDao")
public class SpecialDao implements MyDao {}

@Service("defaultDao")
public class DefaultDao implements MyDao {}

@Service
public class MyService {

    private final MyDao myDao;

    @Autowired
    public MyService(@Qualifier("specialDao") MyDao myDao) {
        this.myDao = myDao;
    }
}

(3)@Primary

@Primary 注解用于指定优先注入的 Bean,当有多个相同类型的 Bean 时,带有 @Primary 注解的 Bean 会被优先注入。

(4)@Lazy

@Lazy 注解用于延迟初始化 Bean,直到首次访问该 Bean 时才会进行初始化。例如:

java复制

@Service
@Lazy
public class LazyService {
    // 延迟初始化
}

2. 配置相关注解

(1)@Configuration

@Configuration 注解用于声明一个类为配置类,其中可以包含 @Bean 方法来定义 Bean。例如:

java复制

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUrl("jdbc:hsqldb:hsql://localhost/xdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }
}

(2)@ComponentScan

@ComponentScan 注解用于自动扫描指定包及其子包下的所有带有特定注解的类(如 @Component, @Service, @Repository, @Controller)作为 Spring 的 Bean。例如:

java复制

@Configuration
@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})
public class AppConfig {
}

(3)@Bean

@Bean 注解用于在配置类中定义一个方法,该方法的返回对象将会成为 Spring 容器中的一个 Bean。例如:

java复制

@Bean
public MyService myService() {
    return new MyServiceImpl();
}

3. 事务管理相关注解

(1)@Transactional

@Transactional 注解用于声明式事务管理,可以应用于类级别或方法级别。例如:

java复制

@Service
public class MyService {

    @Transactional(readOnly = true)
    public void readData() {
        // 只读操作
    }

    @Transactional
    public void writeData() {
        // 写操作
    }
}

4. Web 开发相关注解

(1)@Controller

@Controller 注解用于标识一个类为控制器类,处理 Web 请求,返回视图或数据。例如:

java复制

@Controller
@RequestMapping("/users")
public class UserController {

    @GetMapping
    public String getAllUsers(Model model) {
        List<User> users = userRepository.findAll();
        model.addAttribute("users", users);
        return "users/list";
    }
}

(2)@RestController

@RestController 注解是 @Controller@ResponseBody 的组合注解,用于创建 RESTful Web 服务,直接返回数据(如 JSON)。例如:

java复制

@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userRepository.save(user);
        return ResponseEntity.created(URI.create("/api/users/" + savedUser.getId())).body(savedUser);
    }
}

(3)@RequestMapping

@RequestMapping 注解用于将 HTTP 请求映射到具体的处理器方法,支持 GETPOSTPUTDELETE 等请求方法。例如:

java复制

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() {
    return userRepository.findAll();
}

(4)@GetMapping

@GetMapping 注解用于处理 GET 请求,简化了 @RequestMapping(method = RequestMethod.GET) 的写法。例如:

java复制

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("用户不存在"));
}

(5)@PostMapping

@PostMapping 注解用于处理 POST 请求,简化了 @RequestMapping(method = RequestMethod.POST) 的写法。例如:

java复制

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userRepository.save(user);
}

(6)@RequestBody

@RequestBody 注解用于将 HTTP 请求体绑定到方法参数(如 JSON 格式参数对象)。例如:

java复制

@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // 处理用户对象
    return ResponseEntity.ok("User created successfully");
}

(7)@PathVariable

@PathVariable 注解用于从 URL 路径中提取变量值。例如:

java复制

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    // 根据 ID 获取用户
    return ResponseEntity.ok(user);
}

5. 其他功能相关注解

(1)@Value

@Value 注解用于注入配置文件中的属性值或常量。例如:

java复制

@Service
public class ConfigService {

    @Value("${app.name}")
    private String appName;

    @Value("10")
    private int someNumber;

    @Value("#{systemProperties['os.name']}")
    private String osName;
}

(2)@Async

@Async 注解用于异步执行方法,需要在配置类中启用 @EnableAsync。例如:

java复制

@Service
@EnableAsync
public class AsyncService {

    @Async
    public Future<String> doSomethingAsync() throws InterruptedException {
        Thread.sleep(5000);
        return new AsyncResult<>("Done");
    }
}

(3)@Scope

@Scope 注解用于定义 Bean 的作用域,默认情况下,Spring Bean 是单例(Singleton)的。例如:

java复制

@Service
@Scope("prototype")
public class PrototypeService {
    // 此 service 每次都会创建新的实例
}

(4)@PostConstruct 和 @PreDestroy

  • @PostConstruct 注解用于标注在依赖注入完成后需要执行的方法。

  • @PreDestroy 注解用于标注在 Bean 销毁前需要执行的方法。例如:

java复制

@Service
public class LifecycleService {

    @PostConstruct
    public void init() {
        System.out.println("LifecycleService initialized.");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("LifecycleService destroyed.");
    }
}

(5)@Conditional

@Conditional 注解允许根据某些条件来决定是否创建一个 Bean。Spring 提供了多种 @Conditional 的实现,例如:

  • @ConditionalOnClass:仅在类路径中存在指定的类时才创建 Bean。

  • @ConditionalOnMissingClass:仅在类路径中不存在指定的类时才创建 Bean。

  • @ConditionalOnBean:仅在容器中存在指定的 Bean 时才创建 Bean。

  • @ConditionalOnMissingBean:仅在容器中不存在指定的 Bean 时才创建 Bean。

  • @ConditionalOnExpression:根据 SpEL 表达式评估结果来决定是否创建 Bean。

  • @ConditionalOnProperty:根据配置文件中的属性值来决定是否创建 Bean。

  • @ConditionalOnResource:根据资源是否存在来决定是否创建 Bean。

  • @ConditionalOnWebApplication:仅在 Web 应用环境中创建 Bean。

例如:

@Configuration
@ConditionalOnClass(name = "org.springframework.web.client.RestTemplate")
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

三、总结

Spring Framework 的注解为开发者提供了强大的功能,简化了开发流程,提高了代码的可读性和可维护性。通过合理使用这些注解,开发者可以更专注于业务逻辑的实现,从而提高项目的质量和开发速度。希望本文的介绍能够帮助开发者更好地理解和使用 Spring Framework 的注解,提升开发效率。

0

评论区