Spring中有几种依赖注入方式?
1.手动注入-set方法注入和构造器注入
2.自动注入-@Autowired注解和xml注入
autowrire参数:
no | 默认不开启 |
---|---|
byName | 根据被注入属性的名称作为 Bean 名称作为依赖查找,并将对象设置到该属性 |
byType | 根据被注入属性的类型作为依赖类型进行依赖查找,并将该对象设置到该属性 |
constructor | 特殊 byType 类型,用于构造器参数 |
autowrire -->@Autowire在后来升级:
在调用这个xxx方法时会先去根据byType类型找有几个定义属性,有一个属性就可以直接返回值,如果有两个或者,两个以上的属性
就会根据byName的bean属性名去找,如果属性名不一样就不会找到,如果是一个属性就可以根据类型直接找到。举例:
在日常开发中会用@Service直接定义类名,@Service会将类名首字母小写存入ioc容器中,所以一般都是唯一属性,需要多个定义建议使用bean来创建对象。
在OrderService创建也是会先找ByType,在来找ByName
@Autowired注入点
调用后这个方法
也会去注入父类的注入点
如果是static修饰的就直接返回
@Autowired的加value值注入
$占位符填充值
#spring里面的表达式可以写属性也可以进行运算
直接注入字符串给类属性需要自己定义spring的类型转换器
会调用你的类型转换器
@Autowired的普通注入
会将注入的属性,属性名称为Map<String,Object>的String,属性值为Map<String,Object>的Object
@Autowired的collection,map,Array 注入
map使用
collection
会拿出所有被加载到容器中的方法,map会实现以属性名小写,属性值形式返回,其他会直接返回属性。
@Autowired的Primary注解
在多个实例时加上一个主bean,就会byType找,只找属性返回
设置优先级
@Autowired的流程是先找byType找到后》存入map中》如果有Priamary会返回值,根据优先级最高的返回,最后才会根据byName来获取属性,在byName中是根据Map的key,value形式获取,所有属性名字必须和注入的属性名称一致。