day04-Spring管理Bean-IOC-02

来源:https://www.cnblogs.com/liyuelian/archive/2023/01/17/17058715.html
-Advertisement-
Play Games

Spring管理Bean-IOC-02 2.基於XML配置bean 2.7通過util空間名稱創建list BookStore.java: package com.li.bean; import java.util.List; /** * @author 李 * @version 1.0 */ pu ...


Spring管理Bean-IOC-02

2.基於XML配置bean

2.7通過util空間名稱創建list

BookStore.java:

package com.li.bean;

import java.util.List;

/**
 * @author 李
 * @version 1.0
 */
public class BookStore {
    private List<String> bookList;

    //如果類中沒有其他構造器,預設構造器可以不寫
    // 如果有其他構造器,則必須顯示定義無參構造器
    public BookStore() {
    }

    public List<String> getBookList() {
        return bookList;
    }

    public void setBookList(List<String> bookList) {
        this.bookList = bookList;
    }

    @Override
    public String toString() {
        return "BookStore{" +
                "bookList=" + bookList +
                '}';
    }
}

如果有多個BookStore對象,list的內容都一樣,按照之前的做法,每一個list都要寫上相同的value值。但使用util命名空間可以達到數據復用的效果。

beans.xml:

<!--定義util:list,並指定id,可以達到數據復用的效果-->
<util:list id="myBookList">
    <value>三國演義</value>
    <value>紅樓夢</value>
    <value>西游記</value>
    <value>水滸傳</value>
</util:list>

<!--配置BookStores對象-->
<bean class="com.li.bean.BookStore" id="bookStore">
    <property name="bookList" ref="myBookList"/>
</bean>

註意引入util命名空間,一般來說ide會有提示,如果沒有則按如下引入:

image-20230117163203971

SpringBeanTest:

package com.li.test;

import com.li.bean.BookStore;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //使用util:list名稱空間給屬性賦值
    @Test
    public void setBeanByUtilList() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        BookStore bookStore = ioc.getBean("bookStore", BookStore.class);
        System.out.println("bookStore=" + bookStore);
    }
}
image-20230117163450336

2.8級聯屬性賦值

  1. 案例說明:spring的ioc容器,可以直接給對象屬性的屬性賦值,即級聯屬性賦值

  2. 完成步驟:

    (1)創建Dept.java和Emp.java

    (2)配置beans.xml


Dept.java:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 * 部門類
 */
public class Dept {
    private String name;

    public Dept() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "name='" + name + '\'' +
                '}';
    }
}

Emp.java:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 * 員工類
 */
public class Emp {
    private String name;
    private Dept dept;

    public Emp() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", dept=" + dept +
                '}';
    }
}

beans.xml:

<!--配置Dept對象-->
<bean class="com.li.bean.Dept" id="dept"/>
<!--配置Emp對象-->
<bean class="com.li.bean.Emp" id="emp">
    <property name="name" value="jack"/>
    <property name="dept" ref="dept"/>
    <!--這裡我希望給dept的name屬性賦值[級聯屬性賦值]-->
    <property name="dept.name" value="Java開發部門"/>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Emp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //使用級聯賦值給屬性的屬性賦值
    @Test
    public void setBeanByRelation() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Emp emp = ioc.getBean("emp", Emp.class);
        System.out.println("emp=" + emp);
    }
}
image-20230117165625876

2.9通過靜態工廠獲取對象

  1. 在spring的ioc容器,可以通過靜態工廠獲取bean對象

  2. 完成步驟:

    (1)靜態工廠類MyStaticFactory類和Monster類

    (2)配置beans.xml


Monster類詳見上一篇--2.1通過類型來獲取bean

MyStaticFactory.java:

package com.li.factory;

import com.li.bean.Monster;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 李
 * @version 1.0
 * 靜態工廠類-可以返回Monster對象
 */
public class MyStaticFactory {
    private static Map<String, Monster> monsterMap;

