了(le/liǎo)解最新公司動态及行業資訊
現在(zài)微信小程序越來(lái)越火了(le/liǎo),相信不(bù)少人(rén)都通過各種途徑學習過微信小程序或者嘗試開發,作者就(jiù)是(shì)曾經由于(yú)興趣了(le/liǎo)解開發過微信小程序,所以(yǐ)現在(zài)用這(zhè)篇博客記錄我之(zhī)前開發的(de)一(yī / yì /yí)些經驗和(hé / huò)一(yī / yì /yí)些心得吧。
這(zhè)些基礎的(de)東西我就(jiù)不(bù)過多介紹,大(dà)家在(zài)剛開始開發的(de)時(shí)候一(yī / yì /yí)般都沒有自己的(de)服務器及域名,所以(yǐ)大(dà)家在(zài)本地(dì / de)編寫的(de)時(shí)候,在(zài)“詳細”下的(de)“項目設置”裏面将“不(bù)校驗域名安全性”勾選。
至于(yú)微信小程序的(de)組件,即前端頁面的(de)開發希望大(dà)家耐住寂寞認真在(zài)微信開發平台上(shàng)。
組件:
https://developers.weixin.qq.com/miniprogram/dev/component/
api:
https://developers.weixin.qq.com/miniprogram/dev/api/
我在(zài)後端編寫主要(yào / yāo)是(shì)用java,當然對其他(tā)開發語言熟悉的(de)也(yě)可以(yǐ)使用其他(tā)語言開發後端。現在(zài)我就(jiù)java編寫後端api的(de)講解。主要(yào / yāo)框架springboot,開發工具myeclipse,服務器阿裏雲服務器。
創建一(yī / yì /yí)個(gè)maven項目,導入相關依賴:
pom.xml依賴
org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE org.springframework.boot spring-boot-starter-freemarker org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.apache.tomcat.embed tomcat-embed-jasper在(zài)配置文件src/main/resources/下創建application.properties文件可以(yǐ)修改一(yī / yì /yí)些配置參數等。
#jsp支持 spring.mvc.view.suffix=.jsp spring.mvc.view.prefix=/WEB-INF/jsp/ #this is set port #server.port=80 server.port=443 #添加ssl證書 #ssl證書文件名 server.ssl.key-store=classpath:xxxxxxx.pfx server.ssl.key-store-password=xxxxxxxx server.ssl.keyStoreType=xxxxxxxx在(zài)實際項目中可能涉及數據庫,還要(yào / yāo)整合mybatis,在(zài)文章中,我僅僅做測試就(jiù)不(bù)做使用數據庫的(de)測試。
首先創建springboot的(de)入口程序:app.class下面貼上(shàng)代碼:
@ComponentScan(basePackages= "com.bin")//添加掃包@ComponentScan(basePackages= "") @EnableAutoConfiguration public class App{ //啓動springboot public static void main(String[] args) { SpringApplication.run(App.class, args); } }啓動項目時(shí)直接右擊run即可。
在(zài)寫一(yī / yì /yí)個(gè)測試的(de)controller進行微信小程序與java後端實現通信,controller代碼如下:
@RestController @SpringBootApplication public class ControllerText { @RequestMapping("getUser") public Map getUser(){ System.out.println("微信小程序正在(zài)調用。。。"); Map map = new HashMap(); List list = new ArrayList(); list.add("zhangsan"); list.add("lisi"); list.add("wanger"); list.add("mazi"); map.put("list",list); System.out.println("微信小程序調用完成。。。"); return map; } @RequestMapping("getWord") public Map getText(String word){ Map map = new HashMap(); String message = "我能力有限,不(bù)要(yào / yāo)爲(wéi / wèi)難我"; if ("後來(lái)".equals(word)) { message="正在(zài)熱映的(de)後來(lái)的(de)我們是(shì)劉若英的(de)處女作。"; }else if("微信小程序".equals(word)){ message= "想獲取更多微信小程序相關知識,請更多的(de)閱讀微信官方文檔,還有其他(tā)更多微信開發相關的(de)内容,學無止境。"; }else if("西安工業大(dà)學".equals(word)){ message="西安工業大(dà)學(Xian Technological University)簡稱”西安工大(dà)“,位于(yú)世界曆史名城古都西安,是(shì)中國(guó)西北地(dì / de)區唯一(yī / yì /yí)一(yī / yì /yí)所以(yǐ)兵工爲(wéi / wèi)特色,以(yǐ)工爲(wéi / wèi)主,理、文、經、管、法協調發展的(de)教學研究型大(dà)學。原中華人(rén)民共和(hé / huò)國(guó)兵器工業部直屬的(de)七所本科院校之(zhī)一(yī / yì /yí)(“兵工七子(zǐ)”),陝西省重點建設的(de)高水平教學研究型大(dà)學、陝西省人(rén)民政府與中國(guó)兵器工業集團、國(guó)防科技工業局共建高校、教育部“卓越工程師教育培養計劃”試點高校、陝西省大(dà)學生創新能力培養綜合改革試點學校。國(guó)家二級保密資格單位,是(shì)一(yī / yì /yí)所以(yǐ)\"軍民結合,寓軍于(yú)民\"的(de)國(guó)防科研高校。"; } map.put("message", message); return map; } @RequestMapping("") public String getText(){ return "hello world"; } }至此簡易的(de)後端框架及測試基本完成。
說(shuō)明:@RestController與@Controller注解的(de)區别@RestController相當于(yú)兩個(gè)注解,它能實現将後端得到(dào)的(de)數據在(zài)前端頁面(網頁)中以(yǐ)json串的(de)形式傳遞。而(ér)微信小程序與後台之(zhī)間的(de)數據傳遞就(jiù)是(shì)以(yǐ)json報文的(de)形式傳遞。所以(yǐ)這(zhè)就(jiù)是(shì)選擇springboot框架開發小程序後端的(de)主要(yào / yāo)原因之(zhī)一(yī / yì /yí)。可以(yǐ)方面我們進行小程序的(de)後端開發。
在(zài)完成了(le/liǎo)小程序的(de)後端開發,下面進行小程序端發起網絡請求。
下面以(yǐ)一(yī / yì /yí)個(gè)簡單的(de)按鈕請求數據爲(wéi / wèi)例:
wxml文件
點擊發起請求 姓名:{{item}}js文件
/** * 頁面的(de)初始數據 */ data: { list: , word: , message: }, houduanButton1: function () { var that = this; wx.request({ url: http://localhost:443/getUser, method: GET, header: { content-type: application/json // 默認值 }, success: function (res) { console.log(res.data)//打印到(dào)控制台 var list = res.data.list; if (list == null) { var toastText = 數據獲取失敗; wx.showToast({ title: toastText, icon: , duration: 2000 }); } else { that.setData({ list: list }) } } }) }主要(yào / yāo)調用的(de)api就(jiù)是(shì)wx.request,想知道(dào)将詳細的(de)介紹大(dà)家可以(yǐ)去微信公衆平台(
https://developers.weixin.qq.com/miniprogram/dev/api/)。接下來(lái)以(yǐ)搜索類型的(de)請求爲(wéi / wèi)例:
wxml文件:
查詢 {{message}}js文件:變量的(de)定義見上(shàng)一(yī / yì /yí)個(gè)js文件
//獲取輸入框的(de)内容 houduanTab_input: function (e) { this.setData({ word: e.detail.value }) }, // houduanButton2的(de)網絡請求 houduanButton2: function () { var that = this; wx.request({ url: http://localhost:443/getWord, data:{ word: that.data.word }, method: GET, header: { content-type: application/json // 默認值 }, success: function (res) { console.log(res.data)//打印到(dào)控制台 var message = res.data.message; if (message == null) { var toastText = 數據獲取失敗; wx.showToast({ title: toastText, icon: , duration: 2000 }); } else { that.setData({ message: message }) } } }) }至此已經完成了(le/liǎo)簡易的(de)微信小程序端與java後端進行通信。
現在(zài)可以(yǐ)在(zài)啓動後端項目在(zài)微信開發工具上(shàng)進行測試。
演示效果:
所以(yǐ)至此已經完成了(le/liǎo)小程序的(de)前後端通信。
其實也(yě)不(bù)算什麽申請,在(zài)購買域名之(zhī)後可以(yǐ)申請免費的(de)ssl證書,在(zài)前面的(de)配置文件application.properties中有證書的(de)配置,将證書的(de)pfx文件直接添加到(dào)後端項目下即可。
對于(yú)springboot項目,本人(rén)建議打jar,直接在(zài)服務器上(shàng)部署即可,在(zài)服務器上(shàng)隻需要(yào / yāo)安裝對應版本的(de)jdk即可。項目部署命令:
我購買的(de)是(shì)阿裏雲的(de)輕量級應用服務器部署的(de)。比較劃算吧。
運行命令: nohup java -jar helloworld.jar &nohup的(de)意思不(bù)挂服務,常駐的(de)意思,除非雲服務器重啓,那就(jiù)沒法了(le/liǎo);最後一(yī / yì /yí)個(gè)&表示執行命令後要(yào / yāo)生成日志文件nohup.out,當然還可以(yǐ)使用java -jar helloworld.jar。
Redis雖然是(shì)用C語言寫的(de),但卻沒有直接用C語言的(de)字符串,而(ér)是(shì)自己實現了(le/liǎo)一(yī / yì /yí)套字符串。目的(de)就(jiù)是(shì)爲(wéi / wèi)了(le/liǎo)提升速度,提升性能,可以(yǐ)看出(chū)Redis爲(wéi / wèi)了(le/liǎo)高性能也(yě)是(shì)煞費苦心。
Redis構建了(le/liǎo)一(yī / yì /yí)個(gè)叫做簡單動态字符串(Simple Dynamic String),簡稱SDS
SDS ?什麽鬼?可能對此陌生的(de)朋友對這(zhè)個(gè)名稱有疑惑。隻是(shì)個(gè)名詞而(ér)已不(bù)必在(zài)意,我們要(yào / yāo)重點欣賞借鑒Redis的(de)設計思路。下面畫個(gè)圖來(lái)說(shuō)明,一(yī / yì /yí)目了(le/liǎo)然。
Redis的(de)字符串也(yě)會遵守C語言的(de)字符串的(de)實現規則,即最後一(yī / yì /yí)個(gè)字符爲(wéi / wèi)空字符。然而(ér)這(zhè)個(gè)空字符不(bù)會被計算在(zài)len裏頭。
SDS的(de)最厲害最奇妙之(zhī)處在(zài)于(yú)它的(de)Dynamic。動态變化長度。舉個(gè)例子(zǐ)
如上(shàng)圖所示剛開始s1 隻有5個(gè)空閑位子(zǐ),後面需要(yào / yāo)追加 world 6個(gè)字符,很明顯是(shì)不(bù)夠的(de)。那咋辦?Redis會做以(yǐ)下三個(gè)操作:
計算出(chū)大(dà)小是(shì)否足夠開辟空間至滿足所需大(dà)小開辟與已使用大(dà)小len相同長度的(de)空閑free空間(如果len < 1m1mfreelen>= 1M)看到(dào)這(zhè)兒爲(wéi / wèi)止有沒有朋友覺得這(zhè)個(gè)實現跟Java的(de)列表List實現有點類似呢?看完後面的(de)會覺得更像了(le/liǎo)。Spring面試題分享
對于(yú) Spring和(hé / huò) SpringBoot到(dào)底有什麽區别,我聽到(dào)了(le/liǎo)很多答案,剛開始邁入學習 SpringBoot的(de)我當時(shí)也(yě)是(shì)一(yī / yì /yí)頭霧水,随着經驗的(de)積累、我慢慢理解了(le/liǎo)這(zhè)兩個(gè)框架到(dào)底有什麽區别,相信對于(yú)用了(le/liǎo) SpringBoot很久的(de)同學來(lái)說(shuō),還不(bù)是(shì)很理解 SpringBoot到(dào)底和(hé / huò) Spring有什麽區别,看完文章中的(de)比較,或許你有了(le/liǎo)不(bù)同的(de)答案和(hé / huò)看法!
作爲(wéi / wèi) Java開發人(rén)員,大(dà)家都 Spring都不(bù)陌生,簡而(ér)言之(zhī), Spring框架爲(wéi / wèi)開發 Java應用程序提供了(le/liǎo)全面的(de)基礎架構支持。它包含一(yī / yì /yí)些很好的(de)功能,如依賴注入和(hé / huò)開箱即用的(de)模塊,如:
SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest,這(zhè)些模塊縮短應用程序的(de)開發時(shí)間,提高了(le/liǎo)應用開發的(de)效率例如,在(zài) JavaWeb開發的(de)早期階段,我們需要(yào / yāo)編寫大(dà)量的(de)代碼來(lái)将記錄插入到(dào)數據庫中。但是(shì)通過使用 SpringJDBC模塊的(de) JDBCTemplate,我們可以(yǐ)将操作簡化爲(wéi / wèi)幾行代碼。
SpringBoot基本上(shàng)是(shì) Spring框架的(de)擴展,它消除了(le/liǎo)設置 Spring應用程序所需的(de) XML配置,爲(wéi / wèi)更快,更高效的(de)開發生态系統鋪平了(le/liǎo)道(dào)路。
SpringBoot中的(de)一(yī / yì /yí)些特征:
1、創建獨立的(de) Spring
應用。
2、嵌入式 Tomcat、 Jetty、 Undertow容器(無需部署war文件)。
3、提供的(de) starters簡化構建配置
4、盡可能自動配置 spring應用。
5、提供生産指标,例如指标、健壯檢查和(hé / huò)外部化配置
6、完全沒有代碼生成和(hé / huò) XML配置要(yào / yāo)求首先,讓我們看一(yī / yì /yí)下使用Spring創建Web應用程序所需的(de)最小依賴項
org.springframework spring-web 5.1.0.RELEASE org.springframework spring-webmvc 5.1.0.RELEASE與Spring不(bù)同,Spring Boot隻需要(yào / yāo)一(yī / yì /yí)個(gè)依賴項來(lái)啓動和(hé / huò)運行Web應用程序:
org.springframework.boot spring-boot-starter-web 2.0.6.RELEASE在(zài)進行構建期間,所有其他(tā)依賴項将自動添加到(dào)項目中。
另一(yī / yì /yí)個(gè)很好的(de)例子(zǐ)就(jiù)是(shì)測試庫。我們通常使用 SpringTest, JUnit, Hamcrest和(hé / huò) Mockito庫。在(zài) Spring項目中,我們應該将所有這(zhè)些庫添加爲(wéi / wèi)依賴項。但是(shì)在(zài) SpringBoot中,我們隻需要(yào / yāo)添加 spring-boot-starter-test依賴項來(lái)自動包含這(zhè)些庫。
Spring Boot爲(wéi / wèi)不(bù)同的(de)Spring模塊提供了(le/liǎo)許多依賴項。一(yī / yì /yí)些最常用的(de)是(shì):
spring-boot-starter-data-jpaspring-boot-starter-securityspring-boot-starter-testspring-boot-starter-webspring-boot-starter-thymeleaf
有關 starter的(de)完整列表,請查看Spring文檔。
讓我們來(lái)看一(yī / yì /yí)下 Spring和(hé / huò) SpringBoot創建 JSPWeb應用程序所需的(de)配置。
Spring需要(yào / yāo)定義調度程序 servlet,映射和(hé / huò)其他(tā)支持配置。我們可以(yǐ)使用 web.xml 文件或 Initializer類來(lái)完成此操作:
public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.pingfangushi"); container.addListener(new ContextLoaderListener(context)); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }還需要(yào / yāo)将 @EnableWebMvc注釋添加到(dào) @Configuration類,并定義一(yī / yì /yí)個(gè)視圖解析器來(lái)解析從控制器返回的(de)視圖:
@EnableWebMvc @Configuration public class ClientWebConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".jsp"); return bean; } }再來(lái)看 SpringBoot一(yī / yì /yí)旦我們添加了(le/liǎo) Web啓動程序, SpringBoot隻需要(yào / yāo)在(zài) application配置文件中配置幾個(gè)屬性來(lái)完成如上(shàng)操作:
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp上(shàng)面的(de)所有Spring配置都是(shì)通過一(yī / yì /yí)個(gè)名爲(wéi / wèi)auto-configuration的(de)過程添加 Bootweb starter來(lái)自動包含的(de)。
這(zhè)意味着 SpringBoot将查看應用程序中存在(zài)的(de)依賴項,屬性和(hé / huò) bean,并根據這(zhè)些依賴項,對屬性和(hé / huò) bean進行配置。當然,如果我們想要(yào / yāo)添加自己的(de)自定義配置,那麽 SpringBoot自動配置将會退回。
現在(zài)我們來(lái)看下如何在(zài)Spring和(hé / huò)Spring Boot中配置Thymeleaf模闆引擎。
在(zài) Spring中,我們需要(yào / yāo)爲(wéi / wèi)視圖解析器添加 thymeleaf-spring5依賴項和(hé / huò)一(yī / yì /yí)些配置:
@Configuration @EnableWebMvc public class MvcWebConfig implements WebMvcConfigurer { @Autowired private ApplicationContext applicationContext; @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(applicationContext); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine; } @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); registry.viewResolver(resolver); } }SpringBoot1X隻需要(yào / yāo) spring-boot-starter-thymeleaf的(de)依賴項來(lái)啓用 Web應用程序中的(de) Thymeleaf支持。 但是(shì)由于(yú) Thymeleaf3.0中的(de)新功能,我們必須将 thymeleaf-layout-dialect 添加爲(wéi / wèi) SpringBoot2XWeb應用程序中的(de)依賴項。配置好依賴,我們就(jiù)可以(yǐ)将模闆添加到(dào) src/main/resources/templates文件夾中, SpringBoot将自動顯示它們。
爲(wéi / wèi)簡單起見,我們使用框架默認的(de) HTTPBasic身份驗證。讓我們首先看一(yī / yì /yí)下使用 Spring啓用 Security所需的(de)依賴關系和(hé / huò)配置。
Spring首先需要(yào / yāo)依賴 spring-security-web和(hé / huò) spring-security-config 模塊。接下來(lái), 我們需要(yào / yāo)添加一(yī / yì /yí)個(gè)擴展 WebSecurityConfigurerAdapter的(de)類,并使用 @EnableWebSecurity注解:
@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin") .password(passwordEncoder() .encode("password")) .authorities("ROLE_ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }這(zhè)裏我們使用 inMemoryAuthentication來(lái)設置身份驗證。同樣, SpringBoot也(yě)需要(yào / yāo)這(zhè)些依賴項才能使其工作。但是(shì)我們隻需要(yào / yāo)定義 spring-boot-starter-security的(de)依賴關系,因爲(wéi / wèi)這(zhè)會自動将所有相關的(de)依賴項添加到(dào)類路徑中。
SpringBoot中的(de)安全配置與上(shàng)面的(de)相同 。
Spring和(hé / huò) SpringBoot中應用程序引導的(de)基本區别在(zài)于(yú) servlet。Spring使用 web.xml 或 SpringServletContainerInitializer作爲(wéi / wèi)其引導入口點。SpringBoot僅使用 Servlet3功能來(lái)引導應用程序,下面讓我們詳細來(lái)了(le/liǎo)解下
Spring支持傳統的(de) web.xml引導方式以(yǐ)及最新的(de) Servlet3+方法。
配置 web.xml方法啓動的(de)步驟
Servlet容器(服務器)讀取 web.xml
web.xml中定義的(de) DispatcherServlet由容器實例化
DispatcherServlet通過讀取 WEB-INF/{servletName}-servlet.xml來(lái)創建 WebApplicationContext。最後, DispatcherServlet注冊在(zài)應用程序上(shàng)下文中定義的(de) bean
使用 Servlet3+方法的(de) Spring啓動步驟
容器搜索實現 ServletContainerInitializer的(de)類并執行 SpringServletContainerInitializer找到(dào)實現所有類 WebApplicationInitializer``WebApplicationInitializer創建具有XML或上(shàng)下文 @Configuration類 WebApplicationInitializer創建 DispatcherServlet與先前創建的(de)上(shàng)下文。
Spring Boot應用程序的(de)入口點是(shì)使用@SpringBootApplication注釋的(de)類
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }默認情況下, SpringBoot使用嵌入式容器來(lái)運行應用程序。在(zài)這(zhè)種情況下, SpringBoot使用 publicstaticvoidmain入口點來(lái)啓動嵌入式 Web服務器。此外,它還負責将 Servlet, Filter和(hé / huò) ServletContextInitializerbean從應用程序上(shàng)下文綁定到(dào)嵌入式 servlet容器。SpringBoot的(de)另一(yī / yì /yí)個(gè)特性是(shì)它會自動掃描同一(yī / yì /yí)個(gè)包中的(de)所有類或 Main類的(de)子(zǐ)包中的(de)組件。
SpringBoot提供了(le/liǎo)将其部署到(dào)外部容器的(de)方式。我們隻需要(yào / yāo)擴展 SpringBootServletInitializer即可:
/** * War部署 * * @author SanLi * Created by 2689170096@qq.com on 2018/4/15 */ public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } @Override public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); servletContext.addListener(new HttpSessionEventPublisher()); } }這(zhè)裏外部 servlet容器查找在(zài)war包下的(de) META-INF文件夾下MANIFEST.MF文件中定義的(de) Main-class, SpringBootServletInitializer将負責綁定 Servlet, Filter和(hé / huò) ServletContextInitializer。
最後,讓我們看看如何打包和(hé / huò)部署應用程序。這(zhè)兩個(gè)框架都支持 Maven和(hé / huò) Gradle等通用包管理技術。但是(shì)在(zài)部署方面,這(zhè)些框架差異很大(dà)。例如,Spring Boot Maven插件在(zài) Maven中提供 SpringBoot支持。它還允許打包可執行 jar或 war包并 就(jiù)地(dì / de)運行應用程序。
在(zài)部署環境中 SpringBoot 對比 Spring的(de)一(yī / yì /yí)些優點包括:
1、
提供嵌入式容器支持
2、使用命令 java -jar獨立運行jar
3、在(zài)外部容器中部署時(shí),可以(yǐ)選擇排除依賴關系以(yǐ)避免潛在(zài)的(de)jar沖突
4、部署時(shí)靈活指定配置文件的(de)選項
5、用于(yú)集成測試的(de)随機端口生成簡而(ér)言之(zhī),我們可以(yǐ)說(shuō) SpringBoot隻是(shì) Spring本身的(de)擴展,使開發,測試和(hé / huò)部署更加方便。項目源碼資料獲取方式:關注小編+轉發文章+私信【 666
】免費獲取!!!
Java八股文面試資料獲取方式:關注小編+轉發文章+私信【 13 】免費獲取!!!上(shàng)一(yī / yì /yí)篇:java開發簡曆模闆「7篇」(java開發)java開發工程師簡曆自我評價,
下一(yī / yì /yí)篇:在(zài)人(rén)工智能開發方面,Java 能與 Python 相媲美嗎?(java開發)java與人(rén)工智能哪個(gè)好就(jiù)業,