0%

Spring面试大全

一、Spring设计模式

1.1 简单工厂模式

Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

1.2 工厂模式

实质: 实现了FactoryBean接口的bean是一类叫做factory的bean 。

实现方式: FactoryBean

实现原理:因为实现了FactoryBean接口,所以返回的不是SqlSessionFactoryBean的实例,而是它的 SqlSessionFactoryBean.getObject()的返回值。

1.3 单例模式

实质:保证一个类仅有一个实例,并提供一个访问它的全局访问点 (多线程访问,加锁 syncronized)

Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。

1.4 适配器模式

实现场景:SpringMVC中的适配器HandlerAdatper

实现原理:HandlerAdatper根据Handler规则执行不同的Handler

1.5 装饰器模式

实现方式:Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。

1.6 代理模式

实现方式:AOP底层,就是动态代理模式的实现。

Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

1.7 观察者模式

Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。

1.8 策略模式

在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况:

1.9 模板模式

实质:是模板方法模式和回调模式的结合,是Template Method不需要继承的另一种实现方式。Spring几乎所有的外接扩展都采用这种模式。

Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。