    //使用static靜態代碼塊進行初始化
    // (靜態代碼塊在類載入的同時就直接執行,且只執行一次)
    static {
        monsterMap = new HashMap<>();
        monsterMap.put("monster01", new Monster(100, "孫悟空", "七十二變"));
        monsterMap.put("monster02", new Monster(200, "金蟬子", "普渡眾生"));
    }

    //提供一個方法,返回monster對象
    public static Monster getMonster(String key) {
        return monsterMap.get(key);
    }
}

beans.xml:

<!--配置monster,通過靜態工廠獲取
    1.通過靜態工廠配置bean
    2.class不再是monster的路徑,而是靜態工廠的全路徑
    3.factory-method 表示指定靜態工廠的哪個方法來返回對象
    4.constructor-arg value="monster02" 指定要返回靜態工廠的哪個對象
-->
<bean id="my_monster01" class="com.li.factory.MyStaticFactory" factory-method="getMonster">
    <constructor-arg value="monster02"/>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //使用靜態工廠來獲取 bean
    @Test
    public void getBeanByStaticFactory() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Monster my_monster01 = ioc.getBean("my_monster01", Monster.class);
        //這裡如果使用的是相同id獲取bean,那麼獲取的實際上是同一個對象,例如:
        Monster my_monster001 = ioc.getBean("my_monster01", Monster.class);
        // 因為靜態工廠中的靜態代碼塊只執行一次,這裡不同的對象引用指向的都是同一個對象
        System.out.println(my_monster01 == my_monster001);//true
        
        System.out.println("my_monster01=" + my_monster01);
    }
}
image-20230117174421957

2.10通過實例工廠獲取對象

Monster類詳見上一篇--2.1通過類型來獲取bean

MyInstanceFactory:

package com.li.factory;

import com.li.bean.Monster;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 李
 * @version 1.0
 * 實例工廠類
 */
public class MyInstanceFactory {
    private Map<String, Monster> monster_map;

    //通過普通代碼塊進行初始化
    //普通代碼塊每創建一個對象就會執行一次
    {
        monster_map = new HashMap<>();
        monster_map.put("monster03", new Monster(300, "豬八戒", "九尺釘耙"));
        monster_map.put("monster04", new Monster(400, "沙和尚", "丈二禪杖"));
    }

    //寫一個方法返回Monster對象
    public Monster getMonster(String key) {
        return monster_map.get(key);
    }
}

beans.xml:

<!--因為是實例工廠對象,所以需要配置才能使用(靜態工廠可以直接使用不用配置)-->
<bean class="com.li.factory.MyInstanceFactory" id="myInstanceFactory"/>
<bean class="com.li.factory.MyInstanceFactory" id="myInstanceFactory02"/>

<!--配置monster,通過實例工廠獲取
    1.factory-bean 表示使用哪個實例工廠對象返回bean
    2.factory-method 指定使用實例工廠對象的哪個方法返回bean
    3.constructor-arg value="monster03" 指定獲取實例工廠中的哪個對象
-->
<bean id="my_monster02" factory-bean="myInstanceFactory" factory-method="getMonster">
    <constructor-arg value="monster03"/>
</bean>

<bean id="my_monster03" factory-bean="myInstanceFactory02" factory-method="getMonster">
    <constructor-arg value="monster03"/>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //使用實例工廠來獲取 bean
    @Test
    public void getBeanByInstanceFactory() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");

        Monster my_monster02 = ioc.getBean("my_monster02", Monster.class);
        System.out.println("my_monster02=" + my_monster02);

        // 這裡使用相同的id獲取bean,那麼返回的對象也是同一個!!
        Monster my_monster002 = ioc.getBean("my_monster02", Monster.class);
        // 因為雖然是實例工廠,但是兩次 ioc.getBean("my_monster02", Monster.class)使用的都是
        // 同一個工廠實例(id="myInstanceFactory"),返回的自然也就是同一個實例工廠中的 monster
        System.out.println(my_monster02 == my_monster002);//true

        //換而言之,如果不是同一個實例工廠,那麼返回的就不是同一個對象了
        //(這裡的my_monster03,在beans.xml使用的是 id=myInstanceFactory02的實例工廠)
        Monster my_monster03 = ioc.getBean("my_monster03", Monster.class);
        System.out.println("my_monster03=" + my_monster03);
        System.out.println(my_monster02 == my_monster03);//false
    }
}
image-20230117180247575

