Spring 是什么?
Spring是⼀个开源框架, 他让我们的开发更加简单.
Spring 是包含了众多⼯具⽅法的 IoC 容器
什么是IoC?
IoC控制反转
IoC 是Spring的核⼼思想
在类上⾯添加 @RestController 和@Controller 注解, 就是把这个对象交给Spring管理, Spring 框架启动时就会加载该类. 把对象交给Spring管理, 就是IoC思想.
IoC是解耦合的
IoC容器具备以下优点:
资源不由使⽤资源的双⽅管理,⽽由不使⽤资源的第三⽅管理,这可以带来很多好处。第⼀,资源集中管理,实现资源的可配置和易管理。第⼆,降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度。
-
资源集中管理: IoC容器会帮我们管理⼀些资源(对象等), 我们需要使⽤时, 只需要从IoC容器中去取就可以了
-
我们在创建实例的时候不需要了解其中的细节, 降低了使⽤资源双⽅的依赖程度, 也就是耦合度.
IoC的五大注解
加五大注解代表着是被Spring管理,相当于Spring内部直接创建了一个对象
@Controller、@Component、@Service、@Configuration、@Repository
如何读bean呢?
Application和BeanFeactory关系及区别?
1、父子关系,Application是字,BeanFeactory是夫,BeanFeactory有的功能,Application都有,除此之外,Application还有环境、资源管理等功能。
2、性能上:
Application是提前加载,浪费空间,性能好
BeanFeactory是懒加载,节约空间,性能比Application低
五大注解能否被混用?
1、功能上,部分可以混用。(Controller是不可以被混用的)
2、规范上,不可以被混用。
程序被Spring管理,需要有:
1、被Spring扫描到(默认扫描的路径是启动类所在目录)
2、需要配置五大注解和@bean使用
也可以使用@ComponentScan(basePackages = "路径")修改扫描路径
@Bean方法
使用@Bean时,必须要搭配五大注解使用。
@Bean
常用于集成无法修改源码的第三方类库
DI(依赖注入)
IoC 是⼀种思想,也是"⽬标", ⽽思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI 就属于具体的实现。所以也可以说, DI 是IoC的⼀种实现.
1、属性注入
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中.
2、构造方法注入
构造⽅法注⼊是在类的构造⽅法中实现注⼊
注意:
1、只有一个构造函数,不需要加@Autowired
2、如果有多个构造函数,要加@Autowired指定,没有指定就默认使用无参的
构造函数规范
如果添加构造函数,把无参构造函数也添加,使用谁,谁加@Autowired
Setter注入
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注
解
三种注入优缺点分析
属性注⼊
优点: 简洁,使⽤⽅便;
缺点:
- 只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指 针异常)
- 不能注⼊⼀个Final修饰的属性、
构造函数注⼊(Spring 4.X推荐)
优点:
- 可以注⼊final修饰的属性
- 注⼊的对象不会被修改
- 依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法 是在类加载阶段就会执⾏的⽅法.
- 通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的
缺点:
注⼊多个对象时, 代码会⽐较繁琐
Setter注⼊(Spring 3.X推荐)
优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊
缺点:
- 不能注⼊⼀个Final修饰的属性
- 注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险
@Autowired和@Resource的区别
1、@Autowired是Spirng提供的
@Resource是jdk提供的。
2、@Autowired是根据类型注入的。
@Resource是根据名称注入的。
@Resource相对于@Autowired来说,@Resource支持更多参数设置。
@Autowired存在的问题
@Autowired是根据类型查找,如果只找到一个,就直接注入。
如果没有找到,就报错。
如果找到多个,就根据名称来注入。
Spring、Spring MVC、Spring Boot区别
Spring是:管理对象,对象直接的依赖。
Spring MVC:主要用于Web的开发和网络接口。
Spring Boot:是对Spring的一种封装,用来简化Spring应用开发。