spring笔记
一:IOC和DI
对于spring整个的框架学习中,其实就是俩个核心点,一个是IOC,一个是DI
IOC
ioc,叫做控制反转全称叫做inversion of control顾名思义,这就是一种设计模式,通俗的来说就是,其中程序的控制不再有程序自身来管理,而是由外部的框架或者容器来管理
对于ioc来说,我个人认为俩点比较重要
1.实例化容器
实例化容器怎么说呢,实例化容器是一个抽象接口或类,它有多个不同的实现方式,每种实现方式都代表了容器的一种具体实例化策略,这几种方法可以混着用
一般来说,使用xml能配置的,使用注解都可以配置,通俗的说,就是都对应着
1.1.基于xml
1.2.基于注解
对于基于注解开发,这个是属于万金油的存在,但是不能单独使用,使用这个可以是整体的配置更加简洁
在基于xml配置文件的环境下,开启spring的注解开发
<context:annotation>
<context:compnent-scan base-package="">
1.2.1. @component
@controller
@service
@repository
1.2.2.自动装配
按照类型 by type
- @Autowired
一般@qualifier常和Autowired一起用,用于类型匹配存在多个选择时,指定一个名字匹配上默认情况下,注解注入(放在set方法上,就是set注入),反射,强行破坏封装性,赋值
- @Inject
按照名称 by name
- @Named
配合@Inject - @Resource
先按名称匹配,再按类型匹配
1.2.3.元属性注解
1.3基于java配置类
springboot基本都是基于java类配置
2.bean
对于bean来说,我觉得也是三点比较重要
- 2.1.实例化bean
- 工厂方法
- 静态工厂方法
- 实例化工厂方法
- 构造方法
- 工厂方法
- 2.2.属性(常见属性)
- scope
作用域,支持6种,其中4种要web程序才用的到- 单例和多例的区别
- 一个只能存在一个,一个可以存在多个
- 单例在容器初始化种,会立刻实例化,多实例,什么时候用,什么时候实例化(ref引用也算被需要)
- 多实例bean,ioc只创建,不销毁
- 单例和多例的区别
- lazy-init
懒加载,一般只用在单例的bean上,让它变成什么时候需要什么时候创建 - depends-on
主要用于跟ref区别,ref是强耦合,比如男朋友依赖于女朋友,用ref,deoend-on,比如先有姐姐,再有妹妹,这个决定bean的实例化顺序
- scope
- 2.3.生命周期
实例化->属性赋值->初始化->销毁
DI
全称叫做依赖注入,俩种方式
1.基于构造方法的依赖注入
类要有有参构造方法
<bean id="personBean" class="com.example.Person">
<constructor-arg name="name" value="John" />
<constructor-arg name="age" value="30" />
</bean>
2.基于set方法的依赖注入
类需要有无参构造方法,还要有set方法
先new,再set
<bean id="carBean" class="com.example.Car">
<property name="make" value="Toyota" />
<property name="model" value="Camry" />
</bean>
3.区别
3.1.构造函数 vs Setter方法
- 基于有参构造,这个在javase中就学过,过程是通过在类的构造函数中接收依赖项作为参数去实现,这就代表着在对象创建时就被传递给了对象,使得对象的状态在创建后不可改变
- 基于set方法,它是通过在对象创建后通过调用setter方法来设置属性的值,允许对象的属性在运行时去发生改变
3.2.不可变性 vs 可变性
3.3.参数传递方式
- 基于有参构造的依赖注入就必须要有有参构造方法
- 基于set要有无参构造器和setter方法