Spring纯注解开发

在我的另一篇文章中(初识Spring-CSDN博客),讲述了Bean,以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。

我们在创建具体的类的时候,可以直接在类的上面标明“注解”,以此来声明类。

1. 常用的Spring注解

Spring提供了多种注解来声明和管理Bean。以下是一些常用的注解:

  • @Component:通用注解,用于标记一个类为Spring的组件,表示该类是一个Bean。
  • @Controller:用于标记控制器类,通常用于Spring MVC中。
  • @Service:用于标记服务层类,表示该类是业务逻辑的实现。
  • @Repository:用于标记数据访问层类,通常用于DAO(数据访问对象)实现。
  • @Autowired:用于自动装配Bean,Spring会自动寻找匹配的Bean并注入到目标类中。
  • @Qualifier:当有多个匹配的Bean时,用于指定具体的Bean。
  • @Value:用于注入配置文件中的属性值。

2. 使用注解声明Bean

在使用注解声明Bean之前,首先需要在Spring配置文件中启用注解支持。通常可以通过以下方式实现:

<context:component-scan base-package="com.example"/>

上述配置表示Spring会扫描com.example包及其子包下的所有类,并根据注解将这些类注册为Spring的Bean。

3. 示例代码

假设我们有一个服务类UserService,我们希望将其声明为一个Spring的Bean。可以通过以下方式实现:

package com.example.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void doSomething() {
        System.out.println("UserService is doing something!");
    }
}

在上述代码中,我们使用了@Service注解来声明UserService类为一个Bean。这样,Spring在启动时会自动扫描并注册这个Bean。

4. 自动装配Bean

假设我们有一个控制器类UserController,我们希望在其中自动装配UserService。可以通过以下方式实现:

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    public void handleRequest() {
        userService.doSomething();
    }
}

在上述代码中,我们使用了@Autowired注解来实现自动装配。这样,Spring会自动将UserService的实例注入到UserController中。

在Spring中,通过注解定义Bean时,默认情况下Bean的ID是根据类名自动生成的,通常是将类名的首字母小写作为Bean的ID。然而,在某些场景下,我们可能需要显式地指定Bean的ID,以便更好地管理和引用这些Bean。Spring提供了@Component@Service@Repository@Controller等注解的属性来实现这一点。

5. 使用注解指定Bean的ID

使用@Component注解

@Component注解有一个属性value,可以用来指定Bean的ID。例如:

import org.springframework.stereotype.Component;

@Component("customBeanId")
public class MyComponent {
    public void doSomething() {
        System.out.println("MyComponent is doing something!");
    }
}

在上面的代码中,MyComponent类的Bean ID被显式地指定为customBeanId

使用@Service@Repository@Controller注解

这些注解实际上是@Component的特化版本,因此它们也支持通过value属性来指定Bean的ID。例如:

import org.springframework.stereotype.Service;

@Service("customServiceId")
public class MyService {
    public void doSomething() {
        System.out.println("MyService is doing something!");
    }
}

import org.springframework.stereotype.Repository;

@Repository("customRepositoryId")
public class MyRepository {
    // 数据访问逻辑
}

import org.springframework.stereotype.Controller;

@Controller("customControllerId")
public class MyController {
    // 控制器逻辑
}

6.配置类的引入

注意:虽然我们上面已经用注解简化了对Bean的管理。但是我们还有一个xml配置文件,这样注解里面夹杂这xml让人很不舒服。因此,我们可以引入配置类。

在Spring应用中,使用注解来管理Bean确实可以简化配置,但仍然保留XML配置文件可能会让整个配置显得杂乱无章。为了进一步简化配置,Spring引入了配置类(Configuration Class)的概念。配置类允许我们使用Java代码来定义和管理Bean,从而完全摆脱XML配置文件的束缚。

6.1. 使用配置类管理Bean

配置类是一个普通的Java类,通过使用@Configuration注解来标识。这个类中的方法可以使用@Bean注解来定义Bean,方法的返回值就是Bean的实例。

假设我们有一个UserService类,我们希望将其定义为一个Bean。可以通过配置类来实现:

package com.example.config;

import com.example.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService();
    }
}

在上面的代码中,AppConfig类被标记为配置类(@Configuration),userService方法上使用了@Bean注解,表示这个方法返回的UserService实例是一个Spring Bean。

6.2. 使用配置类替换XML配置

通过配置类,我们可以完全替代XML配置文件。为了使用配置类,我们不再需要<context:component-scan>标签,而是直接在Spring应用的启动类(通常是主类)上使用@ComponentScan注解来指定扫描的包。

假设我们有一个Spring Boot应用,启动类如下:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在上述代码中,@SpringBootApplication注解包含了@Configuration@EnableAutoConfiguration@ComponentScan注解的功能,因此我们不再需要显式地使用@Configuration@ComponentScan

扫描多个包的配置类示例

假设我们有三个包需要扫描:com.example.servicecom.example.repositorycom.example.controller,我们可以在配置类中这样配置:

package com.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {"com.example.service", "com.example.repository", "com.example.controller"})
public class SpringConfig {
}
6.3. 在配置类中自动装配Bean

在配置类中,我们同样可以使用@Autowired注解来自动装配Bean。例如,假设我们有一个UserRepository类,我们希望在UserService中使用它:

