Spring-2-透徹理解Spring 注解方式創建Bean--IOC

今日目標

學習使用XML配置第三方Bean

掌握純注解開發定義Bean對象

掌握純注解開發IOC模式

1. 第三方資源配置管理

說明:以管理DataSource連接池對象為例講解第三方資源配置管理

1.1 XML管理Druid連接池(第三方Bean)對象【重點】

數據庫準備

--?創建數據庫
create?database?if?not?exists?spring_druid?character?set?utf8;
use?spring_druid;
--?創建表
create?table?if?not?exists?tbl_account(id?int?primary?key?auto_increment,name?varchar(20),money?double
);
--?插入數據
insert?into?tbl_account?values(null,'張三',1000);
insert?into?tbl_account?values(null,'李四',1000);
--?查詢所有
select?*?from?tbl_account;

1.2 代碼實現XML管理Druid連接池對象(第三方Bean)

【第一步】創建12_1_xml_druid項目

【第二步】Pom.xml添加Druid連接池依賴

?<dependencies><!--導入spring的坐標spring-context,對應版本是5.3.15.RELEASE--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.15</version></dependency><!--?mysql?驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><!--druid包--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.18</version></dependency><!--?導入junit的測試包?--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency>
</dependencies>

【第三步】配置DruidDataSource連接池Bean對象 思考:配置數據庫連接參數時,注入驅動類名是用driverClassName還是driver? 在resources下創建Spring的核心配置文件:application.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"><!--1.創建連接池對象?DruidDataSource實際:??dataSource?=?new?DruidDataSource();--><bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"/><property?name="url"?value="jdbc:mysql://localhost:3306/spring_druid"/><property?name="username"?value="root"/><property?name="password"?value="root"/></bean>
</beans>

【第四步】在測試類中從IOC容器中獲取連接池對象并打印

