【注解】@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)使用构造器注入