首先spring是一个开源的轻量级的框架,说到spring就不得不提两个概念,IOC(控制反转)和AOP(面向切面编程)
一般情况下,我们创建对象都是通过new关键字来创建,这样会导致程序的耦合性增加,现在我们通过spring容器来帮我们创建对象,这样创建对象的控制权就发生了反转,这就叫控制反转。spring容器创建好对象后,我要使用这个对象啊,spring就要将对象赋值,为调用者注入依赖的实例对象,这就是依赖注入(注入方式有两种,1.通过setter方法,2.通过构造方法)。
1.单例(singleton)
单例顾名思义,该Bean对象在容器中只会被创建一个,无论多少 Bean对象引用它,都是指向这一个实例(也是spring默认的作用域),所以当容器创建时这个对象也就创建了(多个线程同时存取共享资源时有可能引发的数据不同步问题)
2.多例(也叫原型,prototype)
这个意思就是,每次找spring对象获取这个Bean对象时,容器就会创建一个新的对象,所以容器创建时该对象是不存在的,只有我们获取的时候,才会被创建,而且还是不是同一个对象
(spring常用的就是这个两个,还有其他的作用域,这里不展开说明)
在spring中,一旦把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。
面向切面编程是一种编程思想,是对oop(面向对象编程)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
想象一下,开发中在多个模块间有某段重复的代码,一般做法是将这些抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们只需要改变这个方法就可以了。然而需求总是变化的,有一天,新增了一个需求,需要再多出做修改,我们需要再抽象出一个方法,然后再在需要的地方分别调用这个方法,又或者我们不需要这个方法了,我们还是得删除掉每一处调用该方法的地方。所有aop作用就是在不改变原有的逻辑的基础上,增加一些额外的功能 。Spring 中的 AOP 是通过动态代理实现的,动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。