Spring初學入門(跟學筆記)

一、Spring概述

Spring是一款主流的Java EE輕量級開源框架。
Spring的核心模塊:IoC(控制反轉,指把創建對象過程交給Spring管理 )、AOP(面向切面編程,在不修改源代碼的基礎上增強代碼功能)

二、Spring入門

2.1 入門案例開發步驟

  1. 引入spring相關依賴
  2. 創建類,定義屬性和方法
  3. 按照spring要求創建配置文件
  4. 在spring配置文件中配置相關信息
  5. 進行測試

2.2 案例開發實例
創建一個spring maven項目名為Spring6,再在Spring6下面創建一個名為Spring-first的模塊,在此模塊下的pom.xml里增加依賴。

<dependencies><!-- 第2.1個spring context依賴(這是spring的基礎依賴) --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.7</version><!--如果是JDK17及以上的,就寫6.0.0版本+--></dependency><!--第2.2個spring junit依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version>
<!--            <scope>test</scope>--></dependency></dependencies>

復制之后,點擊m小圖標進行聯網下載。
在這里插入圖片描述

創建一個User類,里面創建一個add方法。

public class User {public void add(){System.out.println("添加。。。");}
}

創建一個bean.xml,添加配置文件信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--    完成user對象創建-->
<!--    id屬性:唯一標識-->
<!--    class屬性:要創建的對象所在類的全路徑--><bean id="user" class="com.hbnu.spring6.User"/>
</beans>

再寫一個測試類,測試方法調用

public class TestUser {
//這里的注解要導入 import org.junit.Test;@Testpublic void testUser(){//加載spring配置文件,創建對象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");//獲取創建的對象User user = (User) applicationContext.getBean("user");//getBean --> xml文件里的id值System.out.println(user);//使用對象調用方法進行測試user.add();}
}

如果是利用反射創建對象呢?

//利用反射創建對象public void testUserObject1() throws Exception {Class clazz=Class.forName("com.hbnu.spring6.User");//調用方法創建對象User user = (User) clazz.getDeclaredConstructor().newInstance();System.out.println(user);user.add();}

三、容器:IoC

IoC是Inversion of Control的簡寫,譯為”控制反轉”,是一種設計思想(不是一種技術),是一個重要的面向對象編程法則,是Spring框架中最重要的核心組件之一。
Spring通過IoC容器來管理所有的Java對象的實例化和初始化,控制對象與對象之間的依賴關系。我們將由IoC容器管理的Java對象稱為Spring Bean,它與new一個對象沒有區別。

控制反轉,反轉的是什么?

  • 將對象的創建權力交出去,交給第三方容器負責
  • 將對象和對象之間關系的維護權交出去,交給第三方容器負責

控制反轉這種思想如何實現?

  • DI :依賴注入

3.1 依賴注入
指Spring創建對象的過程中,將對象依賴屬性通過配置進行注入
常見方式包括兩種:

  • set注入
  • 構造注入

3.2 IoC容器在Spring的實現

IoC容器中管理的組件也叫做bean,在創建bean之前,首先要創建IoC容器。Spring提供了兩種實現方式:

BeanFactory 是IoC容器的基本實現,是Spring內部使用的接口,面向Spring本身,不提供給開發人員

ApplicationContext 是BeanFactory的子接口,提供了更多高級特性,面向Spring的使用者

ApplicationContext的主要實現類:
在這里插入圖片描述

3.3 基于xml管理bean

1.獲取bean

xml文件里配置id值

<bean id="user" class="com.hbnu.spring6.User"/>

①根據id獲取

public void test1(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = (User) applicationContext.getBean("user");
}

②根據id和類型獲取

public void test2(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = applicationContext.getBean("user",User.class);
}

③根據類型獲取

public void test3(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = applicationContext.getBean(User.class);
}

且當根據類型獲取bean的時候,要求ioc容器里指定類型(class)的bean只允許有一個,配置了兩個會報錯。即下面兩行是錯的。

