使用注解加入到容器中的组件,和使用配置加入到容器中的组件行为都是默认的一样的。
1、使用注解标识组件:
①普通组件:@Component
标识一个受Spring IOC容器管理的组件
②持久化层组件:@Respository
标识一个受Spring IOC容器管理的持久化层组件
③业务逻辑层组件:@Service
标识一个受Spring IOC容器管理的业务逻辑层组件
④表述层控制器组件:@Controller
标识一个受Spring IOC容器管理的表述层控制器组件
⑤组件命名规则
[1]默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
[2]使用组件注解的value属性指定bean的id
注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。
2、组件的id默认就是组件的类名首字母小写,可以进行修改
@Repository("bookdaoHaha)
public class bookDao(){}
3、组件的作用域:默认就是单例的,可以进行修改
@Scope(value = "prototype")
@Autowired原理:默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配★
@Autowired
private BookService bookService;
1)先按类型去容器中找到对应的组件:bookService = ioc.getBean(“BookService.class”);
1)找到一个:找到就赋值
2)没有找到:抛异常
3)找到多个?装配上?
1)按照变量名作为id继续匹配;BookService(bookService)、BookServiceExt(bookServiceExt)
@Autowired
private BookService bookServiceExt2;
1)匹配上:装配
2)没有匹配上?报错
原因:因为我们按照变量名作为id进行匹配的
使用@Qualifier("bookServiceExt")指定一个新的字符串作为id
1)找到:装配
2)找不到:报错;
发现Autowired标注的自动装配的默认属性是一定装配上的,找不到就报错;这个时候可以修改required属性, 找到就装配,找不到就拉倒 @Autowired(required=false)这样子不会报錯了
面试题:@Autowired @Resource @Inject区别和联系
@Autowired @Resource @Inject; 都是自动装配的意思
@Autowired:最强大:Spring自己的注解
@Resource: j2ee中的,java的标准
@Resource:扩展性更强;因为是java的标准 若切换成另外一个容器框架(所幸整个容器框架抛开EJB不说,容器框架只有SPring一家,没有别家在做这个事),@Resource还是可以使用的,@Autowired就不行了
@Inject:
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。