轉載自:https://www.matools.com/blog/190195945
回答面試題一般都是要講邏輯的,我將從以下三個方面總結以下:
1.spring的工作原理
2.spring的核心技術
3.spring的優缺點
1.spring的工作原理
spring
是按照設計模式精心打造的,它實現了工廠模式的工廠類,這個類名為BeanFactory(接口),在程序中通常使用它的子類ApplicationContext(也是接口)。
spring的核心是IOC(反轉控制)容器,IOC也是一種編程思想,用於實現模塊之間的解耦,在Spring中它的作用是對對象的創建,維護和銷毀等生命周期的控制。IOC:把對象的創建、初始化、銷毀交給spring來管理,而不是由開發者控制,實現控制反轉。
spring是一個大的工廠類,spring的特點就是基於配置,在其配置文件中通過<bean>元素來創建實例對象。
根據業務邏輯來看,對象經常不是獨立的,一個對象的創建往往涉及另一個對象的創建,當然這個對象也要由IOC容器負責,負責的方式就是依賴注入DI,通過反射機制實現。有三種注入方式:(1)接口注入(2)構造器注入(3)Setter方法注入。
2.spring的核心技術
spring的核心技術有:IOC,AOP
java 的 高級特性:反射機制,代理
AOP:面向切面編程,系統中有很多各不相干的類的方法,在這眾多方法中加入某種系統功能的代碼,如加入日志,權限判斷等,AOP可以實現橫切關注點(如日志,安全,緩存和事務管理)與他們所影響的對象之間的解耦。
實現AOP 功能采用的是代理技術,調用代理類,代理類與目標類具有相同的方法聲明。
AOP 在spring中主要表現在兩個方面:提供聲明式的事務管理 、spring支持用戶自定義切面。
spring AOP的使用在另外一位同學的博客中可以看到,我不喜歡造輪子就直接給大家貼一個路徑吧
https://www.cnblogs.com/flowwind/p/4782606.html
<https://www.cnblogs.com/flowwind/p/4782606.html>
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; } }
3.spring 的優缺點
Spring
的核心概念是IOC和AOP,這兩個核心服務的對象算是bean(POJO),定位是一個輕量級的框架,但是隨着他的發展變得很龐大,我們稱它為spring 全家桶。
它具備以下優點:
spring中避免了關鍵字new造成的耦合問題。
spring本身就是一個工廠,不需要再編寫工廠類了。
spring不需要進行明確的引用關系的傳遞,直接通過配置完成
所有框架幾乎都可以在spring中整合在一起使用。
spring編程=factory設計模式+proxy設計模式
當然,它的缺點也是不少的:
spring基於大量的xml 配置文件,使得我們花了大量的時間放在配置上,拖慢了開發的進度,springboot 問世后,提倡代碼優於配置解決了這個問題。
spring
的內容太龐大,隨便打斷點查看的時候會出現十幾二十層代碼,閱覽性不強,在實際開發的過程中spring的角色更像是膠水一樣,充當整合各種技術的角色,同時作為bean的容器。