23-Java-Spring框架(一)

来源:https://www.cnblogs.com/qinqin-me/archive/2020/04/28/12764934.html
-Advertisement-
Play Games

一、Spring框架瞭解 Spring框架是一個開源的框架,為JavaEE應用提供多方面的解決方案,用於簡化企業級應用的開發,相當於是一種容器,可以集成其他框架(結構圖如下)。 上圖反映了框架引包的依賴關係(例如:DAO的jar包依賴AOP的jar包,AOP的jar包依賴Core的jar包) 上圖也 ...


一、Spring框架瞭解

    Spring框架是一個開源的框架,為JavaEE應用提供多方面的解決方案,用於簡化企業級應用的開發,相當於是一種容器,可以集成其他框架(結構圖如下)。

        

    上圖反映了框架引包的依賴關係(例如:DAO的jar包依賴AOP的jar包,AOP的jar包依賴Core的jar包)

    上圖也反映了Spring功能有:

        IOC:控制反轉,Spring的核心功能

        AOP:面向切麵編程

        Web:MVC結構實現、與其他Web技術融合

        DAO:與JDBC整合和事務管理

        ORM:與ORM對象映射實現的框架整合

        JEE:與JavaEE服務整合

二、SpringIOC(Inversion Of Control)

           SpringIOC控制反轉,是指程式中對象的獲取方式發生反轉,由最初的new方式創建,轉為由框架創建註入,這樣可以降低對象之間的耦合度。

    IOC的主要作用是管理程式的組件,創建組件對象和維護對象之間的關係。

    Spring容器:在Spring中,任何的Java類都被當成Bean組件,通過容器管理和使用,Spring容器實現了IOC和AOP機制,

      Spring容器有ApplicationContext和BeanFactory兩種類型。

      ApplicationContext繼承自BeanFactory,提供了更多的方法,建議使用ApplicationContext。

    

        ApplicationContext實例化途徑:

          1.從classpath下載入配置文件實例化:ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

          2.從文件系統中載入配置文件實例化:ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");

    Bean對象的創建:

          Spring容器創建Bean對象有三種方法:

          1.使用構造器來實例化

          2.使用靜態工廠方法來實例化

          3.使用動態(實例)工廠方法來實例化

        Spring容器創建Bean對象的步驟:

          第一步:導入SpringIOC相關包到WebRoot/WBE-INF/lib下(想要相關包的網友請留言私聊)

              commons-logging-1.2.jar

              spring-beans-4.1.6.RELEASE.jar

              spring-context-4.1.6.RELEASE.jar

              spring-context-support-4.1.6.RELEASE.jar

              spring-core-4.1.6.RELEASE.jar

              spring-expression-4.1.6.RELEASE.jar

          第二步:編寫實體類和實體工廠類

實體類:

 1 package com.springioc.entity;
 2 
 3 public class User {
 4     private Integer id;
 5     private String username;
 6     private String password;
 7     public User() {
 8         super();
 9         // TODO Auto-generated constructor stub
10     }
11     public User(Integer id, String username, String password) {
12         super();
13         this.id = id;
14         this.username = username;
15         this.password = password;
16     }
17     public Integer getId() {
18         return id;
19     }
20     public void setId(Integer id) {
21         this.id = id;
22     }
23     public String getUsername() {
24         return username;
25     }
26     public void setUsername(String username) {
27         this.username = username;
28     }
29     public String getPassword() {
30         return password;
31     }
32     public void setPassword(String password) {
33         this.password = password;
34     }
35     @Override
36     public int hashCode() {
37         final int prime = 31;
38         int result = 1;
39         result = prime * result + ((id == null) ? 0 : id.hashCode());
40         result = prime * result
41                 + ((password == null) ? 0 : password.hashCode());
42         result = prime * result
43                 + ((username == null) ? 0 : username.hashCode());
44         return result;
45     }
46     @Override
47     public boolean equals(Object obj) {
48         if (this == obj)
49             return true;
50         if (obj == null)
51             return false;
52         if (getClass() != obj.getClass())
53             return false;
54         User other = (User) obj;
55         if (id == null) {
56             if (other.id != null)
57                 return false;
58         } else if (!id.equals(other.id))
59             return false;
60         if (password == null) {
61             if (other.password != null)
62                 return false;
63         } else if (!password.equals(other.password))
64             return false;
65         if (username == null) {
66             if (other.username != null)
67                 return false;
68         } else if (!username.equals(other.username))
69             return false;
70         return true;
71     }
72     @Override
73     public String toString() {
74         return "User [id=" + id + ", username=" + username + ", password="
75                 + password + "]";
76     }
77     
78 }