package?com.zbbmeta;import?org.junit.jupiter.api.Test;
import?org.springframework.context.support.ClassPathXmlApplicationContext;import?javax.sql.DataSource;
import?java.sql.Connection;
import?java.sql.SQLException;public?class?DataSourceTest?{@Testpublic?void?test()?throws?SQLException?{//目標:從IOC容器中獲取德魯伊連接池對象//1.創建IOC容器ClassPathXmlApplicationContext?ac?=new?ClassPathXmlApplicationContext("application.xml");//2.獲取連接池對象和數據庫連接對象DataSource?dataSource?=?ac.getBean(DataSource.class);Connection?connection?=?dataSource.getConnection();//3.打印對象System.out.println("連接池對象:"+dataSource);System.out.println("連接象地址:"+connection);//4.關閉容器ac.close();}
}
  • 控制臺結果:

現在我們的數據庫參數都是寫死在xml文件中的,我們講解druid,是希望大家可以通過這個第三方Bean創建,實現我們舉一反三實現其他第三方Bean的創建

思考:根據上面描述我們向如果有一千個第三方Bean需要創建,那么我們把每一個Bean的參數都寫死在xml里面?

肯定不是的,所以我們要學習如何將參數數據進行提取出來,每一個Bean的參數單獨放一個文件,方便我們查找和修改

1.3 加載properties屬性文件【重點】

目的:將數據庫的連接參數抽取到一個單獨的文件中,與Spring配置文件解耦

1.3.1 properties基本用法

【第一步】在resources下編寫jdbc.properties屬性文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_druid
username=root
jdbc.password=root

【第二步】在application.xml中開啟開啟context命名空間,加載jdbc.properties屬性文件

<context:property-placeholder?location="jdbc.properties"?/>

【第三步】在配置連接池Bean的地方使用EL表達式獲取jdbc.properties屬性文件中的值

????<!--1.創建連接池對象?DruidDataSource實際:??dataSource?=?new?DruidDataSource();-->
<bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"><property?name="driverClassName"?value="${jdbc.driver}"/><property?name="url"?value="${jdbc.url}"/><property?name="username"?value="${username}"/><property?name="password"?value="${jdbc.password}"/>
</bean>

【第四步】配置完成之后,運行之前的獲取Druid連接池代碼

思考:會不會運行成功

不會

嚴重:?create?connection?SQLException,?url:?jdbc:mysql://127.0.0.1:3306/spring_druid,?errorCode?1045,?state?28000
java.sql.SQLException:?Access?denied?for?user?'zbb'@'localhost'?(using?password:?YES)

為什么會出現這樣的問題?

因為我們加載了系統的環變量

  • 解決1:換一個名稱,例如不叫username,叫jdbc.username。(了解)

    【第五步】報錯解決方式:在properties標簽添加屬性

<context:property-placeholder?location="jdbc.properties"?system-properties-mode="NEVER"/>

application.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd?http://www.springframework.org/schema/context?https://www.springframework.org/schema/context/spring-context.xsd"><!--加載properties文件,?ctrl?+?z?撤銷${鍵}:?取鍵對應的值system-properties-mode="NEVER":?不使用系統的環境變量location:?指定properties文件的位置location="jdbc.properties,msg.properties":?加載多個properties文件,?使用,逗號分割location="*.properties":?加載所有的properties文件,如果單元測試加載?src/test/resources里面的所有的properties如果main方法運行加載?src/main/resources里面的所有的propertieslocation="classpath:*.properties"?加載類路徑所有的properties文件,?用在Web應用中location="classpath*:*.properties"?加載類路徑和依賴的jar中所有的properties文件,?用在Web應用中--><context:property-placeholder?location="jdbc.properties"?system-properties-mode="NEVER"/><!--1.創建連接池對象?DruidDataSource實際:??dataSource?=?new?DruidDataSource();--><bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"><property?name="driverClassName"?value="${jdbc.driver}"/><property?name="url"?value="${jdbc.url}"/><property?name="username"?value="${username}"/><property?name="password"?value="${jdbc.password}"/></bean>
<!--????<bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"><property?name="driverClassName"?value="com.mysql.jdbc.Driver"/><property?name="url"?value="jdbc:mysql://localhost:3306/spring_druid"/><property?name="username"?value="root"/><property?name="password"?value="root"/></bean>-->
</beans>

2.Spring容器

2.1 創建容器

  • 方式一:類路徑加載配置文件

ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("application.xml");
  • 方式二:文件路徑加載配置文件

ApplicationContext?ctx?=?new?FileSystemXmlApplicationContext("D:\\application.xml");
  • 加載多個配置文件

ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("bean1.xml",?"bean2.xml");

2.2 Spring容器中獲取bean對象

  • 方式一:使用bean名稱獲取

弊端:需要自己強制類型轉換

DataSource?dataSource?=?(DataSource)ac.getBean("dataSource");
  • 方式二:使用bean名稱獲取并指定類型

弊端:推薦使用

DataSource?dataSource?=?ctx.getBean("dataSource",?DataSource.class);
  • 方式三:使用bean類型獲取

弊端:如果IOC容器中同類型的Bean對象有多個,此處獲取會報錯

DataSource?dataSource?=?ac.getBean(DataSource.class);

2.3 容器類層次結構

  • BeanFactory是IoC容器的頂層接口,初始化BeanFactory對象時,加載的bean延遲加載

  • ApplicationContext接口是Spring容器的核心接口,初始化時bean立即加載

  • ApplicationContext接口提供基礎的bean操作相關方法,通過其他接口擴展其功能

  • ApplicationContext接口常用初始化類
    • ClassPathXmlApplicationContext(常用)

    • FileSystemXmlApplicationContext

    • AnnotationConfigApplicationContext

3. Spring注解開發

3.1 注解開發定義Bean對象【重點】

目的:xml配置Bean對象有些繁瑣,使用注解簡化Bean對象的定義

3.2代碼實現注解開發

【第一步】創建12_2_annotation_ioc

【第二步】Pom.xml添加依賴

<dependencies><!--?spring容器包?--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><!--?junit?--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency>
</dependencies>

【第三步】在application.xml中開啟Spring注解包掃描

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd?http://www.springframework.org/schema/context?https://www.springframework.org/schema/context/spring-context.xsd"><!--開啟IOC基礎包掃描:目的是去到指定包下掃描IOC注解進行IOC功能使用spring框架優勢:可插拔白話:使用這個功能就插入,不用這個功能就拔掉那么這個注解掃描的功能就符合可插拔的特性,配置上IOC注解掃描就進行掃描,不配置不會做掃描--><context:component-scan?base-package="com.zbbmeta"?/>
</beans>

【第四步】在類上使用@Component注解定義Bean。

public?interface?StudentDao?{/***?添加學生*/void?save();
}
package?com.zbbmeta.dao.impl;import?com.zbbmeta.dao.StudentDao;
import?org.springframework.stereotype.Component;/***?@Component*?作用:相當于<bean>標簽,用于創建IOC創建對象并加入IOC容器*?使用方法2種格式:*????@Component?創建對象并且設置對象別名為類名小駝峰,*??????????????與<bean?class="com.zbbmeta.dao.impl.StudentDaoImpl"?id="studentDaoImpl"></bean>功能一樣*????@Component("自定義別名")?創建對象并且設置別名加入IOC容器**???IOC創建對象注解還有衍生的3個*??????@Controller?定義表現層的對象*??????@Service?定義業務層的對象*??????@Repository?定義數據訪問層的對象*??????說明:這3個功能與@Component一樣,只是為了增加可讀性*????????????@Component適合在工具類的上面使用創建對象**/
@Component
public?class?StudentDaoImpl?implements?StudentDao?{@Overridepublic?void?save()?{System.out.println("DAO:?添加學生信息到數據庫...");}
}

補充說明:如果@Component注解沒有使用參數指定Bean的名稱,那么類名首字母小寫就是Bean在IOC容器中的默認名稱。例如:StudentDaoImpl對象在IOC容器中的名稱是studentDaoImpl。

【第五步】在測試類中獲取Bean對象

package?com.zbbmeta;import?com.zbbmeta.dao.StudentDao;
import?org.junit.jupiter.api.Test;
import?org.springframework.context.ApplicationContext;
import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?StudentDaoAnnotationTest?{//目標:獲取注解創建的Bean對象@Testpublic?void?testAnnotation(){//1.根據配置文件application.xml創建IOC容器ApplicationContext?ac?=?new?ClassPathXmlApplicationContext("application.xml");//2.從IOC容器里面獲取id="studentDao"對象StudentDao?studentDao?=?(StudentDao)?ac.getBean("studentDaoImpl");System.out.println(studentDao);}
}

運行結果

com.zbbmeta.dao.impl.StudentDaoImpl@7d64e326

注意:每一個人獲取的地址是不一樣的

3.3 @Component三個衍生注解

說明:加粗的注解為常用注解

  • Spring提供**@Component**注解的三個衍生注解
    • **@Controller**:用于表現層bean定義

    • **@Service**:用于業務層bean定義

    • @Repository:用于數據層bean定義

說明:這3個功能與@Component一樣,只是為了增加可讀性

@Component適合在工具類的上面使用創建對象

@Repository
public?class?StudentDaoImpl?implements?StudentDao?{
}

我們上面代碼雖然類中都使用注解,但是我們還是存在xml,說明現在spring開發還不是完全的注解開發,可以稱為半注解開發

4 Spring純注解開發模式IOC【重點】

問題導入

思考:配置類上使用什么注解進行Spring注解包掃描替代xml中的配置?

4.1 純注解開發模式介紹

  • Spring3.0開啟了純注解開發模式,使用Java類替代配置文件,開啟了Spring快速開發賽道

  • Java類代替Spring核心配置文件

  • @Configuration注解用于設定當前類為配置類

  • @ComponentScan注解用于設定掃描路徑

注意:此注解只能添加一次,多個數據請用數組格式

@ComponentScan({com.zbbmeta.service","com.zbbmeta.dao"})
  • 讀取Spring注解配置類初始化容器對象

//加載配置類初始化容器
ApplicationContext?ctx?=?new?AnnotationConfigApplicationContext(SpringConfig.class);

4.2 代碼演示

【第零步】創建12_3_full_annotation_ioc項目并添加依賴

依賴和上一個項目相同

【第一步】定義配置類代替配置文件

@Configuration?//?指定這個類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//代替<context:component-scan?base-package="com.zbbmeta"?/>
//設置bean掃描路徑,多個路徑書寫為字符串數組格式
//@ComponentScan({com.zbbmeta.service","com.zbbmeta.dao"})
public?class?SpringConfig?{
}

【第二步】在測試類中加載配置類,獲取Bean對象并使用

package?com.zbbmeta;import?com.zbbmeta.config.SpringConfig;
import?com.zbbmeta.service.StudentService;
import?org.junit.jupiter.api.Test;
import?org.springframework.context.ApplicationContext;
import?org.springframework.context.annotation.AnnotationConfigApplicationContext;public?class?StudentDaoAnnotationTest?{//目標:獲取注解創建的Bean對象@Testpublic?void?testAnnotation(){//1.AnnotationConfigApplicationContext加載Spring配置類初始化Spring容器ApplicationContext?ctx?=?new?AnnotationConfigApplicationContext(SpringConfig.class);StudentService?studentService?=?(StudentService)?ctx.getBean("studentServiceImpl");System.out.println(studentService);//按類型獲取beanStudentService?studentService2?=?ctx.getBean(StudentService.class);System.out.println(studentService2);}
}

4.3 注解開發Bean作用范圍和生命周期管理

問題導入

思考:在類上使用什么注解定義Bean的作用范圍?

4.3.1 bean作用范圍注解配置

  • 使用@Scope定義bean作用范圍

@Component
@Scope("singleton")
public?class?StudentUtils?{
}

4.3.2 bean生命周期注解配置

  • 使用@PostConstruct、@PreDestroy定義bean生命周期

package?com.zbbmeta.utils;import?org.springframework.context.annotation.Scope;
import?org.springframework.stereotype.Component;
import?javax.annotation.PostConstruct;
import?javax.annotation.PreDestroy;@Component
@Scope("singleton")
public?class?StudentUtil?{public?StudentUtil()?{System.out.println("Student?constructor?...");}@PostConstructpublic?void?init(){System.out.println("Student?init?...");}@PreDestroypublic?void?destroy(){System.out.println("Student?destory?...");}
}

注意:@PostConstruct和@PreDestroy注解是jdk中提供的注解,從jdk9開始,jdk中的javax.annotation包被移除了,也就是說這兩個注解就用不了了,可以額外導入一下依賴解決這個問題。

<dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version>
</dependency>
  • 測試類

@Test
public?void?testStudentUtil(){//1.AnnotationConfigApplicationContext加載Spring配置類初始化Spring容器AnnotationConfigApplicationContext?ctx?=?new?AnnotationConfigApplicationContext(SpringConfig.class);//按類型獲取beanStudentUtil?studentUtil?=?ctx.getBean(StudentUtil.class);System.out.println(studentUtil);//關閉容器ctx.close();
}

測試結果:

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

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

相關文章

純前端 -- html轉pdf插件總結

一、html2canvasjsPDF&#xff08;文字會被截斷&#xff09;&#xff1a; 將HTML元素呈現給添加到PDF中的畫布對象&#xff0c;不能僅使用jsPDF&#xff0c;需要html2canvas或rasterizeHTML html2canvasjsPDF的具體使用鏈接 二、html2pdf&#xff08;內容顯示不全文字會被截斷…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目錄 [RoarCTF 2019Online Proxy]sql巧妙盲注解題腳本腳本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解題 在源代碼界面發現&#xff1a;Current Ip 我們會聯想到&#xff1a;X-Forwarded-For來修改ip&#xff1a; 結果我們發現&#xff0c;response會講Last Ip回顯出…

Semaphore 原理分析

分析下SemaPhore吧&#xff0c;也是基于AQS實現的&#xff0c;對并發進行控制的工具類&#xff0c;看下其怎么實現的&#xff0c; Semaphore semaphore new Semaphore(3);semaphore.acquire();semaphore.release();Semaphore 常用于控制并發量&#xff0c;比如這里設置為3&…

請教電路高手幫忙Review一下是否可行?

想要實現STM32 3.3V GPIO 控制5V電源通斷&#xff0c;默認狀態為&#xff1a;接通。 使用如下電路圖有無問題&#xff1f;參數是否需要調整&#xff1f;

8.14 ARM

1.練習一 .text 文本段 .global _start 聲明一個_start函數入口 _start: _start標簽&#xff0c;相當于C語言中函數mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop標簽&#xff0c;相當于C語言中函數b stop 跳轉到stop標簽下的第一條…

C++的IO流

C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放在變量中。printf(): 將指定的文字/字符串輸出到標準輸出設備(屏幕)。注意寬度輸出和精度輸出控制。C語言借助了相應的緩沖區來…

javaScript:如何獲取html中的元素對象

目錄 前言&#xff1a; 方法 1.通過id獲取元素 2.通過標簽名獲取元素 3.通過類名class獲取元素 獲取body的方法 1.document.getElementsByTagName(body)[0] 2.document.body 相關代碼 前言&#xff1a; 通過獲取HTML中的元素對象&#xff0c;JavaScript可以對網頁進行動…

學生成績管理系統V1.0

某班有最多不超過30人&#xff08;具體人數由鍵盤輸入&#xff09;參加某門課程的考試&#xff0c;用一維數組作函數參數編程實現如下學生成績管理&#xff1a; &#xff08;1&#xff09;錄入每個學生的學號和考試成績&#xff1b; &#xff08;2&#xff09;計算課程的總分…

Vue [Day7]

文章目錄 自定義創建項目ESlint 代碼規范vuex 概述創建倉庫向倉庫提供數據使用倉庫中的數據通過store直接訪問通過輔助函數 mapState&#xff08;簡化&#xff09;mutations傳參語法(同步實時輸入&#xff0c;實時更新輔助函數 mapMutationsaction &#xff08;異步輔助函數map…

IntelliJ IDEA 2021/2022關閉雙擊shift全局搜索

我這里演示的是修改&#xff0c;刪除是右鍵的時候選擇Remove就好了 IDEA左上角 File-->Settings 找到Navigate -->Search Everywhere &#xff0c;右鍵添加快捷鍵。 OK --> Apply應用

C語言學習之const關鍵字的使用

const修飾變量&#xff1a;const關鍵字修飾變量時&#xff0c;該變量表示是一個只讀變量&#xff0c;不能通過變量名修改變量的值&#xff1b;案例&#xff1a; const int m 20; int const n 30; m 30;//不可以賦值&#xff0c;因為m是只讀變量 n 20;//不可以賦值&#xf…

初始多線程

目錄 認識線程 線程是什么&#xff1a; 線程與進程的區別 Java中的線程和操作系統線程的關系 創建線程 繼承Thread類 實現Runnable接口 其他變形 Thread類及其常見方法 Thread的常見構造方法 Thread類的幾個常見屬性 Thread類常用的方法 啟動一個線程-start() 中斷…

前端食堂技術周刊第 93 期:7 月登陸 Web 平臺的新功能、Node.js 工具箱、Nuxt3 開發技巧、MF 重構方案

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;橙橙冰萃美式 食堂技術周刊倉庫地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童歐巴。歡迎來到前端食堂技術周刊&#xff0c;我們先來…

Android多屏幕支持-Android12

Android多屏幕支持-Android12 1、概覽及相關文章2、屏幕窗口配置2.1 配置xml文件2.2 DisplayInfo#uniqueId 屏幕標識2.3 adb查看信息 3、配置文件解析3.1 xml字段讀取3.2 簡要時序圖 4、每屏幕焦點 android12-release 1、概覽及相關文章 AOSP > 文檔 > 心主題 > 多屏…

如何利用DeepBook自動做市商(AMM),發揮應用的最大價值

盡管Sui宣布DeepBook作為其首個本地流動性層&#xff0c;即中央限價單簿&#xff08;Central Limit Order Book&#xff0c;CLOB&#xff09;&#xff0c;但自動做市商&#xff08;Automated Market Maker&#xff0c;AMM&#xff09;平臺也可以在Sui上發揮作用。事實上&#x…

理解jvm之對象已死怎么判斷?

目錄 引用計數算法 什么是引用 可達性分析算法&#xff08;用的最多的&#xff09; 引用計數算法 定義&#xff1a;在對象中添加一個引用計數器&#xff0c;每當有一個地方引用它時&#xff0c;計數器值就加一&#xff1b;當引用失效時&#xff0c;計數器值就減一&#xff1…

文件批量改名高手:輕松刪除文件名,僅保留編號!

您是否經常需要對大量文件進行命名調整&#xff1f;是否為繁瑣的手動操作而感到厭煩&#xff1f;現在&#xff0c;我們的智能批量文件改名工具為您提供了一種簡單而高效的解決方案&#xff01;只需幾步操作&#xff0c;您就能輕松刪除原有的文件名&#xff0c;僅保留編號&#…

YOLO相關原理(文件結構、視頻檢測等)

超參數進化(hyperparameter evolution) 超參數進化是一種使用了genetic algorithm&#xff08;GA&#xff09;遺傳算法進行超參數優化的一種方法。 YOLOv5的文件結構 images文件夾內的文件和labels中的文件存在一一對應關系 激活函數&#xff1a;非線性處理單元 activation f…

c#學習路線

文章目錄 .net coreN層架構大項目實戰高性能互聯網項目架構c#高級編程各種主流框架分布式通信SSO單點登錄+權限管理系統實戰N層架構WEB安全ASP.NET MVCNoSQLORM框架c#6和c#7新語法VS插件分享項目管理三層項目實戰三層架構ASP.NET基礎數據庫和ASP.NETADO.NET計算機基礎計算機硬件…

C# 11 中的新增功能

本文內容 泛型屬性泛型數學支持數值 IntPtr 和 UIntPtr字符串內插中的換行符 顯示另外 11 個 C# 11 中增加了以下功能&#xff1a; 原始字符串字面量泛型數學支持泛型屬性UTF-8 字符串字面量字符串內插表達式中的換行符列表模式文件本地類型必需的成員自動默認結構常量 str…