在了解注解之前,首先需要明白什么是Bean:
凡是子类及带有方法或属性的类,都要加注册Bean到Spring Ioc的注解,如@Component、@Repository、@Controller、@Service
在Spring中,标识一个@符号,Spring就会从表示区域拿到一个Bean或者注册一个Bean。
Bean的格式
<bean id="userServiceImpl" class="cn.com.bochy.service.impl.UserServiceImpl" autowire="byName"></bean>
<bean id="userDao" class="cn.com.bochy.dao.impl.UserDaoImpl"> </bean>
<!--代码autowire="byName"意思是通过id="userDao"来查找Bean中的userDao对象-->
<!--byType则表示通过class来找Bean中的对象-->
注解分为两类
- 一类是使用Bean,即把已经在xml中配置好的Bean拿来使用(@Autowired,@Resource可以通过byTYPE、byNAME来获取Bean)
- 一类是注册Bean,@Controller、@Service,这些注解都是把标注的实例化对象转化成一个Bean,放在IoC容器中,等要用到时候和上面的@Autowired,@Resource配合然后组装起来
@Autowired和@Resource的区别:
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的;
- @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入;
byType和byName的区别
byName
就是通过Bean的id或者name,byType
就是按Bean的Class的类型。
@Autowired
private UserService userService;
//默认先通过byType找IOC匹配,找不到UserService.class再通过byName匹配,找不到userService就报错
//@Resource默认先byName
- 容易出现的问题及解决方案
class UserServiceImpl_1 implements UserService{}
class UserServiceImpl_2 implements UserService{}
@Autowired
private UserService userService;
@Resource
private UserService userService;
//这样定义两种注解都报错,不管是byName还是byType在IOC中都找不到对应的Bean
//解决方案:使用@Qualifiter注解改变变量id匹配Bean
@Autowired
@Qualifiter(value="userServiceImpl1")
private UserService userService;
- @Resource还有两个属性
@Resource //正常情况
@Resource(name = " ") //只匹配id,IOC中找不到id报错
@Resource(Type = " ") //只匹配类
@Resource(name=" " ,Type=" ") //全部匹配才通过