2.11通過FactoryBean獲取對象(重點)

在spring的ioc容器,通過FactoryBean獲取bean對象

MyFactoryBean:

package com.li.factory;

import com.li.bean.Monster;
import org.springframework.beans.factory.FactoryBean;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 李
 * @version 1.0
 * FactoryBean
 */
public class MyFactoryBean implements FactoryBean<Monster> {
    //這個就是你配置的時候,指定要獲取的對象對應的key
    private String key;
    private Map<String, Monster> monster_map;

    //代碼塊完成初始化
    {
        monster_map = new HashMap<>();
        monster_map.put("monster05", new Monster(5, "黑風怪", "翻江倒海"));
        monster_map.put("monster06", new Monster(6, "金角大王", "超能力"));
    }

    public void setKey(String key) {
        this.key = key;
    }

    @Override
    public Monster getObject() throws Exception {
        return monster_map.get(key);
    }

    @Override
    public Class<?> getObjectType() {
        return Monster.class;
    }

    @Override
    public boolean isSingleton() {//這裡指定是否是單例對象
        return true;
    }
}

beans.xml:

<!--配置monster對象,通過FactoryBean來獲取
    1.這裡的class 指定要使用的FactoryBean
    2.key是 你設置的FactoryBean的屬性key
    3.value 就是你要獲取的對象的對應 key
    -->
<bean id="my_monster05" class="com.li.factory.MyFactoryBean">
    <property name="key" value="monster05"/>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {
    //通過FactoryBean獲取bean對象
    @Test
    public void getBeanByFactoryBean() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Monster my_monster05 = ioc.getBean("my_monster05", Monster.class);
        System.out.println("my_monster05=" + my_monster05);
    }
}
image-20230117185118543

2.12bean配置信息重用(繼承)

在spring的ioc容器中,提供了一種繼承的方式來實現bean配置信息的重用

beans.xml:

<!--配置Monster對象-->
<bean class="com.li.bean.Monster" id="monster10">
    <property name="monsterId" value="10"/>
    <property name="name" value="蜈蚣精"/>
    <property name="skill" value="蜇人"/>
</bean>

<!--現在配置另一個Monster對象,
    1.這個對象的屬性值 和 id="monster10"對象屬性一樣
    2.parent="monster10" 指定當前這個配置的對象的屬性值從id=monster10的對象來
    -->
<bean id="monster11" class="com.li.bean.Monster" parent="monster10"/>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //配置Bean(通過繼承)
    @Test
    public void getBeanByFactoryBean() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Monster monster10 = ioc.getBean("monster10", Monster.class);
        Monster monster11 = ioc.getBean("monster11", Monster.class);

        System.out.println("monster10=" + monster10);
        System.out.println("monster11=" + monster11);
    }
}
image-20230117191040435

註意:

  1. 如果bean指定了abstract="true" 表示該bean對象是只用於被繼承的

  2. 那麼這個bean就不能被獲取/實例化

image-20230117191747693

此時如果輸出monster10,就會顯示錯誤:

image-20230117191930295

2.13bean創建順序

在spring的ioc容器,預設是按照配置的順序創建bean對象。比如:

<bean id="student01" class="com.hspedu.bean.Student" />
<bean id="department01" class="com.hspedu.bean.Department" />

會先創建 student01 這個 bean 對象,然後創建 department01 這個 bean 對象

但如果這樣配置:

<bean id="student01" class="com.hspedu.bean.Student" depends-on="department01"/>
<bean id="department01" class="com.hspedu.bean.Department" />

