1.@Service @Controller @Repository这三个注解从源码上看其实都是@Component 实现的,所以本质上这三个没有什么区别。
通常地,@Service @Controller @Repository是为了给不同的类打上不同的标志来区别开各个类的作用是什么,
@Service表明是一个服务
@Controller表明是一个控制器
@Repository表明是一个仓储,说明是数据库访问模型
如果该类没有明确定义是服务、控制器、仓储,可以用@Component标明
2.@Lazy延迟实例化
@Lazy只有在该实例被用到的时候才会被实例化
@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间
当出现循环依赖时,也可以添加@Lazy
需要注意的是@Lazy的延迟加载机制和依赖有关,如果没有将相关依赖也加入@Lazy,对象仍然会被立即加载
3.@Autowired
首先spring是一个约定大于配置的框架,变量的名字对于注入的对象是有影响的,如下图
其次需要注意的是接口不可以用@Component,也没有意义,提到的bean都是具体的class类
- @Autowired优先按bytype查找并实例化,没有找到任何一个bean,会报错
- 按bytype找到多个,会按byname找,如果仍没找到,会报错(byname查找方式可以用@Qualifier,@Qualifier声明的byname变量优先级最高)
- 在成员变量注入和setter注入的时候必须加上@Autowired,在构造器注入的时候可以不加,直接按原来的方式写构造器把实例当参数传进去即可,spring官方推荐构造函数注入或setter注入,因为两种是对public做注入
4.@Configuration
是在spring3.0里加入的新特性,通常在写框架的时候被用到,是配置类注解,用来解决变化的问题,很重要
其中的@Bean可以将没有被声明注入的bean强行加入ioc容器中去,代码说的是将Camille类作为ISkill的实现类加入到了容器中
@Configuration具体用途:
如上图所示,name和age是不能被动态赋值的,只有通过配置类才行
@Configuration主要是用来取代xml配置方式的
更灵活地,可以用下面的方式来配置:
配置类注解主要解决:
1.成员变量的变化
2.接口实现类的变化
@Configuration本质上是基于ocp的一种编程模式,旨在把变化隔离开,统一管理