如下来自网络收集,找不到原文出处。这次主要为了面试收集,但愿对你们有所帮助~~~~java
Spring是一个开源的Java EE开发框架。Spring框架的核心功能能够应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。Spring框架的目标是使得Java EE应用程序的开发更加简捷,经过使用POJO为基础的编程模型促进良好的编程风格。git
因为spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首先用spring中的IoC划分了事务处理单元。而且将对事务的各类配置放到了ioc容器中(设置事务管理器,设置事务的传播特性及隔离机制)。github
Spring事务处理模块是经过AOP功能来实现声明式事务处理的,具体操做(好比事务实行的配置和读取,事务对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,经过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。读取ioc容器事务配置属性,转化为spring事务处理须要的内部数据结构(TransactionAttributeSourceAdvisor),转化为TransactionAttribute表示的数据对象。web
spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持、hibernate数据源事务处理支持、JDO数据源事务处理支持,JPA、JTA数据源事务处理支持。这些支持都是经过设计PlatformTransactionManager、AbstractPlatforTransaction一系列事务处理的支持。 为经常使用数据源支持提供了一系列的TransactionManager。面试
PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,造成一个Spring声明式事务处理的设计体系。算法
Spring框架对单例的支持是采用单例注册表的方式进行实现的,而这个注册表的缓存是HashMap对象,若是配置文件中的配置信息不要求使用单例,Spring会采用新建实例的方式返回对象实例。spring
你能够同时使用两种方式的依赖注入,最好的选择是使用构造器参数实现强制依赖注入,使用setter方法实现可选的依赖关系。数据库
概念apache
优势编程
spring中经常使用的设计模式达到九种,咱们举例说明:
第一种:简单工厂
又叫作静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该建立哪个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个惟一的标识来得到bean对象,可是否是在传入参数后建立仍是传入参数前建立这个要根据具体状况来定。
第二种:工厂方法(Factory Method)
一般由应用程序直接使用new建立新的对象,为了将对象的建立和使用相分离,采用工厂模式,即应用程序将对象的建立及初始化职责交给工厂对象。通常状况下,应用程序有本身的工厂对象来建立bean.若是将应用程序本身的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。
第三种:单例模式(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是由于spring管理的是是任意的java对象。
第四种:适配器(Adapter)
在Spring的Aop中,使用的Advice(通知)来加强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(一、JDK动态代理。二、CGLib字节码生成技术代理。)对类进行方法级别的切面加强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,经过执行拦截器重的内容加强了代理方法的功能,实现的面向切面编程。
第五种:包装器(Decorator)
在咱们的项目中遇到这样一个问题:咱们的项目须要链接多个数据库,并且不一样的客户在每次访问中根据须要会去访问不一样的数据库。咱们以往在spring和hibernate框架中老是配置一个数据源,于是sessionFactory的dataSource属性老是指向这个数据源而且恒定不变,全部DAO在使用sessionFactory的时候都是经过这个数据源访问数据库。可是如今,因为项目的须要,咱们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让sessionFactory在执行数据持久化的时候,根据客户的需求可以动态切换不一样的数据源?咱们能不能在spring的框架下经过少许修改获得解决?是否有什么设计模式能够利用呢? 首先想到在spring的applicationContext中配置全部的dataSource。这些dataSource多是各类不一样类型的,好比不一样的数据库:Oracle、SQL Server、MySQL等,也多是不一样的数据源:好比apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。而后sessionFactory根据客户的每次请求,将dataSource属性设置成不一样的数据源,以到达切换数据源的目的。
spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另外一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
第六种:代理(Proxy)
为其余对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式相似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增长职责。
spring的Proxy模式在aop中有体现,好比JdkDynamicAopProxy和Cglib2AopProxy。
第七种:观察者(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都获得通知并被自动更新。
spring中Observer模式经常使用的地方是listener的实现。如ApplicationListener。
第八种:策略(Strategy)
定义一系列的算法,把它们一个个封装起来,而且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
第九种:模板方法(Template Method)
定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。Template Method
使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。Template Method
模式通常是须要继承的。这里想要探讨另外一种对Template Method
的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,由于这个类的方法太多,可是咱们仍是想用到JdbcTemplate已有的稳定的、公用的数据库链接,那么咱们怎么办呢?咱们能够把变化的东西抽出来做为一个参数传入JdbcTemplate的方法中。可是变化的东西是一段代码,并且这段代码会用到JdbcTemplate中的变量。怎么办?那咱们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,咱们去实现这个方法,就把变化的东西集中到这里了。而后咱们再传入这个回调对象到JdbcTemplate,从而完成了调用。这多是Template Method不须要继承的另外一种实现方式吧。
二者都是经过xml配置文件加载bean,ApplicationContext
和BeanFacotry
相比,提供了更多的扩展功能,但其主要区别在于后者是延迟加载,若是Bean的某一个属性没有注入,BeanFacotry
加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;因此一般状况下咱们选择使用ApplicationContext。
BeanFactroy
采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean
时(调用getBean()),才对该Bean进行加载实例化,这样,咱们就不能发现一些存在的Spring
的配置问题。而ApplicationContext
则相反,它是在容器启动时,一次性建立了全部的Bean
。这样,在容器启动时,咱们就能够发现Spring
中存在的配置错误。
BeanFactory
和ApplicationContext
都支持BeanPostProcessor
、BeanFactoryPostProcessor
的使用,但二者之间的区别是:BeanFactory
须要手动注册,而ApplicationContext
则是自动注册
IOC:
IOC就是控制反转,通俗的说就是咱们不用本身建立实例对象,这些都交给Spring的bean工厂帮咱们建立管理。这也是Spring的核心思想,经过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring经过配置文件(xml或者properties)指定须要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,经过加载读取配置文件,用Spring提供的方法(getBean())就能够获取到咱们想要的根据指定配置进行初始化的实例对象。
DI:DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并不是为软件系统带来更多功能,而是为了提高组件重用的频率,并为系统搭建一个灵活、可扩展的平台。经过依赖注入机制,咱们只须要经过简单的配置,而无需任何代码就可指定目标须要的资源,完成自身的业务逻辑,而不须要关心具体的资源来自何处,由谁实现。
切入点(pointcut)和链接点(join point)匹配的概念是AOP的关键,这使得AOP不一样于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知能够被应用到一组横跨多个对象中的方法上(例如服务层的全部业务操做)。
概念
面向切面编程。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,利用AOP能够对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度下降,提升程序的可重用性,同时提升了开发的效率。
核心思想
能够在不修改源代码的前提下,对程序进行加强
实现原理
Spring框架的AOP技术底层也是采用的代理技术,所谓的动态代理就是说 AOP 框架不会去修改字节码,而是在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了目标对象的所有方法,而且在特定的切点作了加强处理,并回调原对象的方法 。Spring AOP 中的动态代理主要有两种方式, JDK
动态代理和 CGLIB
动态代理 。
JDK
动态代理:经过反射来接收被代理的类,而且要求被代理的类必须实现一个接口 。JDK 动态代理的核心是 InvocationHandler 接口和 Proxy 类 。CGLIB
动态代理: 若是目标类没有实现接口,那么 Spring AOP
会选择使用 CGLIB
来动态代理目标类 。CGLIB
( Code Generation Library ),是一个代码生成的类库,能够在运行时动态的生成某个类的子类,注意, CGLIB
是经过继承的方式作的动态代理,所以若是某个类被标记为 final
,那么它是没法使用 CGLIB
作动态代理的。支持以下五种不一样的做用域
在Spring
中建立一个bean
的时候,咱们能够声明它的做用域。只须要在bean
定义的时候经过scope
属性定义便可。例如,当Spring
须要产生每次一个新的bean
实例时,应该声明bean
的scope
属性为prototype
。若是每次你但愿Spring
返回一个实例,应该声明bean
的scope
属性为singleton
。
有两个重要的bean
生命周期方法。
setup
方法,该方法在容器加载bean
的时候被调用。teardown
方法,该方法在bean
从容器中移除的时候调用。bean标签有两个重要的属性(init-method 和 destroy-method),你能够经过这两个属性定义本身的初始化方法和析构方法。
Spring也有相应的注解:@PostConstruct
和 @PreDestroy
。
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
当一个bean仅被用做另外一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,能够在 或 元素内使用 元素,内部bean一般是匿名的,它们的Scope通常是prototype。
说明:自动装配没有自定义装配方式那么精确,并且不能自动装配简单属性(基本类型、字符串等),在使用时应注意。
彻底能够。
Version | Feature |
---|---|
Spring 2.5 | 发布于 2007 年。这是第一个支持注解的版本。 |
Spring 3 | 发布于 2009 年。它彻底利用了 Java5 中的改进,并为 JEE6 提供了支持。 |
Spring 4.0 | 发布于 2013 年。这是第一个彻底支持 JAVA8 的版本。。 |
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工做。这使得用户容易在持久性技术之间切换。它还容许您在编写代码时,无需考虑捕获每种技术不一样的异常。
spring-data-access-exception
Spring AOP
基于动态代理方式实现;AspectJ
基于静态代理方式实现。Spring AOP
仅支持方法级别的 PointCut;提供了彻底的 AOP 支持,它还支持属性级别的 PointCut。
大厂笔试内容集合(内有详细解析) 持续更新中....
欢迎关注我的微信公众号: Coder编程
欢迎关注 Coder编程公众号,主要分享数据结构与算法、Java相关知识体系、框架知识及原理、Spring全家桶、微服务项目实战、DevOps实践之路、每日一篇互联网大厂面试或笔试题以及PMP项目管理知识等。更多精彩内容正在路上~
新建了一个qq群:315211365,欢迎你们进群交流一块儿学习。谢谢了!也能够介绍给身边有须要的朋友。文章收录至
Github: https://github.com/CoderMerli...
Gitee: https://gitee.com/573059382/c...
欢迎关注并star~