會先創建 department01 對象,再創建 student01 對象.

例子

Student:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 */
public class Student {
    public Student() {
        System.out.println("Student 構造器被執行...");
    }
}

Department:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 */
public class Department {
    public Department() {
        System.out.println("Department 構造器被執行...");
    }
}

beans.xml:

<!--測試 bean對象的創建順序-->
<bean id="student01" class="com.li.bean.Student"/>
<bean id="department01" class="com.li.bean.Department"/>

測試類:

//測試 Bean的創建順序
@Test
public void testBeanByCreate() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    System.out.println("ok~");
}
image-20230117193239357

如果我們在配置student01對象時,加上depends-on="department01",spring就會認為你的student01對象時依賴於department01對象,會先創建department01對象。

<bean id="student01" class="com.hspedu.bean.Student" depends-on="department01"/>
<bean id="department01" class="com.hspedu.bean.Department" />
image-20230117193617135

總結:在預設情況下,bean創建的順序是按照預設配置順序來的。但是如果我們在對象配置中指定了依賴對象,就會先創建被依賴的對象。

一個問題?

1.先看下麵的配置,請問兩個bean創建的順序是什麼?並分析執行流程

<!--配置MemberDAOImpl對象-->
<bean class="com.li.dao.MemberDAOImpl" id="memberDAOImpl"/>

<bean class="com.li.service.MemberServiceImpl" id="memberServiceImpl">
    <property name="memberDAO" ref="memberDAOImpl"/>
</bean>

(1)先創建 id=memberDaoImpl 的對象

(2)再創建 id=memberServiceImpl 的對象

(3)調用 memberServiceImpl.setMemberDAO() 方法,完成引用

image-20230117202221363

2.先看下麵的配置,請問兩個bean創建的順序是什麼?並分析執行流程

<bean class="com.li.service.MemberServiceImpl" id="memberServiceImpl">
    <property name="memberDAO" ref="memberDAOImpl"/>
</bean>

<!--配置MemberDAOImpl對象-->
<bean class="com.li.dao.MemberDAOImpl" id="memberDAOImpl"/>

(1)先創建 id=memberServiceImpl 的對象

(2)再創建 id=memberDaoImpl 的對象

(3)調用 memberServiceImpl.setMemberDAO() 方法,完成引用

image-20230117202404030

總結:ioc容器會把整個bean的創建當做一個整體來對待,會把配置文件中所有對象bean先創建好,然後才完成對象間的引用。

見2.4

2.14bean對象的單例和多例

在spring的ioc容器中,預設是按照單例創建的,即配置一個bean對象後,ioc容器只會創建一個bean實例。

如果希望ioc容器配置的某個bean對象,是以多個實例形式創建的,可以通過配置scope="prototype"來指定。

例子1-單例對象

Cat:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 */
public class Cat {
    private Integer id;
    private String name;

    public Cat() {
        System.out.println("Cat() 構造器被執行...");
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

beans.xml:

<!--配置 Cat對象
    1.預設情況下,scope屬性的值為 "singleton",即ioc容器中只會有一個這樣的bean對象
        當執行getBean時,返回的是同一個對象
    2.如果希望每次使用getBean都返回新的Bean對象,就要把scope的屬性設為 prototype
-->
<bean id="cat" class="com.li.bean.Cat">
    <property name="id" value="10"/>
    <property name="name" value="小花貓"/>
</bean>

測試類:

//測試Scope
@Test
public void testBeanScope() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    Cat cat1 = ioc.getBean("cat", Cat.class);
    Cat cat2 = ioc.getBean("cat", Cat.class);
    Cat cat3 = ioc.getBean("cat", Cat.class);
    System.out.println("cat1="+cat1);
    System.out.println("cat2="+cat2);
    System.out.println("cat3="+cat3);
}

輸出如下:地址值相同,證明這三個對象引用都指向了同一個對象

image-20230117204736245

例子2-多例對象

現在我們把例子1的cat對象的配置改為scope="prototype"

<bean id="cat" class="com.li.bean.Cat" scope="prototype">
    <property name="id" value="10"/>
    <property name="name" value="小花貓"/>
</bean>

輸出如下:構造器執行了三次,說明創建了三個Cat對象(對象的地址值也不一樣)

image-20230117205237652

使用細節