<bean id="user" class="com.hbnu.spring6.User"/>
<bean id="user1" class="com.hbnu.spring6.User"/>

注意:①如果組件類實現了接口,根據接口類型可以獲取bean嗎?可以,前提是bean唯一 ②如果一個接口有多個實現類,這些實現類都配置了bean,根據接口類型可以獲取bean嗎?不行,因為bean不唯一

以下是錯誤的:

<!--    一個接口實現類獲取過程--><bean id="UserDaoImpl" class="com.hbnu.spring6.bean.UserDaoImpl"/><bean id="PersonDaoImpl" class="com.hbnu.spring6.bean.PersonDaoImpl"/>
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = applicationContext.getBean(UserDao.class);System.out.println(userDao);userDao.run();

2.依賴注入

如果是原生Java,set方法和構造器方法怎么注入?

		//set方法注入Book book=new Book();book.setAuthor("牛頓");//通過構造器注入Book book1=new Book("1","鶴");

接著看用配置文件如何注入。。。

①根據set方法注入
創建一個Book類,定義屬性,生成屬性set方法之后,在spring配置文件里配置。。。

<!--    1.set方法完成注入--><bean id="book" class="com.hbnu.spring6.DI.Book"><property name="bname" value="spring"/><property name="author" value="小唐"/></bean><!--name對應Book類里面的屬性-->

測試一下set方法注入:

@Testpublic void testSet(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-DI.xml");Book book = (Book)applicationContext.getBean("book");System.out.println(book);//Book{bname='spring', author='小唐'}}

輸出Book類里重寫的toString

②根據構造器注入
創建一個Book類,定義屬性,生成有參數的構造方法,在spring配置文件里配置。。。

<!--    2.有參構造注入--><bean id="bookCons" class="com.hbnu.pojo.Book"><constructor-arg name="author" value="小李"/><constructor-arg name="name" value="Spring學習之有參構造注入"/></bean>

測試跟上面一樣,只是配置文件里寫的內容不一樣了

3.特殊值處理

①字面量賦值
②null值 用null標簽表示空值
③xml實體 用&lt;&gt;表示大小尖括號
④CDATA節 <![CDATA[a<b]]>

4.為對象類型屬性賦值

創建兩個類對象:dept和emp
在emp類里寫一個work方法

public class Emp {//對象類型屬性:員工屬于某個部門private Dept dept;private String ename;private String age;public void work(){System.out.println(ename+" is working...");dept.info();}...}

①引用外部bean

    1.引用外部bean注入<bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="安保部"/></bean><bean id="emp" class="com.hbnu.DITest.Emp">
<!--        普通類型屬性注入--><property name="ename" value="lucy"/><property name="age" value="23"/>
<!--        對象類型屬性注入-->
<!--        表示引入外部bean,這里的ref是上面id為dept的值--><property name="dept" ref="dept"/></bean>

②使用內部bean

<!--    2.使用內部bean注入--><bean id="emp" class="com.hbnu.DITest.Emp"><property name="age" value="25"/><property name="ename" value="joey"/><property name="dept"><bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="財務部"/></bean></property></bean>

③ 使用級聯賦值

<!--    3.級聯賦值--><bean id="emp" class="com.hbnu.DITest.Emp"><property name="ename" value="mary"/><property name="age" value="25"/><property name="dept" ref="dept"/><property name="dept.dname" value="測試部"/></bean><bean id="dept" class="com.hbnu.DITest.Dept"><!--這一行可要可不要,僅作參考,上面已經給部門名稱賦值為了測試部--><property name="dname" value="技術部"/></bean>

測試

@Testpublic void testemp(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");Emp emp=applicationContext.getBean("emp",Emp.class);emp.work();}

5.復雜類型注入

①數組類型注入

在 Emp 類里面加一個數組屬性private String[] hobbies;后生成get、set方法,編寫xml文件

<!--    數組類型賦值--><bean id="dept" class="com.hbnu.DITest.Dept"/><bean id="emp" class="com.hbnu.DITest.Emp"><property name="ename" value="tom"/><property name="age" value="34"/><property name="dept" ref="dept"/><property name="hobbies"><array><value>抽煙</value><value>喝酒</value><value>燙頭</value></array></property></bean>

②集合類型注入

在Dept類里加一個員工listprivate List<Emp> empList;,一個部門里可以有多個員工

<!--    為list集合賦值--><bean id="emp1" class="com.hbnu.DITest.Emp"><property name="ename" value="tom1"/><property name="age" value="31"/></bean><bean id="emp2" class="com.hbnu.DITest.Emp"><property name="ename" value="tom2"/><property name="age" value="32"/></bean><bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="技術部"/><property name="empList"><list><ref bean="emp1"></ref><ref bean="emp2"></ref></list></property></bean>

輸出技術部里的員工:

Dept{dname='技術部', empList=[Emp{dept=null, ename='tom1', age='31', hobbies=null}, Emp{dept=null, ename='tom2', age='32', hobbies=null}]}

③map類型注入

創建Student和Teacher類
對于學生來說,一個學生對應多個講師

<!--    map類型注入--><bean id="teacherone" class="com.hbnu.DITest.Teacher"><property name="tid" value="121"/><property name="tname" value="莉莉"/></bean><bean id="teachertwo" class="com.hbnu.DITest.Teacher"><property name="tid" value="122"/><property name="tname" value="小月"/></bean><bean id="student" class="com.hbnu.DITest.Student"><property name="sid" value="111"/><property name="sname" value="張三"/><property name="teacherMap"><map><entry><key><value>10010</value></key><ref bean="teacherone"></ref></entry><entry><key><value>10011</value></key><ref bean="teachertwo"></ref></entry></map></property></bean>

輸出{10010=Teacher{Tname='莉莉', Tid='121'}, 10011=Teacher{Tname='小月', Tid='122'}}

④引用集合類型的bean

創建一個Lesson類(getter、setter、重寫toString),再在Student類里面加一個 public List<Lesson> lessonList;,一個學生有多個老師,選多門課

<bean id="lesson1" class="com.hbnu.DITest.Lesson"><property name="lessonname" value="前端開發"/></bean><bean id="lesson2" class="com.hbnu.DITest.Lesson"><property name="lessonname" value="java開發"/></bean><bean id="teacher1" class="com.hbnu.DITest.Teacher"><property name="tname" value="張老師"/><property name="tid" value="001"/></bean><bean id="teacher2" class="com.hbnu.DITest.Teacher"><property name="tname" value="王老師"/><property name="tid" value="002"/></bean><bean id="student" class="com.hbnu.DITest.Student"><property name="sid" value="1000"/><property name="sname" value="lucy"/><!--        注入list、map類型屬性--><property name="lessonList" ref="lessonlist"/><property name="teacherMap" ref="teachermap"/></bean><util:list id="lessonlist"><ref bean="lesson1"/><ref bean="lesson2"/></util:list><util:map id="teachermap"><entry><key><value>10010</value></key><ref bean="teacher1"/></entry><entry><key><value>10011</value></key><ref bean="teacher2"/></entry></util:map>
</beans>

xml文件的頭部:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

輸出:

{10010=Teacher{Tname='張老師', Tid='001'}, 10011=Teacher{Tname='王老師', Tid='002'}}
[Lesson{lessonname='前端開發'}, Lesson{lessonname='java開發'}]

脫離數據庫思想注入復雜類型,創建一個dataType類,里面擁有private String[] arr;private List<String> lists;private Map<String,String> maps;private Properties properties;屬性,編寫xml文件:

<!--        注入復雜類型--><bean id="dataType" class="com.hbnu.pojo.DataType">
<!--                1.注入數組類型--><property name="arr"><list><value>斯蒂芬金</value><value>毛姆</value><value>陀思妥耶夫斯基</value><value>茨威格</value></list></property><!--                2.注入list集合類型--><property name="lists"><list><value>馬克吐溫</value><value>馬克吐溫</value><value>馬克吐溫</value><value>馬克吐溫</value></list></property><!--                3.注入map集合類型--><property name="maps"><map><entry key="username" value="雨果"/><entry key="age" value="1984"/></map></property><!--                4.注入properties--><property name="properties"><props><prop key="driverClass">com.mysql.cj.jdbc.Driver</prop><prop key="url">jdbc:mysql://localhost:3306/class2110?serverTimezone=GMT&amp;useSSL=false</prop><prop key="username">root</prop><prop key="password">123456</prop></props></property></bean>

6.p命名空間

<!--    p命名空間注入--><bean id="studentp" class="com.hbnu.DITest.Student"p:sid="100" p:sname="mary" p:lessonList-ref="lessonlist" p:teacherMap-ref="teachermap">

頭部加一行

xmlns:p="http://www.springframework.org/schema/p"

7.bean的作用域

概念
在Spring中可以通過配置bean標簽的scope屬性來指定bean的作用域范圍

取值含義創建對象的時機
singleton在IOC容器中,這個bean的對象始終為單實例IOC容器初始化時
prototype這個bean在IOC容器中有多個實例獲取bean時
    @Testpublic void testOrders(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");Orders orders=applicationContext.getBean("orders",Orders.class);Orders orders2=applicationContext.getBean("orders",Orders.class);System.out.println(orders);System.out.println(orders2);}

8.bean的生命周期

1.bean對象創建(調用無參數構造)
2.給bean對象設置相關屬性
3.bean后置處理器(初始化之前)
4.bean對象初始化(調用指定初始化方法)
5.bean后置處理器(初始化之后)
6.bean對象創建完成
7.bean對象銷毀(配置指定銷毀的方法)
8.IoC容器關閉

3.4 基于注解管理bean
步驟:1.引入依賴 2.開啟組件掃描 3.使用注解定義bean 4.依賴注入

1.開啟組件掃描
開啟組件掃描(開啟此功能后,spring就會自動從掃描指定的包,及其子包下的所有類。如果類上使用了@Component注解,就將該類裝配到容器中)

<context:component-scan base-package="com.hbnu"></context:component-scan>

2.使用注解定義bean

注解說明
@Component該注解用于描述Spring中的bean,僅僅表示容器中的一個組件,并且可以作用在應用的任何層次,例如Service層,Dao層。
@Repository該注解用于將數據訪問層(Dao層)的類標識為S加粗樣式pring中的bean,其功能與@Component相同
@Service該注解通常作用在業務層(Service層),用于將業務層的類標識為Spring中的bean,其功能與@Component相同
@Controller該注解通常作用在控制層(如SpringMVC中的Controller),用于將控制層的類標識為Spring中的bean,其功能與@Component相同

3.@Autowired注入

注入可以理解為導包,注入后就可以調用方法
在controller里注入service,在service里注入dao

寫個測試感受一下@Autowired注入…項目結構如下:
在這里插入圖片描述
首先在bean.xml里編寫代碼進行包掃描,然后創建UserDao以及其實現類,
在這里插入圖片描述
在這里插入圖片描述

接著創建UserService以及其實現類,并將UserDao注入到UserService中。
在這里插入圖片描述
在這里插入圖片描述
最后創建UserController,將UserService注入后進行測試。
在這里插入圖片描述

public class Test {public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");UserController userController=applicationContext.getBean(UserController.class);userController.add();}
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13321.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI大語言模型在公共服務中的應用實例

隨著計算機技術的飛速發展&#xff0c;人工智能已經成為了當今科技領域的熱門話題。從早期的圖靈測試到現在的深度學習和神經網絡&#xff0c;人工智能已經取得了令人矚目的成就。特別是近年來&#xff0c;大數據、云計算、高性能計算等技術的發展為人工智能的研究提供了更加廣…

【Linux深度學習5.15(堡壘機)】

JumpServer堡壘機 使用堡壘機管理服務器 一. 環境 1.將jump壓縮包上傳至服務器并解壓2.安裝jump server./jumpserver install一直選擇默認就可以3.啟動jumpserver./jumpserver start4.測試windows : 瀏覽器訪問ipLinux : ssh -p2222 adminip5.登錄賬號 : admin 密碼 : admin…

多客陪玩系統源碼,線上游戲開黑陪玩,線下預約家政服務,語音陪聊,陪玩成品搭建,源碼交付,支持二開,陪玩系統開發

游戲陪玩系統主要的優勢就是&#xff0c;只要有手游和網游不斷推出&#xff0c;就有錢可賺。為什么呢?因為電競行業正處于上升發展階段&#xff0c;而且玩游戲對于現代人來說是很好的一種解壓方式&#xff0c;所以在市場和用戶需求方面都是有保證的。再加上現代人的社交壓力越…

使用 5 種有用的方法將音樂從 iTunes 傳輸到安卓手機

有許多在線音樂應用程序可供您選擇&#xff0c;但如果您想在 安卓手機上欣賞 iTunes 音樂&#xff0c;您需要了解步驟。今天的主題是如何將音樂從 iTunes 傳輸到 安卓設備上。雖然沒有適用于 Android 的 iTunes&#xff0c;但您可以在此處獲取 5 種有用的方法將 iTunes 音樂傳輸…

Nginx-04-Docker Nginx

Docker Nginx 實戰 HTTP 服務 Nginx 的最大作用&#xff0c;就是搭建一個 Web Server。 有了容器&#xff0c;只要一行命令&#xff0c;服務器就架設好了&#xff0c;完全不用配置。 運行官方 image $ docker container run \-d \-p 8080:80 \--rm \--name mynginx \nginx…

突破性能瓶頸: Java 22的性能提升之旅

Java 22帶來的性能改進&#xff0c;特別是在垃圾回收&#xff08;GC&#xff09;方面的優化&#xff0c;對于實時系統有著顯著的影響。實時系統要求在保證高響應性的同時&#xff0c;還需要保持較高的可靠性和穩定性。以下是一些關鍵點&#xff0c;展示了Java 22性能改進對于實…

Java進階-SpringCloud設計模式-工廠模式的設計與詳解

在Java和Spring Cloud的上下文中&#xff0c;雖然Spring Cloud本身并沒有直接實現傳統的設計模式&#xff08;如工廠模式&#xff09;&#xff0c;但理解設計模式如何與Spring框架結合使用是非常重要的。工廠模式是一種創建型設計模式&#xff0c;它提供了一種封裝對象創建過程…

網站開發之前端和后端開發的區別和聯系

隨著互聯網的發展&#xff0c;網站已經成為人們日常生活中不可或缺的一部分。而網站的開發技術也在不斷地發展和更新。在網站開發中&#xff0c;前端和后端是兩個重要的概念。本文將介紹前端和后端的區別與聯系。 一、前端和后端的定義 前端是指網站的用戶界面&#xff0c;包…

【學習筆記】C++每日一記[20240515]

簡述malloc/free與new/delete的區別 malloc/free是C語言提供的庫函數&#xff0c;通過函數調用訪問&#xff0c;需要傳遞參數并接收返回值&#xff1b;而new/delete是C的運算符&#xff0c;有自己的語法規則和運算方式。 malloc/free函數只能應用于基本類型&#xff0c;而new…

.NET使用Microsoft.IdentityModel.Tokens對SAML2.0登錄斷言校驗

如題。使用SAML單點登錄對IDP返回的Response斷言使用微軟提供的Microsoft.IdentityModel.Tokens對斷言&#xff08;Assertion&#xff09;進行校驗。 首先需要安裝Muget包&#xff0c;Microsoft.IdentityModel.Tokens和Microsoft.IdentityModel.Tokens.Saml。 簡易示例代碼如…

手機自養號測評系統:專業應對電商平臺風控,提升賬號穩定性

用手機做自養號測評它具備無限生成不同真實手機底層環境的能力&#xff0c;每個環境都相當于一臺全新的手機設備。通過先進的底層屏蔽技術&#xff0c;我們成功讓亞馬遜等平臺僅能檢測到我們預設的參數&#xff0c;如手機型號、內存、lMEI、序列號、MAC地址以及運營商信息等。每…

Stable Diffusion超詳細教程!本地部署 Stable Diffusion

前言 目前市面上比較權威&#xff0c;并能用于工作中的AI繪畫軟件其實就兩款&#xff1a; Midjourney&#xff08;MJ&#xff09;Stable-Diffusion&#xff08;SD&#xff09; MJ需要付費使用&#xff0c;而SD開源免費&#xff0c;但是上手難度和學習成本略大&#xff0c;并…

變色龍還是樹懶:揭示大型語言模型在知識沖突中的行為

你是知識變色龍還是樹懶?我今天在ICLR學到一個很有趣的術語,叫做證據順序(order of evidence)。 大模型RAG處理知識沖突的探討: 在檢索增強生成(Retrieval-Augmented Generation, RAG)的過程中,技術團隊會將檢索到的前幾名文檔作為證據,并提示(prompt)給大型語言模型(Large La…

電巢直播XR鑒賞|一塊綠幕,閃現進入異星戰爭的現場!

XR場景賞析 在浩瀚的宇宙深處&#xff0c;一顆神秘莫測的異星球映入我們的眼簾&#xff0c;這里&#xff0c;龍卷風與炮火交織&#xff0c;似乎永不停歇。 星球表面散布著無數的飛船殘骸&#xff0c;它們是某場宇宙大戰殘酷的遺存&#xff0c;無聲地訴說著過往的激烈沖突。地面…

LeetCode 3題:無重復字符的最長子串(原創)

【題目描述】 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。示例 2: 輸入: s "bbbbb" 輸出…

Dalsa windows10下安裝流程及部分問題分析

文章目錄 安裝及依賴庫說明切換驅動模式流程問題&#xff1a;通過Dalsa SDK開發后找不到相機&#xff1f;問題&#xff1a;找不到采集卡&#xff1f; 安裝及依賴庫說明 官網(https://www.teledynedalsa.com/en/support/downloads-center/)下載的最新文件&#xff08;20240515&…

Leetcode 404:左葉子之和

給定二叉樹的根節點 root &#xff0c;返回所有左葉子之和。 思路&#xff1a;遍歷樹&#xff0c;尋找左葉子節點&#xff1b; 如果判斷是左葉子節點&#xff0c;就更新sum。 public static int sumOfLeftLeaves(TreeNode root){int sum0;sumcompute(root,sum);return sum;}/…

Elasticsearch 8.1官網文檔梳理 - 十四、Query DSL(ES 查詢語法)

Query DSL Elasticsearch 提供了一種基于JSON 的查詢 DSL (Domain Specific Language) 來定義查詢。可以把查詢 DSL 看作是查詢的 AST&#xff08;Abstract Syntax Tree)&#xff0c;由兩種類型的子句組成: 葉子節點查詢&#xff1a; 葉子查詢子句在特定字段中查找特定值&…

Flutter 中的 DrawerHeader 小部件:全面指南

Flutter 中的 DrawerHeader 小部件&#xff1a;全面指南 在 Flutter 的 Drawer 組件中&#xff0c;DrawerHeader 是一個特殊的部件&#xff0c;用于在抽屜的頂部顯示&#xff0c;通常包含應用的標志、用戶信息、標題或其他重要的視覺元素。DrawerHeader 可以作為一個視覺分隔符…

Vue3 報v-bind is missing expression.vue(34)錯誤的解決方案

一、項目環境 node.js 版本&#xff1a;node-v20.11.1-x64 vscode版本&#xff1a;version 1.89 錯誤截圖 二、可能原因解決方案 2.1 v-bind 與 :src之間存在空格 錯誤示例&#xff1a; <img v-bind :src"imgurl" /> 如果有在 :src 前面寫了 v-bind&…