Spring 注入方式

Spring 注入方式有三中

1.setter注入

2.构造器注入

3.基于注解的注入

1.setter注入

在InjectionServiceImple 中有 变量 injectionDao 并有其的set方法

Spring 注入方式_第1张图片

Spring 注入方式_第2张图片

还有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。 

2.构造器注入

Spring 注入方式_第3张图片

Spring 注入方式_第4张图片

注意:配置文件中的name 要和构造函数中的参数名称一致

例子:

Spring 注入方式_第5张图片

问题一:如果有多个有参数的构造方法并且每个构造方法的参数列表里面都有要注入的属性,那会调用哪个构造方法

Spring 注入方式_第6张图片

结果:会注入到只有一个参数的构造方法中,并且经过测试注入哪一个构造方法与构造方法的顺序无关

 

 问题二:如果只有一个构造方法,但是有两个参数,一个是待注入的参数,另一个是其他类型的参数,那么这次注入可以成功吗?

结果:会出现异常  即使在costract-arg标签里面通过name属性指定要注入的参数名userDao也会失败

Spring 注入方式_第7张图片

问题三:如果我们想向有多个参数的构造方法中注入值该在配置文件中怎么写呢?

 Spring 注入方式_第8张图片

参考写法:通过name属性指定要注入的值,与构造方法参数列表参数的顺序无关。

Spring 注入方式_第9张图片

问题四:如果有多个构造方法,每个构造方法只有参数的顺序不同,那通过构造方法注入多个参数会注入到哪一个呢?

Spring 注入方式_第10张图片

 结果:哪个构造方法在前就注入哪一个,这种情况下就与构造方法顺序有关。

Spring 注入方式_第11张图片

3.注解配置bean

主要有四种注解把bean注入到spring,每种注解可以任意使用,只是语义上有所差异:

  1. @Component:可以用于注册所有bean
  2. @Repository:主要用于注册dao层的bean
  3. @Controller:主要用于注册控制层的bean
  4. @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,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。
  • @Autowired:spring注解,默认是以byType的方式去匹配与属性名相同的bean的id,如果没有找到,就通过byName的方式去查找,

你可能感兴趣的:(spring,java,spring,boot)