實體工廠類:

 1 package com.springioc.entity;
 2 
 3 public class UserFactory {
 4     public static User CreateUser(){
 5         return new User();
 6     }
 7     
 8     public User DynamicCreateUser(){
 9         return new User();
10     }
11 }

          第三步:編寫實例化配置文件applicationContext.xml

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4        xmlns:context="http://www.springframework.org/schema/context"
  5        xmlns:aop="http://www.springframework.org/schema/aop"
  6        xmlns:tx="http://www.springframework.org/schema/tx"
  7        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  8        xmlns:jee="http://www.springframework.org/schema/jee"
  9        xmlns:mvc="http://www.springframework.org/schema/mvc"
 10        xmlns:util="http://www.springframework.org/schema/util"
 11        xsi:schemaLocation="
 12             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 13             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 14             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
 15             http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
 16             http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
 17             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
 18             http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 19             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 20             
 21 <!-- ************************************************************************************************************************ -->
 22         <!-- 在容器配置文件applicationContext中添加bean的定義,等價於將Bean組件放入Spring容器,後續由Spring負責創建對象 -->
 23         <!-- 在容器中最基本的單位就是bean標簽,一個bean標簽代表一個對象 -->
 24         <!-- 預設情況下,每一個bean都是單例的,在單例(singleton)情況下,隨容器的創建而創建,隨著容器的銷毀而銷毀 -->
 25         <!-- Bean創建對象的三種方式 -->
 26         <!-- 1.構造器 
 27             語法格式:    
 28                      <bean id="對象標識符" class="對象許可權定名"></bean> 
 29             舉例:
 30                     <bean id="user" class="com.springioc.entity.User"></bean>    
 31         -->
 32         <!-- 2.靜態工廠 
 33             語法格式:    
 34                      <bean id="靜態工廠標識符" class="工廠許可權定名" factory-method="靜態方法名"></bean>
 35             舉例:
 36                     <bean id="staticFactory" class="com.springioc.entity.UserFactory" factory-method="CreateUser"></bean>
 37         -->
 38         <!-- 3.動態(實例)工廠 
 39             語法格式:
 40                     <bean id="工廠標識符" class="工廠許可權定名"></bean>
 41                      <bean id="動態工廠標識符" factory-bean="工廠標識符" factory-method="動態方法名"></bean>
 42             舉例:
 43                     <bean id="userFactory" class="com.springioc.entity.UserFactory"></bean>
 44                     <bean id="dynamicCreateUser" factory-bean="userFactory" factory-method="DynamicCreateUser"></bean>
 45         -->
 46         <bean id="userFactory" class="com.springioc.entity.UserFactory"></bean>
 47         <bean id="dynamicCreateUser" factory-bean="userFactory" factory-method="DynamicCreateUser"></bean>
 48 <!-- ************************************************************************************************************* -->
 49         <!-- Bean便簽常用屬性:
 50                 id:bean對象標識符
 51                 factory-bean:bean對象創建工廠標識符
 52                 class:許可權定名
 53                 factory-method:對象創建工廠函數
 54                 init-method:bean對象初始化方法名
 55                 destory-method:bean對象銷毀方法名
 56                 lazy-init:延遲bean對象實例化,當設置為true的時候,不管是不是單例(singleton),當調用getBean()的時候才會創建對象
 57             
 58              Beans標簽常用屬性:(作用於beans標簽中的所有bean標簽)
 59                 default-init-method:預設bean對象初始化方法名
 60                 default-destory-method:預設bean對象銷毀方法名
 61                 default-lazy-init:預設延遲bean對象實例化
 62          -->
 63 <!-- ************************************************************************************************************** -->
 64         <!-- Bean對象的參數註入
 65                 註入類型可以為字元串、集合、Bean對象
 66                 1.setter註入
 67                     name:實體類屬性名
 68                     value:註入參數的值
 69                     ref:註入bean對象的值
 70                     舉例:
 71                         <bean id = "user" class = "com.springioc.entity.User">
 72                             <property name="id" value="1"></property>
 73                             <property name="username" value="admin"></property>
 74                             <property name="password" value="123"></property>    
 75                         </bean>
 76                     相當於之前 User user = new User();
 77                               user.setId(1);
 78                               user.setUsername("admin");
 79                               user.setPassword("123");
 80                     
 81                 2.構造器註入 
 82                     index:實體類構造函數的形參順序,0表示第一個參數,1表示第二參數,2表示第三個參數...
 83                     value:註入參數的值
 84                     ref:註入bean對象的值
 85                     舉例:
 86                         <bean id = "user" class = "com.springioc.entity.User">
 87                             <constructor-arg index="0" value="2"></constructor-arg>
 88                             <constructor-arg index="1" value="username"></constructor-arg>
 89                             <constructor-arg index="2" value="password"></constructor-arg>
 90                         </bean>
 91                 註意:(以上兩種註入方式都是以字元串的註入類型來舉例的,下麵是Bean對象註入和集合註入)
 92                     Bean對象的註入:如果一個實體類中的屬性是另一個實體類時,註入時需將property標簽的value屬性改為ref屬性
 93                     集合註入:(集合有set,list,map,props)
 94                         概述:假設一個實體類的屬性中有集合,那麼參數註入集合應該採用集合註入
 95                         舉例:
 96                             <bean id = "girl" class = "com.springioc.entity.Girl">
 97                                 <property name="glist">
 98                                     <list>
 99                                         <value>範冰冰</value>
