Spring 总结

1.Spring三大核心思想

IOC控制反转,DI依赖注入,AOP面向切面编程。

IOC:控制反转,把当前类的控制权交给Spring管理,我们在使用的时候,在spring的配置文件中,配置好bean标签,以及类的全限定名,如果有参数,再配置上相应的参数,(或者在类上加上@component,交给spring管理)。spring就会通过反射机制实例化这个类,同时放到spring核心容器中。

Spring提供了两种IOC容器,分别是BeanFactory 和 ApplicationContext

BeanFactory是基础类型的IOC容器,提供了完整的IOC服务支持,简单的说,BeanFactory就是一个管理bean的工厂,主要负责初始化bean,并调用他们的生命周期的方法。

ApplicationContext是BeanFactory的子接口,也被称为应用上下文,不仅提供了BeanFactory的所有功能,还添加了对i18n(国际化)、资源访问、事务传播等方面的良好支持。

主要区别在于:

beanFactory是延迟加载,也就是说在容器启动时不会注入bean,而是在需要使用bean的时候,才会加载实例bean。

ApplicationContext是在容器启动时,一次性创建所有的bean。

如果bean的某一个属性没有注入,在使用BeanFactory加载后,首次调用getBean()会抛出异常;ApplicationContext在初始化时会自检,这样有利于检查所依赖的属性是否注入。

DI依赖注入:我们在使用IOC的时候,需要结合DI依赖注入使用,把我们想使用的类注入到需要的地方即可。依赖注入的方式有:setter注入、构造方法注入、注解注入(@autowired、@Resource)。

@autowired默认按照类型注入,如果这个类型没有找到,就会按名称注入,如果在用的时候需要指定名称,可以加注解@Qualifier(“指定名称的类”)。

@Resource默认按名称注入,如果名称没有找到,会按照类型去找,可以在注解里面指定名称@Resource(name=“ ”)。

AOP面向切面编程:不改变源代码的情况下对代码功能进行增强。我们可以在配置文件中配置好切点,然后去实现切面的逻辑,(@Aspect声明为切面类,其中@pointcut用于切某个方法和通知@before等逻辑,创建一个一配置类加上@EnableAspectJAutoProxy开启动态代理)就可以实现代码的增强。

AOP的底层其实就是动态代理,每次运行时都会临时生成一个代理对象,这个对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

AOP的动态代理主要有两种方式:jdk动态代理、cglib动态代理

jdk动态代理:只提供接口的代理,不提供类的代理。核心是InvocationHandler接口和proxy类,invocationHandler接口使用invoke()方法反射调用目标类的代码,然后proxy类利用invocationHandler动态创建一个符合接口的实例,生成目标类的代理对象。

cglib动态代理:如果代理类没有实现InvocationHandler接口,那么AOP会使用cglib动态代理目标类。cglib是通过继承方式做的动态代理,在运行时可以动态的生成一个指定类的子对象,覆盖其中的特定方法并增强指定代码,从而实现AOP。

2.Bean的生命周期

生命周期无非是从创建到销毁的过程。实例化bean,属性赋值,初始化bean,销毁bean

Spring容器可以管理Singleto作用域下的bean的生命周期,能够精确知道bean何时被创建,何时完成初始化,何时销毁。scope="singleton || prototype || request || session || global-session">

而对于prototype作用域的bean,spring只负责创建,之后把bean的实例交给客户端代码管理,Spring容器不再跟踪其生命周期,每次客户端请求prototype作用域的bean时,Spring都会创建一个新的实例。

实例化bean:容器通过BeanDifinition对象中的信息进行实例化。

属性赋值:利用依赖注入完成bean的属性值的配置注入。

初始化bean:如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法

销毁bean:通过destroy-method设置指定函数,就可以在bean销毁前执行指定的逻辑。

3.springBean的作用域

singleton:单例模式,bean的默认作用域,使用singleton定义的bean在spring容器中只有一个实例。Controller、service、dao基本都是singleton。

prototype:原型模式,每次通过spring容器获取prototype定义的bean时,容器都会创建一个新的实例bean

request:在一次Http 请求中,容器会返回该bean的同一个实例。在不同的http 请求中,会返回不同的实例,该作用域仅在当前http request内生效。

session:在一次http session中,容器会返回该bean的同一个实例。在不同的http 请求中,会返回不同的实例,该作用域仅在当前http session内生效。

global-session:全局作用域,在一个全局的http session中,容器会返回同一个实例。

4.Spring中用了哪些设计模式

工厂模式:spring中的beanFactory和ApplicationContext都是工厂模式的实现,用来创建和管理对象。

单例模式:spring中的bean默认都是单例的,保证了对象的唯一性和共享性。

代理模式:aop用到了jdk动态代理和cglib动态代理。

模板方法模式:用来解决代码重复问题,如RestTemplate,JpaTemplate,JmsTemplate.

观察者模式:定义了对象之间一对一一对多的关系,当一个对象发生改变时,所有依赖于他的对象都会及时得到通知,如spring中listener的实现ApplicationListener。

5.Spring中如何处理bean在线程并发时线程安全问题

在一般环境下,只有无状态的bean才可以在多线程环境下共享,在Spring中,绝大部分bean都可以声明为Singleton作用域,因为Spring对一些bean中的非线程安全状态采用了ThreadLocal进行处理,解决线程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制仅提供一份变量,不同线程在访问前需要获取锁,没获得锁的线程需要等待;而ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离多个线程对数据的访问冲突,每一个线程都有一个对应的变量副本,只允许对应的线程修改和访问,不会影响其他线程。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值