前言:经过前面的学习我们已经可以实现基本的Spring读取和存储对象的操作,但是操作过于复杂,所以接下来我们更进一步,学习更加简单的操作Bean对象的方法
在Spring中想要更加简单的存储和读取对象的核心是使用注解
目录
1、存储Bean对象
1.1 前置工作:配置扫描路径(重要)
想要将Bean添加到Spring中,我们需要配置一下存储对象的扫描路径,只有在被配置的包下的所有的类,添加了注解才能正确地存储到Spring中
1.2 添加注解存储Bean对象
想要将Bean对象存储到Spring中,有两种注解类型可以实现:
① 类注解:@Controller(控制器)、@Service(服务)、@Repository(仓库)、@Component(组件)、@Configuration(配置)
② 方法注解:@Bean
1.2.1 类注解
注意事项:
①:即使在spring中配置文件中配置了bean的扫描路径,但是 五大 类注解是不能省略的。
②:即使加了 五大 类注解,但类没有放到spring配置的bean路径下,那么也是不能将对象存储到spring容器中的。
1.2.2 方法注解
方法注解,顾名思义将方法的返回的对象存储到spring中,在Spring框架设计中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中。
关于类注解的bean 的名称规则:通常情况下是小驼峰(将类名首字母小写)就可以获得bean对象
另外也可以用Bean注解的一个name属性对Bean进行命名,直接通过name获取。
1.3 为什么要这么多类注解
虽然五大类注解的功能是一样的,但是还是有必要搞这么多类注解的,因为这涉及到软件设计分层,让程序猿看到类注解之后,就直接了解了当前类的用途:
配置层:存放所有配置信息
控制器层:和前端打交道,验证前端的有效性
服务层:验证完前端后,调用相应的功能接口
数据持久层:和数据打交道,执行具体的CRUD操作。
1.4 类注解之间的关系
@Controller、@Service、@Repository、@Configuration 它们都是依靠@Component实现的,因此可以说@Component是其他4个类注解的父类。
2、注入Bean对象(获取对象)
2.1 属性注入
2.2 Setter 注入
2.3 构造方法注入
注意事项:
如果当前类只有一个构造方法,那么@Autowired 可以缺省,但是如果当前方法中存在多个构造方法,注解是不能省略的。
属性注入、构造方法注入、Setter注入的区别是什么?
- 属性注入:的写法最简单,也最简洁。缺点是不通用,它只适合于IoC框架,非IoC框架会提示空指针异常。
-Setter 注入:Spring 早期版本推荐的注入方式,它的通用性不如构造方法注入。
-构造方法注入:缺点是可能存在传递多个参数来实现构造方法的初始化,会导致代码臃肿;优点是通用性更好,并且它能保证在用注入对象之前,此对象一定是存在的。Spring后期版本官方推荐的注入方式。
2.4 @Resource 注入
是JDK提供的实现,支持属性注入和Setter注入
@Autowired 和 @Resource 的区别是什么?
①出身不同:@Autowired 来自于Spring的实现,而@Resource 来自于JDK
②支持的参数设置不同:@Autowired 只支持required 设置,而@Resource 支持很多参数设置
③支持的注入类型不同:@Autowired 支持属性、构造方法、Setter注入,而@Resource只支持属性和Setter注入
一个类型被注册到Spring多次,在另一个类中进行注入时,会报错,此时解决办法:
①使用正确的 bean name 来获取
②使用@Resource 设置 name属性 @Resource(name="user2")
③使用@Autowired + @Qualifier