Spring常用注解
@component和@service
在Spring框架中,@Component和@Service都是用来将一个Java类标记为Spring容器中的一个组件。不过,在实际开发中,@Service通常用于标记业务层的Bean,而@Component则更为通用,可以用于标记任意层的Bean。
具体而言,@Component表示通用的组件,可以用在任何层次。它是一个比较抽象的概念,可以用于标记任何需要被Spring容器管理的组件类。而@Service则表示服务层组件,用于标记服务层(业务层)的Bean。所以,@Service通常和@Repository(用于标记DAO层数据访问对象)一起使用,一起组成完整的MVC架构中的三层结构。
@resource和@autowird
在Spring框架中,@Resource和@Autowired都可以用于将一个Bean注入到另一个Bean中,不过它们有一些区别。
@Resource
@Resource是Java标准注解,也被Spring框架支持,可以用来注入其他Bean,它是按照名称
进行自动装配的。它提供了两个属性:name和type。
当使用name属性时,它会按照指定的名称查找对应的Bean进行注入;当使用type属性时,它会按照指定的类型查找对应的Bean进行注入。
@Service("userService")
当@Resource注解需要装配的Bean在容器中有多个与之对应的Bean名称时,会抛出NoSuchBeanDefinitionException异常。
例如,假设有两个实现UserService接口的类:
@Service("userService1")
public class UserServiceImpl1 implements UserService {
}@Service("userService2")
public class UserServiceImpl2 implements UserService {
}
在另一个需要依赖一个UserService的类中,如果使用@Resource注解进行注入:
@Service
public class SomeServiceImpl implements SomeService {@Resourceprivate UserService userService;
}
在尝试装配UserService时,由于容器中存在多个与之对应的Bean名称,会抛出NoSuchBeanDefinitionException异常。此时,我们需要使用@Qualifier注解或者在@Bean注解中指定Bean名称来解决装配冲突。
- 使用@Qualifier注解指定具体的Bean名称:
@Service
public class SomeServiceImpl implements SomeService {@Resource@Qualifier("userService1")private UserService userService;
}
或
@Service
public class SomeServiceImpl implements SomeService {@Resource(name="userService")private UserService userService;
}
- 在@Bean注解中指定Bean名称:
@Configuration
public class AppConfig {@Bean(name="userService")public UserService userService() {return new UserServiceImpl1();}@Bean(name="anotherUserService")public UserService anotherUserService() {return new UserServiceImpl2();}
}
@Autowired
@Autowired是Spring框架特有的注解,也是按照类型
进行自动装配的。它默认按照类型查找对应的Bean,并将它注入到需要依赖的Bean中。如果有多个同一类型的Bean存在,它还可以使用Qualifier注解指定需要注入的Bean名称。
更具体地说,当一个Bean中出现了@Autowired注解,容器会自动完成以下步骤:
- 搜索容器中所有匹配于指定类型的Bean;
- 如果只找到一个与指定类型匹配的Bean,则将此Bean自动注入到当前需要的Bean中;
- 如果找到多个与指定类型匹配的Bean,则从中选择一个合适的Bean自动注入。
同样,当@Autowired注解需要装配的Bean在容器中有多个与之对应的Bean类型时,Spring会尝试按类型进行自动装配。如果根据类型无法确定要装配哪个Bean时,会抛出NoUniqueBeanDefinitionException异常。此时,我们需要使用@Qualifier注解或者在@Bean注解中指定Bean名称来解决装配冲突。
区别
与@Resource不同,@Autowired是Spring框架特有的注解,而且它可以使用更加灵活的方式进行关联。@Autowired是按照类型进行自动装配的,可以与Qualifier注解一起使用进行名称匹配,并且它支持@Primary注解,用于指定默认的Bean。此外,@Autowired注解还支持使用构造函数注入、Setter方法注入、成员变量注入等不同的方式。
而@Resource则是Java标准注解,虽然它也可以进行自动装配,但只支持按照名称和类型查找Bean,并且它没有像@Autowired那样支持更加灵活的@Autowired注释组合操作。