【Spring core学习三】对象装配:获取Bean对象的四种方式

目录

对象装配的四种方式

1、@Autowired属性注入(使用最多)

2、Setter注入

3、构造函数注入

4、@Resource:另⼀种注⼊关键字


对象装配的四种方式

        对象装配:获取bean对象也叫作对象装配,是将对象取出来放在某个类中,有时候也叫对象注入。对象装配的实现方式有三种:属性注入、构造方法注入、Setter注入,还有一个额外的@Resource注入 

1、@Autowired属性注入(使用最多)

实现:将Service类注入到Controller类中。xml文件内容如下:



       

UserController类和UserService类 

【Spring core学习三】对象装配:获取Bean对象的四种方式_第1张图片

 执行结果:

【Spring core学习三】对象装配:获取Bean对象的四种方式_第2张图片

【Spring core学习三】对象装配:获取Bean对象的四种方式_第3张图片

注意:@Autowired在注入的时候

(1)先以类型匹配;

(2)如果类型匹配出多个对象,就以名称来匹配;

(3)如果匹配出来的是一个对象,就直接注入。

比如上述代码符合情况1:因为UserService类直接根据类来匹配了,所以在上述代码中,

但是对于下面这种情况:一个User类中有两个对象,这个时候满足上述条件2,就不能随意起名了,这里的名字要和对象名匹配,否则就会报错,显示不匹配。

UserController类:

【Spring core学习三】对象装配:获取Bean对象的四种方式_第4张图片

 UserService类:

【Spring core学习三】对象装配:获取Bean对象的四种方式_第5张图片

 执行结果:

【Spring core学习三】对象装配:获取Bean对象的四种方式_第6张图片

2、Setter注入

UserController类

【Spring core学习三】对象装配:获取Bean对象的四种方式_第7张图片

 UserService类

【Spring core学习三】对象装配:获取Bean对象的四种方式_第8张图片

 执行结果:

【Spring core学习三】对象装配:获取Bean对象的四种方式_第9张图片

3、构造函数注入

【Spring core学习三】对象装配:获取Bean对象的四种方式_第10张图片

现在如果想要注入多个,那么就要写多个构造函数,但是为了能让Spring知道使用哪个构造函数,就要加一个@Autowired注解。

【Spring core学习三】对象装配:获取Bean对象的四种方式_第11张图片

【Spring core学习三】对象装配:获取Bean对象的四种方式_第12张图片

 总结:三种注入方式的优缺点分析

(1)属性注⼊(一般使用)

        优点:简洁,使⽤⽅便。。

        缺点:只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常),不能修饰final修饰的属性。

 (2)Setter注入

        优点:方便在类实例后,重新对该对象进行配置或者注入;

        缺点:不能注入一个final修饰的属性;注入对象可能会被改变,因为setter方法可能会被多次 调用,就有被修改的风险。

(3)构造方法注入

        优点:可以注入final修饰的属性,注入的对象不会被改变;依赖对象在使用之前一定会被完全初始化,因为构造方法是在类加载阶段就会执行的方法。还有就是通用性好,构造方法是JDK支持的,所以更换任何框架,都是适用的。

        缺点:注入多个对象的时候,代码比较繁琐。

 4、@Resource:另⼀种注⼊关键字

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊。

@UserController

【Spring core学习三】对象装配:获取Bean对象的四种方式_第13张图片

 @UserService

【Spring core学习三】对象装配:获取Bean对象的四种方式_第14张图片

 执行结果

【Spring core学习三】对象装配:获取Bean对象的四种方式_第15张图片

 问题2:将@Autowired更改为@Resource也可以执行成功,因此@Resource与@Autowired之间的区别是什么?

(1)出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
(2)使⽤时设置的参数不同:但是@Autowired根据类型来获取bean,如果只有同一个类型的bean只有一个,直接注入成功;如果同一个类型的bean有多个,根据名称匹配;如果没如有名称相同的,就报错。@Resource ⽀持更多的参数设置,如果没如有名称相同的,就报错,但是有解决办法,例如name 设置,根据名称获取 Bean。

但是其实@Autowired也有其他的解决办法,搭配一个注解@Qualifier来使用。

注意:下面的user1和user2存在,user不存在。

@Resource的解决办法

【Spring core学习三】对象装配:获取Bean对象的四种方式_第16张图片

@Autowired的解决办法

【Spring core学习三】对象装配:获取Bean对象的四种方式_第17张图片

 (3)@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊。


前三篇文章知识的总结:

1. 将对象存储到 Spring 中:
(1)使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
(2) 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
2. Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
3. 从 Spring 中获取对象:

  • 属性注⼊
  • Setter 注⼊
  • 构造函数注⼊(推荐)

4. 注⼊的关键字有:

  • @Autowired
  •  @Resource

5. @Autowired 和 @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。
6. 解决同⼀类型多个 Bean 的报错:

  • 使⽤ @Resource(name="")
  • 使⽤ @Qualifier("")

【Spring core学习三】对象装配:获取Bean对象的四种方式_第18张图片

你可能感兴趣的:(Spring学习,spring,学习,java)