在Spring框架中,`@Resource`和`@Autowired`是两个常用的注解,用于实现依赖注入。尽管它们的功能相似,但它们之间有一些关键的区别。
Spring 提供了以下多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。
注解 | 说明 |
---|---|
@Component | 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。 |
@Repository | 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Service | 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
我们对这些Bean的注入一般用`@Resource`和`@Autowired`进行注入
@Resource:可以用在属性和setter方法上。
@Autowired:可以用在属性、setter方法、构造方法和构造方法参数上。
- 对于JDK 8,不需要额外引入依赖。
- 对于JDK 11或低于JDK 8,需要引入`jakarta.annotation-api`依赖。
@Repository("myUserDao")
public class UserDaoImpl implements UserDao {
// ...
}
@Service
public class UserServiceImpl implements UserService {
@Resource(name = "myUserDao")
private UserDao myUserDao;
// ...
}
在这个场景中,我们通过指定名称`myUserDao`来进行注入。
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao myUserDao;
// ...
}
当`@Resource`注解没有指定名称时,它会使用属性名`myUserDao`作为Bean的名称进行注入。
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao1;
// ...
}
如果没有指定名称,并且根据属性名`userDao1`找不到对应的Bean,`@Resource`会尝试通过类型进行注入。如果存在多个相同类型的Bean,这可能会导致异常。
@Resource注解默认先尝试通过名称进行注入,如果找不到对应的名称,则通过类型进行注入。但是,当通过类型注入时,要求该类型的Bean在容器中必须是唯一的。`@Autowired`注解则默认通过类型进行注入,如果需要通过名称注入,则需要与@Qualifier注解配合使用。了解这些区别,可以帮助我们更准确地选择合适的注解来实现依赖注入。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。