天天看點

螞蟻金服java研發崗二面“談談你對spring的了解”

1.spring的工作原理

spring 是按照設計模式精心打造的,它實作了工廠模式的工廠類,這個類名為BeanFactory(接口),在程式中通常使用它的子類ApplicationContext(也是接口)。

spring的核心是IOC(反轉控制)容器,IOC也是一種程式設計思想,用于實作子產品之間的解耦,在Spring中它的作用是對對象的建立,維護和銷毀等生命周期的控制。IOC:把對象的建立、初始化、銷毀交給spring來管理,而不是由開發者控制,實作控制反轉。

spring是一個大的工廠類,spring的特點就是基于配置,在其配置檔案中通過元素來建立執行個體對象。

根據業務邏輯來看,對象經常不是獨立的,一個對象的建立往往涉及另一個對象的建立,當然這個對象也要由IOC容器負責,負責的方式就是依賴注入DI,通過反射機制實作。有三種注入方式:

(1)接口注入

(2)構造器注入

(3)Setter方法注入。

2.spring的核心技術

spring的核心技術有:IOC,AOP

java 的 進階特性:反射機制,代理

AOP:面向切面程式設計,系統中有很多各不相幹的類的方法,在這衆多方法中加入某種系統功能的代碼,如加入日志,權限判斷等,AOP可以實作橫切關注點(如日志,安全,緩存和事務管理)與他們所影響的對象之間的解耦。

實作AOP 功能采用的是代理技術,調用代理類,代理類與目标類具有相同的方法聲明。

AOP 在spring中主要表現在兩個方面:提供聲明式的事務管理 、spring支援使用者自定義切面。

AOP主要包括通知(Advice)切點(PointCut)連接配接點(JoinPoint)

下面貼一段在springboot 中使用AOP的代碼

<!-- aop -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
           
@Aspect
@Component
public class ControllerInterceptor {
 
    private final Logger logger = LogManager.getLogger(this.getClass());
    @Pointcut("execution(public * com.example.homework.controller..*(..))")
    public void controllerMethodPointcut(){}
 
    @Before("controllerMethodPointcut()") //指定攔截器規則
    public Object interceptor(JoinPoint jp){
        MethodSignature signature = (MethodSignature) jp.getSignature();
        Method method = signature.getMethod(); //擷取被攔截的方法
        String methodName = method.getName(); //擷取被攔截的方法名
        logger.info("interceptor ***************************");
        logger.info("methodName: "+methodName);
        return null;
    }
}
           
2018-08-21 11:07:22.906  INFO 10392 --- [nio-8088-exec-1] a.s.s.m.AbstractValidatingSessionManager : Enabling session validation scheduler...
2018-08-21 11:07:22.987  INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor   : interceptor ***************************
2018-08-21 11:07:22.987  INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor   : methodName: loginIn
           

3.spring 的優缺點

Spring 的核心概念是IOC和AOP,這兩個核心服務的對象算是bean(POJO),定位是一個輕量級的架構,但是随着他的發展變得很龐大,我們稱它為spring 全家桶。

它具備以下優點:

spring中避免了關鍵字new造成的耦合問題。

spring本身就是一個工廠,不需要再編寫工廠類了。

spring不需要進行明确的引用關系的傳遞,直接通過配置完成

所有架構幾乎都可以在spring中整合在一起使用。

spring程式設計=factory設計模式+proxy設計模式

當然,它的缺點也是不少的:

spring基于大量的xml 配置檔案,使得我們花了大量的時間放在配置上,拖慢了開發的進度,springboot 問世後,提倡代碼優于配置解決了這個問題。

spring 的内容太龐大,随便打斷點檢視的時候會出現十幾二十層代碼,閱覽性不強,在實際開發的過程中spring的角色更像是膠水一樣,充當整合各種技術的角色,同時作為bean的容器。

繼續閱讀