100                                         <value>楊冪</value>
101                                         <value>王祖賢</value>
102                                     </list>
103                                 </property>
104                                 <property name="gset">
105                                     <set>
106                                         <ref bean = "user1"/>
107                                         <ref bean = "user2"/>
108                                     </set>
109                                 </property>
110                                 <property name="gmap">
111                                     <map>
112                                         <entry key="美女" value="楊冪"></entry>
113                                         <entry key="美人">
114                                             <value>範冰冰</value>
115                                         </entry>
116                                     </map>
117                                 </property>
118                                 <property name="gprops">
119                                     <props>
120                                         <prop key="美女">楊冪</prop>
121                                         <prop key="美人">範冰冰</prop>
122                                     </props>
123                                 </property>
124                             </bean>
125         -->
126 <!-- *************************************************************************************************************** -->
127     <!-- 一個Bean對象參數註入的實例:載入JDBC驅動-->
128         <!-- 載入資源文件 -->
129             <!-- 第一步:先建一個文件,文件名為jdbc.properties,放在src/下,文件中寫 admin=root
130                                                                             password=root
131                                                                             url=jdbc:mysql://localhost:3306/test
132                                                                             JDBCdriver=com.mysql.jdbc.Driver
133                   第二步:在applicationContext.xml中寫
134                       <util:properties id="jdbc" location="classpath:jdbc.properties"></util:properties>
135         -->
136         <!-- 配置數據源 -->
137             <!-- Spring引入一種表達式語言,它和EL的語法相似,可以讀取一個Bean對象/集合中的數據 -->
138             <!-- 第一步:編寫一個和jdbc.properties文件相對應的實體類JDBCTest,屬性名需要相等 
139                   第二步:在applicationContext.xml中寫
140                       <bean id="jdbc" class="com.springioc.test.JDBCTest">
141                           <property name="admin" value="#{db.admin}"></property>
142                         <property name="root" value="#{db.password}"></property>
143                         <property name="url" value="#{db.url}"></property>
144                         <property name="JDBCdriver" value="#{db.JDBCdriver}"></property>
145                       </bean>
146             -->
147 <!-- ************************************************************************************************************** -->
148 </beans>

          第四步:編寫實例化測試類

 1 package com.springioc.test;
 2 
 3 import org.springframework.context.ApplicationContext;//spring-context.jar包中的
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;//spring-context-support.jar包中的
 5 
 6 import com.springioc.entity.User;
 7 
 8 public class ApplicationContextBuildUserTest {
 9     public static void main(String[] args) {
10         //以前的方式創建對象
11 //        User user = new User();
12 //        System.out.println(user);
13         
14         //現在使用Spring框架的容器來創建對象
15             //第一步:創建Spring容器
16         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
17         
18             /*第二步:從ApplicationContext容器獲取Bean對象
19              * 1.構造器獲取對象
20              *         語法格式:
21              *             類型名 變數名 = 容器對象.getBean("對象標識符",組件類型);
22              *         舉例:
23              *             User user = ac.getBean("user", User.class);
24              * 2.靜態工廠獲取對象
25              *         語法格式:
26              *             類型名 變數名 = 容器對象.getBean("靜態工廠標識符",組件類型);
27              *         舉例:
28              *             User user = ac.getBean("staticFactory", User.class);
29              * */
30         User user = ac.getBean("dynamicCreateUser", User.class);
31         System.out.println(user);
32     }
33 }

          第五步:運行結果

            

    Bean對象的作用域:

        指定Spring容器創建Bean對象的作用域:

            

        註意:singleton單例模式,通過getBean獲取的對象HashCode是相同的,即user1 = user2返回true

           prototype多例模式,通過getBean獲取的對象HashCode是不同的,即user1 = user2返回false

    Bean對象的參數註入:(看上面的applicationContext.xml中註釋寫的知識點)

        容器可以建立Bean對象之間的關係,實現技術途徑就是DI註入,Spring DI註入setter註入和構造器註入兩種

    組件掃描:Spring提供了一套基於註解配置的的使用方法,使用該方法可以大大簡化XML的配置信息

         開啟組件掃描,可以利用註解方式應用IOC,使用方法如下:

            第一步:除了需要引入springIOC相關jar包之外還需要引入SpringAOP相關jar包(需要相關jar包的網友請留言私聊)

                aopalliance-1.0.jar

                aspectjweaver-1.5.3.jar

                spring-aop-4.1.6.RELEASE.jar

                spring-aspects-4.1.6.RELEASE.jar

            第二步:在applicationContext.xml中添加啟用標記(用了組件掃描就可以不用bean標簽了)

              <context:component-scan base-package="包路徑(用最大的,例如:com.springioc)"/>

            第三步:在組件類中追加以下標記

              

              註意:1.掃描組件後,預設id值為組件類名首字母小寫,也可以自定義id。例如:@Component("stu")

                 2.掃描組件後,預設scope為singleton單例,也可以進行指定。例如:@Scope("prototyppe")

                 3.也可以指定初始化和銷毀的方法,例如,在組件類的方法前追加@PostConstruct來指定初始化方法,追加@PreDestory來指定銷毀方法

                 4.將所有bean組件掃描到Spring容器後,可以使用以下註解指定註入關係

                        @Autowired/@Qulifier:可以處理構造器註入和setter註入

                        @Resource:只能處理Setter註入,但大部分情況都是setter註入

                 5.@Value註解可以註入Spring表達式值

                      首先讀取db.properties文件,封裝成Properties對象,在applicationContext.xml中添加

                          <util:properties id="jdbc" location="classpath:jdbc.properties"></util:properties>

                      然後在組件類屬性變數或Setter方法前使用@Value註解

                          @Value("#{db.url}")

                          private String url;

              追加標記舉例:

