【注解】@Component,@Repository、@Service、 @Controller,@Autowird 常用注解

【注解】@Component,@Repository、@Service、 @Controller,@Autowird 常用注解

  • @Component:

    作用: 用于标识一个类为 Spring 组件,将其纳入 Spring IoC 容器中管理。

  • @Service:

    作用: 通常作为 @Component 的特例,用于标识一个类为业务层服务组件。

  • @Autowired:

    作用: 用于自动装配(注入) Spring 容器中的 Bean,通过类型匹配进行注入。

在Spring框架中,@Component、@Service、和@Autowired是非常常用的注解,它们是Spring实现依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)的核心工具之一。下面是对这些注解的详细解释:

一、@Component

@Component 是一个通用的构造型注解,用于标注一个类作为Spring容器管理的Bean。它表明一个类将被Spring进行实例化,配置和装配。尽管 @Component 本身足够通用,但Spring也提供了几个特殊化的版本来处理不同类型的类,例如 @Repository@Service、和 @Controller,这些都是@Component的具体化形式,用于标注不同类型的Bean,从而达到更加语义化。

1、@Repository

  • 描述:@Repository 是 @Component的一种特殊化形式,用于标注数据访问层(DAO)的组件。它通常用于标识访问数据库或其他数据存储的类,包括对数据库的增删改查操作。

  • 区别:@Repository主要用于标注数据访问层的Bean,与@Service和@Controller的区别在于它的职责更加专注于数据访问和持久化操作。

  • 使用场景:适用于标识DAO层的类,负责数据库操作和数据持久化的逻辑。

  • 注意事项:确保使用@Repository注解的类具有良好的异常处理和事务管理,以保证数据访问操作的安全性和一致性。

2、@Service

  • 描述:@Service是@Component的一种特殊化形式,用于标注服务层(业务层)的组件。它通常包含业务逻辑的实现,处理业务逻辑、事务管理、数据校验等功能。
  • 区别:@Service主要用于标注服务层的Bean,负责实现业务逻辑,与@Repository和@Controller的区别在于它更加专注于业务逻辑的处理。
  • 使用场景:适用于标识服务层的类,负责实现业务逻辑,如用户管理、订单处理、支付逻辑等。
  • 注意事项:确保使用@Service注解的类具有良好的业务逻辑划分,避免将过多的业务逻辑放在一个类中,保持类的单一职责。

3、@Controller

  • 描述:@Controller是@Component的一种特殊化形式,用于标注控制器层的组件。它通常处理用户请求,调用相应的服务层方法,并返回视图或数据给前端。
  • 区别:@Controller主要用于标注控制器层的Bean,负责接收和处理用户请求,与@Repository和@Service的区别在于它更加专注于处理请求和返回响应。
  • 使用场景:适用于标识控制器层的类,负责处理用户请求和调用服务层方法,如Web应用中的Controller类。
  • 注意事项:确保使用@Controller注解的类能够正确地处理用户请求,并与视图层交互,保持代码清晰和可维护性。

二、@Autowired

2.1、简介

@Autowired 注解用于自动装配 Spring 容器中的Bean。通过将@Autowired放在类的字段、构造函数、或者方法上,Spring将自动寻找并注入匹配类型的Bean到被标注的元素上。@Autowired可以减少配置的复杂性,使得开发者不需要手动编写大量的配置代码来实现Bean之间的依赖关系。@Autowired默认按类型进行自动装配,如果需要按名称装配,可以结合@Qualifier注解使用。

  • 字段注入:将@Autowired放在字段上,Spring会在创建Bean时自动注入对应的依赖。
  • 构造器注入:将@Autowired放在构造器上,Spring会使用匹配的Bean作为参数来实例化对象。从Spring 4.3开始,如果目标Bean只有一个构造器,那么即使没有@Autowired注解,Spring也会尝试使用该构造器进行自动装配。
  • 方法注入:将@Autowired放在方法上,Spring会在Bean的实例化过程中调用该方法,方法参数的值会从Spring容器中自动装配。

使用这些注解能够使得Spring应用的开发更加简洁,减少了配置的复杂性,同时也提高了代码的可读性和可维护性。在使用这些注解时,需要确保你的项目已经配置了Spring,且相应的类被Spring管理。

2.2、代码示例

@Service
public class AaaService implements IChangePassword {
 
    @Override
    public void changePassword(String username, String password) {
    }
 
}
 
@Service
public class BbbService implements IChangePassword {
 
    @Override
    public void changePassword(String username, String password) {
    }
 
}
 
public class AccountController extends BaseController {
    @Autowired
    @Qualifier("aaaService")
    private IChangePassword aaaService;
 
        @Autowired
    @Qualifier("bbbService")
    private IChangePassword bbbService;
}

常用注解持续更新,动动小手点点关注,后续更精彩哦~

2.3、报错

IntelliJ IDEA使用 @AutoWired 注解出现 Could not autowire. No beans of 'xxxx' type found 的错误提示.
代码下有一个红线,但是运行又不回报错,不影响运行。但是这个红线提醒让人不舒服。在IDEA中报了红线警告,说找不到这个实现类,所以这是Intellij IDEA 本身工具的问题。IDEA 可以理解 Spring 的上下文,但使用@Autowired注入的Mapper接口是 MyBatis 的接口,所以IDEA不认识,就无法识别。
在这里插入图片描述
有以下几种解决办法:

  • (1)在注解上加上@Autowired(required = false),用于告诉Spring容器在自动装配Bean时,如果找不到匹配的Bean,不会抛出异常,而是会将该字段设为null。这个注解通常用于可选依赖项,即如果依赖项存在,则自动装配,否则不装配,不会导致应用程序无法启动。
  • (2)使用 @Resource 替换 @Autowired,@Resource 注解是Java EE 提供的一个注解,用于自动装配 Bean。@Resource 注解有以下几个特点以及与 @Autowired 的区别 :
    • 按名称装配:@Resource 注解默认按照 Bean 的名称进行装配,也可以通过 name 属性指定具体的 Bean 名称。而 @Autowired 注解默认按照类型进行装配,可以通过 @Qualifier 注解指定名称。
    • JDK标准:@Resource 注解是Java EE 的一部分,属于JDK标准,而 @Autowired 注解是Spring框架提供的。
    • 支持可选装配:与 @Autowired(required = false) 类似,@Resource 注解也支持可选装配,即如果找不到匹配的 Bean,不会抛出异常,而是将字段设为 null。
  • (3)在 MyBatis 接口上加上 @Repository 注解
  • (4)使用 Lombok,@RequireArgsContructor
  • (5)降低 Autowired 检测的级别,将 Severity 的级别由之前的 error 改成 warning 或其它可以忽略的级别。
  • (6)安装 MyBatis 插件
  • (7)使用构造器注入
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值