  1. 當bean為scope="singleton"(預設值),在啟動容器時,就會創建單例對象,並放入singletonObjects集合

  2. 當bean設置為scope="prototype",即設置為多實例機制後,該bean是在getBean時才創建

  3. 如果是單例singleton,但又希望在getBean時才創建,可以指定懶載入lazy-init="true" (預設值是false)

  4. 通常情況下,lazy-init 使用預設值false,因為在開發看來,用空間換時間是值得的,除非有特殊要求。

  5. 如果scope="prototype",這時你的lazy-init屬性值不管設置為什麼,都預設為true

    因為多例情況下,spring無法知道創建幾個對象,因此只有在用到的時候才能創建


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

-Advertisement-
Play Games
更多相關文章
  • 2023-01-17 一、Servlet底層源碼分析 1、Servlet結構圖 說明:HttpServlet繼承了GenericServlet類,GenericServlet實現了“ServletConfig”和“Servlet”兩個介面,因此所以要實現一個Servlet直接就可以繼承HttpSer ...
  • 2023-01-13 一、基本功 (1)工程結構管理 掌握企業環境的搭建和管理 (2)java開發規範 P3C開發規約 (3)高併發及網路編程 需要考慮性能瓶頸 (4)底層源碼分析 二、互聯網常用技術——分散式 1、NoSQL資料庫:是提升數據訪問效率的優先選擇。 訪問效率的提升:Redis、Mon ...
  • 1. API 網關誕生背景 前言 API 經濟生態鏈已經在全球範圍覆蓋, 絕大多數企業都已經走在數字化轉型的道路上,API 成為企業連接業務的核心載體, 並產生巨大的盈利空間。快速增長的 API 規模以及調用量,使得企業 IT 在架構上、模式上面臨著更多的挑戰。 API 是什麼 API 網關是一個服 ...
  • CAP特性 ​ CAP理論是在設計分散式系統的過程中,處理數據一致性問題時必須考慮的理論,一個分散式系統最多只能同時滿足一致性(Consistence)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。 2000年7月Eric Brewer教授 ...
  • 前言 今日偶然打開 $oi-wiki$,發現樹形 $DP$ 例題正好是之前在洛谷上鴿著的一道題。所以...... $\color{red}{很高興以這樣的方式認識你,樹形 DP !}$ 這例題造的太好了,簡直是無痛入門(感動.jpg) P1352 沒有上司的舞會 題目傳送門~ 思路剖析 狀態定義 $ ...
  • 數據類型的內置方法 什麼是數據類型的內置方法? ​ ==數據類型自帶的操作方法或功能== 調用數據類型的內置的方法的方式是: ​ ==句點符== 數據類型.方法名() eg: 變數名.方法名() 數據值.方法名() 1.整型相關操作方法 類型轉換 int(待轉換的數據類型) 1.浮點型可以轉整型 ' ...
  • 下載jdk安裝包 進入Oracle官網進行下載:Java Downloads | Oracle 鏡像源也可以下載 為什麼配置環境變數 系統在運行命令和程式的時候先從當前目錄進行查找,找不到會去配置的環境變數裡面找 配置環境變數的目的是為了命令行在各個位置都能訪問 平時用IDEA集成開發工具不非得配置 ...
  • 1 簡介 DB2是IBM的一款優秀的關係型資料庫,簡單學習一下。 2 Docker安裝DB2 為了快速啟動,直接使用Docker來安裝DB2。先下載鏡像如下: docker pull ibmcom/db2:11.5.0.0 啟動資料庫如下: docker run -itd \ --name mydb ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...