1 @Component//預設實體類id名稱是實體類名稱(首字母小寫)
2 @Scope("prototype")//預設為單例模式,此處修改為多例模式
3 public class User { 4 }

             第四步:測試獲取bean對象:

 1 package com.springioc.test;
 2 
 3 import org.springframework.context.ApplicationContext;//spring-context.jar包中的
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;//spring-context-support.jar包中的
 5 
 6 import com.springioc.entity.User;
 7 
 8 public class ApplicationContextBuildUserTest {
 9     public static void main(String[] args) {
10         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
11         User user = ac.getBean("user", User.class);//此處的id:user是從@Component預設實體類id中得出來的
12         System.out.println(user);
13     }
14 }

                運行結果:

        

    SpringIOC實現解耦(重點理解)

       解耦主題:通過hibernate和JDBC兩種技術實現一個用戶的刪除操作

       1.XML配置文件版的解耦

          第一步:編寫用戶實體類和用戶DAO介面

1 //用戶DAO實現介面
2 package com.springiocDecoupling.usedao;
3 
4 public interface UserDAO {
5     public void delete();
6 }

          第二步:編寫Hibernate技術和JDBC技術分別實現刪除操作的類

1 //JDBC實現DAO刪除操作
2 package com.springiocDecoupling.usedao;
3 
4 public class JDBCDAO implements UserDAO{
5     public void delete(){
6         System.out.println("通過JDBC實現User刪除");
7     }
8 }
1 //Hibernate實現DAO刪除操作
2 package com.springiocDecoupling.usedao;
3 
4 public class HibernateDAO implements UserDAO{
5     public void delete(){
6         System.out.println("通過Hibernate實現User刪除");
7     }
8 }

          第三步:編寫一個控制用戶刪除操作的控制類

