Spring 注入方式有三中
1.setter注入
2.构造器注入
3.基于注解的注入
1.setter注入
在InjectionServiceImple 中有 变量 injectionDao 并有其的set方法
还有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。
2.构造器注入
注意:配置文件中的name 要和构造函数中的参数名称一致
例子:
问题一:如果有多个有参数的构造方法并且每个构造方法的参数列表里面都有要注入的属性,那会调用哪个构造方法
结果:会注入到只有一个参数的构造方法中,并且经过测试注入哪一个构造方法与构造方法的顺序无关
问题二:如果只有一个构造方法,但是有两个参数,一个是待注入的参数,另一个是其他类型的参数,那么这次注入可以成功吗?
结果:会出现异常 即使在costract-arg标签里面通过name属性指定要注入的参数名userDao也会失败
问题三:如果我们想向有多个参数的构造方法中注入值该在配置文件中怎么写呢?
参考写法:通过name属性指定要注入的值,与构造方法参数列表参数的顺序无关。
问题四:如果有多个构造方法,每个构造方法只有参数的顺序不同,那通过构造方法注入多个参数会注入到哪一个呢?
结果:哪个构造方法在前就注入哪一个,这种情况下就与构造方法顺序有关。
3.注解配置bean
主要有四种注解把bean注入到spring,每种注解可以任意使用,只是语义上有所差异:
- @Component:可以用于注册所有bean
- @Repository:主要用于注册dao层的bean
- @Controller:主要用于注册控制层的bean
- @Service:主要用于注册服务层的bean
简单介绍bean的一个属性autowire,autowire自动注入主要有三个属性值:constructor,byName,byType。
- constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。
- byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。
- byType:查找所有的set方法,将符合符合参数类型的bean注入。
描述依赖关系主要有两种:
- @Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,
- @Autowired:spring注解,默认是以byType的方式去匹配与属性名相同的bean的id,可以和@Qualifier注解(spring注解)一起使用指定某个具体名称的bean。