以下來自網絡收集,找不到原文出處。此次主要為了面試收集,希望對大家有所幫助~~~~
1.什么是Spring?
Spring是一個開源的Java EE開發框架。Spring框架的核心功能可以應用在任何Java應用程序中,但對Java EE平台上的Web應用程序有更好的擴展性。Spring框架的目標是使得Java EE應用程序的開發更加簡捷,通過使用POJO為基礎的編程模型促進良好的編程風格。
2.Spring有哪些優點?
- 輕量級:Spring在大小和透明性方面絕對屬於輕量級的,基礎版本的Spring框架大約只有2MB。
- 控制反轉(IOC):Spring使用控制反轉技術實現了松耦合。依賴被注入到對象,而不是創建或尋找依賴對象。
- 面向切面編程(AOP): Spring支持面向切面編程,同時把應用的業務邏輯與系統的服務分離開來。
- 容器:Spring包含並管理應用程序對象的配置及生命周期。
- MVC框架:Spring的web框架是一個設計優良的web MVC框架,很好的取代了一些web框架。
- 事務管理:Spring對下至本地業務上至全局業務(JAT)提供了統一的事務管理接口。
- 異常處理:Spring提供一個方便的API將特定技術的異常(由JDBC, Hibernate, 或JDO拋出)轉化為一致的、Unchecked異常。
3. Spring 事務實現方式有哪些?
- 編程式事務管理:這意味着你可以通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
- 聲明式事務管理:這種方式意味着你可以將事務管理和業務代碼分離。你只需要通過注解或者XML配置管理事務。
4.Spring框架的事務管理有哪些優點?
- 它為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。
- 它為編程式事務管理提供了一個簡單的API而非一系列復雜的事務API(如JTA). 它支持聲明式事務管理。
- 它可以和Spring 的多種數據訪問技術很好的融合。
5.spring事務定義的傳播規則
- PROPAGATION_REQUIRED: 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
- PROPAGATION_SUPPORTS: 支持當前事務,如果當前沒有事務,就以非事務方式執行。
- PROPAGATION_MANDATORY: 支持當前事務,如果當前沒有事務,就拋出異常。
- PROPAGATION_REQUIRES_NEW: 新建事務,如果當前存在事務,把當前事務掛起。
- PROPAGATION_NOT_SUPPORTED: 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
- PROPAGATION_NEVER: 以非事務方式執行,如果當前存在事務,則拋出異常。
- PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
6.Spring 事務底層原理
- 划分處理單元——IoC
由於spring解決的問題是對單個數據庫進行局部事務處理的,具體的實現首先用spring中的IoC划分了事務處理單元。並且將對事務的各種配置放到了ioc容器中(設置事務管理器,設置事務的傳播特性及隔離機制)。
- AOP攔截需要進行事務處理的類
Spring事務處理模塊是通過AOP功能來實現聲明式事務處理的,具體操作(比如事務實行的配置和讀取,事務對象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對象,通過TransactionInterceptor完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。讀取ioc容器事務配置屬性,轉化為spring事務處理需要的內部數據結構(TransactionAttributeSourceAdvisor),轉化為TransactionAttribute表示的數據對象。
- 對事務處理實現(事務的生成、提交、回滾、掛起)
spring委托給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理器:DataSource數據源支持、hibernate數據源事務處理支持、JDO數據源事務處理支持,JPA、JTA數據源事務處理支持。這些支持都是通過設計PlatformTransactionManager、AbstractPlatforTransaction一系列事務處理的支持。 為常用數據源支持提供了一系列的TransactionManager。
- 結合
PlatformTransactionManager實現了TransactionInterception接口,讓其與TransactionProxyFactoryBean結合起來,形成一個Spring聲明式事務處理的設計體系。
7. Spring的單例實現原理
Spring框架對單例的支持是采用單例注冊表的方式進行實現的,而這個注冊表的緩存是HashMap對象,如果配置文件中的配置信息不要求使用單例,Spring會采用新建實例的方式返回對象實例。
8. 有哪些不同類型的IOC(依賴注入)?
-
構造器依賴注入:構造器依賴注入在容器觸發構造器的時候完成,該構造器有一系列的參數,每個參數代表注入的對象。
-
Setter方法依賴注入:首先容器會觸發一個無參構造函數或無參靜態工廠方法實例化對象,之后容器調用bean中的setter方法完成Setter方法依賴注入。
-
注解注入:基於@Autowired的自動裝配,默認是根據類型注入,可以用於構造器、字段、方法注入。
9. 你推薦哪種依賴注入?構造器依賴注入還是Setter方法依賴注入?
你可以同時使用兩種方式的依賴注入,最好的選擇是使用構造器參數實現強制依賴注入,使用setter方法實現可選的依賴關系。
10.簡述一下Spring框架?
概念
- Spring致力於Java EE應用的各種解決方案,是一款輕量級框架,大大簡化了Java企業級開發,提供了強大、穩定的功能。
- Spring主要有兩個目標:一是讓先有技術更易於使用,二是促進良好的編程習慣(或者稱為最佳實踐)
優點
-
輕量級:Spring在大小和透明性方面絕對屬於輕量級的,基礎版本的Spring框架大約只有2MB
-
控制反轉(IOC):Spring使用控制反轉技術實現了松耦合。依賴被注入到對象,而不是創建或尋找依賴對象。
-
方便解耦,簡化開發:Spring就是一個大工廠,可以將所有對象創建和依賴關系維護,交給Spring管理
-
AOP編程的支持:Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能
-
聲明式事務的支持:只需要通過配置就可以完成對事務的管理,而無需手動編程
-
方便集成各種優秀框架:Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持
-
降低JavaEE API的使用難度:Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低
11.簡單介紹一下Spring七大模塊?
-
Spring Core:Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關系和配置。
-
Spring Context:構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的對象訪問方法,有些象JNDI注冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創建,比如說通過Servlet容器。
-
Spring DAO:DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 並且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不僅僅是實現了特定接口,而且對所有的POJOs(plain old Java objects)都適用。
-
Spring ORM:ORM 封裝包提供了常用的“對象/關系”映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“對象/關系”映射,如前邊提到的簡單聲明性事務管理。
-
Spring AOP:Spring的 AOP 封裝包提供了符合AOP Alliance規范的面向方面的編程實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數據功能,還可以將各種行為信息合並到你的代碼中。
-
Spring Web:Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。
-
Spring Web MVC:Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和Web Form之間。並且,還可以借助Spring框架的其他特性。
12. Spring中的設計模式
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功能的原理就使用代理模式(1、JDK動態代理。2、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不需要繼承的另一種實現方式吧。
13.ApplicationContext與BeanFactory的區別
兩者都是通過xml配置文件加載bean,ApplicationContext
和BeanFacotry
相比,提供了更多的擴展功能,但其主要區別在於后者是延遲加載,如果Bean的某一個屬性沒有注入,BeanFacotry
加載后,直至第一次使用調用getBean方法才會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;所以通常情況下我們選擇使用ApplicationContext。
BeanFactroy
采用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean
時(調用getBean()),才對該Bean進行加載實例化,這樣,我們就不能發現一些存在的Spring
的配置問題。而ApplicationContext
則相反,它是在容器啟動時,一次性創建了所有的Bean
。這樣,在容器啟動時,我們就可以發現Spring
中存在的配置錯誤。
BeanFactory
和ApplicationContext
都支持BeanPostProcessor
、BeanFactoryPostProcessor
的使用,但兩者之間的區別是:BeanFactory
需要手動注冊,而ApplicationContext
則是自動注冊
14. 如何理解IoC和DI?
IOC:
IOC就是控制反轉,通俗的說就是我們不用自己創建實例對象,這些都交給Spring的bean工廠幫我們創建管理。這也是Spring的核心思想,通過面向接口編程的方式來是實現對業務組件的動態依賴。這就意味着IOC是Spring針對解決程序耦合而存在的。在實際應用中,Spring通過配置文件(xml或者properties)指定需要實例化的java類(類名的完整字符串),包括這些java類的一組初始化值,通過加載讀取配置文件,用Spring提供的方法(getBean())就可以獲取到我們想要的根據指定配置進行初始化的實例對象。
- 優點:IOC或依賴注入減少了應用程序的代碼量。它使得應用程序的測試很簡單,因為在單元測試中不再需要單例或JNDI查找機制。簡單的實現以及較少的干擾機制使得松耦合得以實現。IOC容器支持勤性單例及延遲加載服務。
** DI:DI—Dependency** Injection,即“依賴注入”:組件之間依賴關系由容器在運行期決定,形象的說,即由容器動態的將某個依賴關系注入到組件之中。依賴注入的目的並非為軟件系統帶來更多功能,而是為了提升組件重用的頻率,並為系統搭建一個靈活、可擴展的平台。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。
15.介紹一下AOP相關術語?
-
切面(Aspect):被抽取的公共模塊,可能會橫切多個對象。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @AspectJ 注解來實現。
-
連接點(Join point):指方法,在Spring AOP中,一個連接點 總是 代表一個方法的執行。
-
通知(Advice):在切面的某個特定的連接點(Join point)上執行的動作。通知有各種類型,其中包括“around”、“before”和“after”等通知。許多AOP框架,包括Spring,都是以攔截器做通知模型, 並維護一個以連接點為中心的攔截器鏈。
-
切入點(Pointcut):切入點是指 我們要對哪些Join point進行攔截的定義。通過切入點表達式,指定攔截的方法,比如指定攔截add、search。
-
引入(Introduction):(也被稱為內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。
-
目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做 被通知(adviced) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。
-
織入(Weaving):指把增強應用到目標對象來創建新的代理對象的過程。Spring是在運行時完成織入。
切入點(pointcut)和連接點(join point)匹配的概念是AOP的關鍵,這使得AOP不同於其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立於OO層次。 例如,一個提供聲明式事務管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業務操作)。
16.你是如何理解Spring AOP?
概念
面向切面編程。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
做動態代理的。
17. Spring中有哪些增強處理,區別?
- 前置增強:org.springframework.aop.BeforeAdvice代表前置增強,表示在目標方法整形前實施增強
- 后置增強:org.springframework.aop.AfterReturningAdvice代表后置增強,表示在目標方法執行后實施增強
- 環繞增強:org.springframework.aop.MethodInterceptor代表環繞增強,表示在目標方法執行前后實施增強
- 異常拋出增強 :org.springframework.aop.ThrowsAdvice代表拋出異常增強,表示在目標方法拋出異常后實施增強
- 引介增強:org.springframework.aop.IntroductionInterceptor代表引介增強,表示在目標類中添加一些新的方法和屬性
18. Spring中支持的Bean作用域有哪些?
支持如下五種不同的作用域
- Singleton(默認):在Spring IOC容器中僅存在一個Bean實例,Bean以單實例的方式存在。
- Prototype:一個bean可以定義多個實例
- Request:每次HTTP請求都會創建一個新的Bean。該作用域僅適用於WebApplicationContext環境。
- Session:一個HTTP Session定義一個Bean。該作用域僅適用於WebApplicationContext環境.
- GolbalSession:同一個全局HTTP Session定義一個Bean。該作用域同樣僅適用於WebApplicationContext環境.
19.如何定義bean的作用域?
在Spring
中創建一個bean
的時候,我們可以聲明它的作用域。只需要在bean
定義的時候通過scope
屬性定義即可。例如,當Spring
需要產生每次一個新的bean
實例時,應該聲明bean
的scope
屬性為prototype
。如果每次你希望Spring
返回一個實例,應該聲明bean
的scope
屬性為singleton
。
20.說一說Spring框架中的bean的生命周期?
- Spring容器讀取XML文件中bean的定義並實例化bean。
- Spring根據bean的定義設置屬性值。
- 如果該Bean實現了BeanNameAware接口,Spring將bean的id傳遞給setBeanName()方法。
- 如果該Bean實現了BeanFactoryAware接口,Spring將beanfactory傳遞給setBeanFactory()方法。
- 如果任何bean BeanPostProcessors 和該bean相關,Spring調用postProcessBeforeInitialization()方法。
- 如果該Bean實現了InitializingBean接口,調用Bean中的afterPropertiesSet方法。如果bean有初始化函數聲明,調用相應的初始化方法。
- 如果任何bean BeanPostProcessors 和該bean相關,調用postProcessAfterInitialization()方法。
- 如果該bean實現了DisposableBean,調用destroy()方法。
21.哪些是最重要的bean生命周期方法,是否能重寫它們?
有兩個重要的bean
生命周期方法。
- 第一個是
setup
方法,該方法在容器加載bean
的時候被調用。 - 第二個是
teardown
方法,該方法在bean
從容器中移除的時候調用。
bean標簽有兩個重要的屬性(init-method 和 destroy-method),你可以通過這兩個屬性定義自己的初始化方法和析構方法。
Spring也有相應的注解:@PostConstruct
和@PreDestroy
。
22.有幾種不同類型的自動代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
23. 什么是Spring的內部bean?
當一個bean僅被用作另一個bean的屬性時,它能被聲明為一個內部bean,為了定義inner bean,在Spring 的 基於XML的 配置元數據中,可以在 或 元素內使用 元素,內部bean通常是匿名的,它們的Scope一般是prototype。
24. Spring中自動裝配的方式有哪些?
- no:不進行自動裝配,手動設置Bean的依賴關系。
- byName:根據Bean的名字進行自動裝配。
- byType:根據Bean的類型進行自動裝配。
- constructor:類似於byType,不過是應用於構造器的參數,如果正好有一個Bean與構造器的參數類型相同則可以自動裝配,否則會導致錯誤。
- autodetect:如果有默認的構造器,則通過constructor的方式進行自動裝配,否則使用byType的方式進行自動裝配。
說明:自動裝配沒有自定義裝配方式那么精確,而且不能自動裝配簡單屬性(基本類型、字符串等),在使用時應注意。
25.你可以在Spring中注入null或空字符串嗎?
完全可以。
26. 不同版本的 Spring Framework 有哪些主要功能?
Version | Feature |
---|---|
Spring 2.5 | 發布於 2007 年。這是第一個支持注解的版本。 |
Spring 3 | 發布於 2009 年。它完全利用了 Java5 中的改進,並為 JEE6 提供了支持。 |
Spring 4.0 | 發布於 2013 年。這是第一個完全支持 JAVA8 的版本。。 |
27.spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工作。這使得用戶容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。
28. 列舉 Spring DAO 拋出的異常。
spring-data-access-exception
29. spring JDBC API 中存在哪些類?
- JdbcTemplate
- SimpleJdbcTemplate
- NamedParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
30.Spring AOP and AspectJ AOP 有什么區別?
Spring AOP
基於動態代理方式實現;AspectJ
基於靜態代理方式實現。
Spring AOP
僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。
推薦
大廠筆試內容集合(內有詳細解析) 持續更新中....
文末
歡迎關注個人微信公眾號:Coder編程
歡迎關注Coder編程公眾號,主要分享數據結構與算法、Java相關知識體系、框架知識及原理、Spring全家桶、微服務項目實戰、DevOps實踐之路、每日一篇互聯網大廠面試或筆試題以及PMP項目管理知識等。更多精彩內容正在路上~
新建了一個qq群:315211365,歡迎大家進群交流一起學習。謝謝了!也可以介紹給身邊有需要的朋友。
文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~