//控制類,控制刪除操作
package com.springiocDecoupling.entity.Controller;
import org.springframework.stereotype.Controller;
import com.springioc_Decoupling.usedao.UserDAO;

@Controller//用於Spring框架管理
public class UserController {

    private UserDAO dao;
    public UserDAO getDao() {
        return dao;
    }
    public void setDao(UserDAO dao) {
        this.dao = dao;
    }
    public void delete(){
        dao.delete();
    }
}

          第四步:配置applicationContext.xml信息

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:aop="http://www.springframework.org/schema/aop"
 6        xmlns:tx="http://www.springframework.org/schema/tx"
 7        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
 8        xmlns:jee="http://www.springframework.org/schema/jee"
 9        xmlns:mvc="http://www.springframework.org/schema/mvc"
10        xmlns:util="http://www.springframework.org/schema/util"
11        xsi:schemaLocation="
12             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
13             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
14             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
15             http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
16             http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
17             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
18             http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
19             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
20         <bean id = "jdao" class = "com.springioc_Decoupling.usedao.JDBCDAO"></bean>
21         <bean id = "hdao" class = "com.springioc_Decoupling.usedao.HibernateDAO"></bean>
22         
23         <bean id = "ucontroller" class="com.springiocDecoupling.entity.Controller.UserController">
24             <property name="dao" ref="jdao"></property><!--解耦操作就體現在此處,要用jdbc,ref屬性修改為jdao就行了,要用hibernate,ref屬性修改為hdao就行了-->
25         </bean>
26 </beans>

          第五步:編寫測試類

 1 package com.springiocDecoupling.entity.test;
 2 
 3 import org.springframework.context.ApplicationContext;//spring-context.jar包中的
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;//spring-context-support.jar包中的
 5 
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 代碼: 效果: ...
  • 1.常見的三目運算就不多說了。如下: 替換前 function fliterPerson(person) { if (!person.email) { return 'email is require' } else if (!person.login) { return 'login is req ...
  • Web前端開發是從網頁製作演變而來的,名稱上有很明顯的時代特征。各種類似桌面軟體的Web應用大量涌現,網站的前端由此發生了翻天覆地的變化。網頁不再只是承載單一的文字和圖片,各種豐富媒體讓網頁的內容更加生動,網頁上軟體化的交互形式為用戶提供了更好的使用體驗,這些都是基於前端技術實現的。 隨著Web前端 ...
  • 前言 由於個人的一些原因最近也參加了幾家公司的面試,發現有很多基礎性的東西掌握程度還是不夠,故此想總結一下最近面試遇到的問題,希望能為在準備面試的的小伙伴盡一些綿薄之力,主要說的是一些我面試當中問到的一些問題,說的不對的地方請小伙伴們即使指正出來,或者有其他的看法也可以一起探討。 一、HTML/CS ...
  • 點擊按鈕實現文件上傳 <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="./jquery.min.js" type="text/ja ...
  • 先說兩句 前面已經講完了 Vuex 下的 、 、 及 這四駕馬車,不知道大家是否已經理解。當然,要想真正熟練掌握的話,還是需要不斷的練習和動手實踐才行。 其實只要把這四駕馬車完全熟練駕馭了,那麼應對一些中小型的項目,基本上就已經沒啥問題了,後面的 Module 這架終極馬車,其實是為了搞定那些稍微大 ...
  • Eureka高可用 1.設置伺服器之間的host,測試環境是在window10上搭建的,所以去修改C:\Windows\System32\drivers\etc文件,如下: 2.創建項目: 3.編輯配置文件: application.yml: #一組服務需要使用相同的服務名稱,才能被識別為一組! a ...
  • 單例模式學習 1 餓漢式單例模式 還沒用就創建了對象,可能會浪費空間 2 懶漢式單例模式 無線程鎖 java package main.java.com.yuehun.singleton; / main.java.com.yuehun.singleton @author yuehun Created ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...