package com.example.service;

import com.example.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;

public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void doSomething() {
        userRepository.doSomething();
        System.out.println("UserService is doing something!");
    }
}

配置类AppConfig可以调整为如下:

package com.example.config;

import com.example.repository.UserRepository;
import com.example.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }

    @Bean
    public UserService userService(UserRepository userRepository) {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository); // 手动装配
        return userService;
    }
}

注意,我们有以下结构:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤&#xff1a; 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 &#xff0c;用于制作U盘启动 下载一个引导程序制作工具&#xff0c;我使用…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后&#xff0c;下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后&#xff0c;打开点击右键&#xff…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下&#xff0c;防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所&#xff0c;例如医院、学校、公共交通工具等地&#xff0c;口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…

STM32保护内部FLASH

在实际发布的产品中&#xff0c;在STM32芯片的内部FLASH存储了控制程序&#xff0c;如果不作任何保护措施的话&#xff0c;可以使用下载器直接把内部FLASH的内容读取回来&#xff0c;得到bin或hex文件格式的代码拷贝&#xff0c;别有用心的厂商即可利用该代码文件山寨产品。为此…

前端 - 使用uniapp+vue搭建前端项目(app端)

文章目录 前提概要项目搭建1、打开HBuilder工具&#xff0c;选择文件->新建->项目2、下载依赖&#xff0c;需要先手动创建package.json文件&#xff0c;在自定义文件的最外层3、创建文件夹4、创建忽略文件 .gitignore5、创建vue.config.js文件 &#xff0c;解决跨域问题&…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…

飞创直线电机模组 VS 传统丝杆模组:谁是自动化传动领域的王者?

在现代自动化技术领域&#xff0c;直线电机模组与传统丝杆模组作为两种常见的传动方式&#xff0c;各自有独特的特点和优势。然而&#xff0c;随着科学的不断进步和应用需求的日益提高&#xff0c;两者在精度、速度、寿命及可拓展性方面的差异愈发显著。本文将重点对比飞创直线…

第二十一周学习周报

目录 摘要Abstract1. LSTM原理2. LSTM反向传播的数学推导3. LSTM模型训练实战总结 摘要 本周的学习内容是对LSTM相关内容的复习&#xff0c;LSTM被设计用来解决标准RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制来控制信息的流动&#xff0c;从而…

《鸿蒙生态:开发者的机遇与挑战》

一、引言 在当今科技飞速发展的时代&#xff0c;操作系统作为连接硬件与软件的核心枢纽&#xff0c;其重要性不言而喻。鸿蒙系统的出现&#xff0c;为开发者带来了新的机遇与挑战。本文将从开发者的角度出发&#xff0c;阐述对鸿蒙生态的认知和了解&#xff0c;分析鸿蒙生态的…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了快速的搜索能力&#xff0c;支持大规模的数据分析&#xff0c;广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建&#xff0c;也就…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后&#xff0c;app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

Visual Studio 2022 安装

下载链接 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&channelRelease&versionVS2022&sourceVSLandingPage&cid2030&passivefalse 安装 以c为例&#xff0c;列出需要勾选的项目&#xff0c;有3个&a…

文件 fd

&#x1f3f7;️ 预备工作 ❓ 当我们在系统中创建一个空文件时&#xff0c;这个文件要不要占据磁盘的空间&#xff08;注意是空文件哟&#xff09; 答案&#xff1a;当然是要占据磁盘的空间的&#xff0c;文件不仅只包括内容&#xff0c;还有它的属性呀&#xff0c;就是创建时…

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…

RHCSA学习超详细知识点2命令篇

输入命令行的语法 终端中执行命令需要遵照一定的语法&#xff0c;输入命令的格式如下&#xff1a; 命令 参数命令 -选项 参数 输入命令时可以包含多个选项&#xff0c;假如一个命令有-a,-b,-c,-d四个选项&#xff0c;可以写作 命令 -a -b -c -d 参数 这里的多个选项可以“提…

3步实现贪吃蛇

方法很简单&#xff0c;打开页面&#xff0c;复制&#xff0c;粘贴 一.整体思维架构 我们根据游戏的开始&#xff0c;运行&#xff0c;结束&#xff0c;将整个游戏划分成三个部分。在每个部分下面又划分出多个功能&#xff0c;接下来我们就根据模块一一实现功能。 二.Gamesta…

风电电力系统低碳调度论文阅读第一期

在碳交易市场中&#xff0c;历史法和基准线法是用于分配碳排放配额的两种主要方法。以下是两种方法的公式及其解释&#xff1a; 区别总结 历史法&#xff1a;基于历史排放量&#xff0c;分配具有较强的公平性但可能缺乏激励减排。基准线法&#xff1a;基于行业基准和生产量&am…

Mybatis-Plus 多租户插件属性自动赋值

文章目录 1、Mybatis-Plus 多租户插件1.1、属性介绍1.2、使用多租户插件mavenymlThreadLocalUtil实现 定义,注入租户处理器插件测试domianservice & ServiceImplmapper 测试mapper.xml 方式 1.3、不使用多租户插件 2、实体对象的属性自动赋值使用1. 定义实体类2. 实现 Meta…