Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
Spring中的单例Beans是线程安全的吗?
Spring框架中的单例Beans在创建时是线程安全的,但在使用时是否线程安全取决于具体的设计和实现。
spring中的bean如果是无状态的不共享数据,那么是线程安全的。如果说spring中的bean存在共享数据的情况。那 么就是线程不安全的,需要自行进行并发处理。或者使用多例模式。
Spring中事务传播行为
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
Spring事务中的隔离级别有哪几种?
在TransactionDefinition接口中定义了五个表示隔离级别的常量:
ISOLATION_DEFAULT:使用后端数据库默认的隔离级别, Mysql默认采用的REPEATABLE_READ隔离级别; Oracle 默认采用的READ_COMMITTED隔离级别。
ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不 可重复读。
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有 可能发生
ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可 以阻止脏读和不可重复读,但幻读仍有可能发生。
ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间 就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通
常情况下也不会用到该级别。
Spring中用到了哪些设计模式?
单例模式
Spring默认创建的Bean就是单例的。进一步的,依赖注入Bean实例默认是double check的单例模式。并且用 ConcurrentHashMap保证线程安全。
代理模式
AOP底层就是动态代理模式的实现。分JDK动态代理和CGLIB两种默认使用jdk动态代理,如果开启了cglib则优先使用 cglib。如果没有接口, jdk动态代理会失效。cglib则没有这个问题
工厂方法Spring中的BeanFactory就是工厂模式的体现,将对象的创建交给工厂来做。
原来依赖方和被依赖方耦合在一起,现在beanFactory将bean之间的耦合打开了。依赖方到工厂里拿依赖,不直接和 被依赖方接触耦合了,
模版模式
模板方法模式是一种行为设计模式,模版模式类似继承,父类定义规则,子类具体实现
Spring 中 jdbcTemplate、 hibernateTemplate 等以Template 结尾的对数据库操作的类,它们就使用到了模板模 式。
装饰者模式
Spring 在配置DataSource 的时候, DataSource 可能是不同的数据库和数据源。这个时候就要用到装饰者模式。
Spring 中用到的包装器模式在类名上含有Wrapper或者Decorator。这些类基本上都是动态地给一个对象添加一些 额外的职责。
适配器模式
实现方式: SpringMVC中的适配器HandlerAdatper。
实现原理: HandlerAdatper根据Handler规则执行不同的Handler。
实现过程: DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理
Handler。 HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返 回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现意义: HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的
HandlerAdapter即可。因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配 器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展 了。
观察者模式
观察者模式是一种对象行为型模式。 a观察b的行为, b发生时a相应的做出反应、
Spring 事件驱动模型就是观察者模式很经典的一个应用。主要包括三个组成部分:事件,事件发布者,事件订阅 者,当事件发生时,事件订阅者相应的做出改变。