主頁 > 後端開發 > 一,Spring的簡介和安裝,深入理解IOC容器及測驗

一,Spring的簡介和安裝,深入理解IOC容器及測驗

2022-09-08 11:50:46 後端開發

1) IOC/DI (IOC容器)

2) AOP面向切面編程

3) 宣告式事務

官網地址:spring是一家公司-商業化運作,apache是一家基金會組織,接收社會的捐贈,

https://spring.io/

io表示開發者平臺

 

 

 

 

1. Spring Framework

Spring 基礎框架,可以視為 Spring 基礎設施,基本上任何其他 Spring 專案都是以 Spring Framework 為基礎的,

Spring5,基于jdk1.8

1.1 Spring Framework的優良特性

非侵入式:使用 Spring Framework 開發應用程式時,Spring 對應用程式本身的結構影響非常小,對領域模型Java Bean)可以做到零污染;對功能性組件也只需要使用幾個簡單的注解進行標記,完全不會破壞原有結構,反而能將組件結構進一步簡化,這就使得基于 Spring Framework 開發應用程式時結構清晰、簡潔優雅,

控制反轉:IOC——Inversion of Control,翻轉資源獲取方向,把自己創建資源、向環境索取資源變成環境將資源準備好,我們享受資源注入,

面向切面編程:AOP——Aspect Oriented Programming,在不修改源代碼的基礎上增強代碼功能,

容器:Spring IOC 是一個容器,因為它包含并且管理組件物件的生命周期,組件享受到了容器化的管理,替程式員屏蔽了組件創建程序中的大量細節,極大的降低了使用門檻,大幅度提高了開發效率,

組件化:Spring 實作了使用簡單的組件配置組合成一個復雜的應用,在 Spring 中可以使用 XML 和 Java 注解組合這些物件,這使得我們可以基于一個個功能明確、邊界清晰的組件有條不紊的搭建超大型復雜應用系統,

6 宣告式:很多以前需要撰寫代碼才能實作的功能,現在只需要宣告需求即可由框架代為實作,

一站式:在 IOC 和 AOP 的基礎上可以整合各種企業應用的開源框架和優秀的第三方類別庫,而且 Spring 旗下的專案已經覆寫了廣泛領域,很多方面的功能性需求可以在 Spring Framework 的基礎上全部使用 Spring 來實作,

 

1.2 Spring Framework五大功能模塊

 

2. IOC容器的概念

2.1 生活中的普通容器

 

 

 

 

普通容器只能用來存盤,沒有更多功能,

 

2.2 程式中的普通容器

變數,陣列,集合

 

普通容器只能用來存盤,沒有更多功能,

 

2.3 生活中的復雜容器

 

政府管理我們的一生,生老病死都和政府有關

 

4. IOC容器在Spring中的實作

Spring IOC 容器就是 IOC 思想的一個落地的產品實作,IOC 容器中管理的組件也叫做 bean在創建 bean 之前,首先需要創建 IOC 容器,Spring 提供了 IOC 容器的兩種實作方式:

BeanFactory

這是 IOC 容器的基本實作,是 Spring 內部使用的介面,面向 Spring 本身,不提供給開發人員使用,

 

ApplicationContex -- 我們自己使用

BeanFactory 的子介面,提供了更多高級特性,面向 Spring 的使用者,幾乎所有場合都使用 ApplicationContext 而不是底層的 BeanFactory

 

所以,以后在 Spring 環境下看到一個類或介面的名稱中包含 ApplicationContext,那基本就可以斷定,這個類或介面與 IOC 容器有關,

 

ApplicationContext的主要實作類

 

 

 

 

5. 基于XML管理bean

5.1 實驗01[重要]創建bean,并根據id獲取

5.1.1 目標

Spring IOC 容器創建類的物件,并根據beanid屬性值來獲取bean物件

5.1.2 思路

 

 

 

 

自定義一個類IEmpService => EmpServiceImpl,這個類在Spring的組態檔中進行配置,然后用ClassPathXMLApplicationContext這個類去讀取組態檔,然后根據組態檔中配置的東西,將這個物件建立出來,

 

5.1.3 創建maven專案,匯入依賴

完整的pom檔案

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.hy</groupId>

<artifactId>mybatis001</artifactId>

<version>0.0.1</version>

<packaging>war</packaging>

 

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<maven.compiler.encoding>UTF-8</maven.compiler.encoding>

</properties>

 

<dependencies>

<!-- Spring core-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>5.2.20.RELEASE</version>

</dependency>

 

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.20</version>

</dependency>

 

<!-- Spring-Test -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>5.2.20.RELEASE</version>

</dependency>

<!--junit的核心jar-->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>

</dependencies>

 

<build>

<plugins>

<!-- 指定jdk,防止update project -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.8</source>

<target>1.8</target>

<!-- 專案編碼 -->

<encoding>UTF-8</encoding>

</configuration>

</plugin>

</plugins>

</build>

</project>

匯入一個依賴,傳遞過來剩下的jar檔案

 

 

 

 

 

 

 

5.1.4 EmpService -> EmpServiceImpl

package com.hy.service.impl;

 

import com.hy.service.EmpService;

 

public class EmpServiceImpl implements EmpService {

@Override

public void reg() {

System.out.println("用戶注冊");

}

}

 

 

1) 先匯入spring的相關環境,其實就是匯入pom檔案jar包的坐標gav

2) 創建spring的組態檔applicationContext.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">

 

<!-- 實驗01 [重要] 創建bean -->

<!-- bean標簽,通過配置bean標簽告訴IOC容器需要創建是哪個類的物件

id屬性:當前bean的唯一標識,設定了這個唯一標識后,在其他地方就可以用來參考這個bean物件

class屬性:指定這個bean要配置的類的全類名 -->

<bean id="empService" class="com.hy.service.impl.EmpServiceImpl" />

</beans>

這個bean沒有屬性,所以可以寫成單標簽

5.1.5 創建測驗類

public class TestService {

// ApplicationContext就是我們的IOC容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");

 

//實驗01 [重要] 創建bean

//IOC容器中獲取已配置的bean

@Test

public void testEmpService() {

//通過beanid屬性的值得,獲取這個bean物件

EmpService empService = (EmpService)iocContainer.getBean("empService");

empService.reg();

}

}

 

注意:Spring底層默認通過反射技術呼叫類的無參構造方法來創建類的物件,

5.1.6 無參構造方法的重要性,寫一個有參的構造方法,測驗

package com.hy.service.impl;

 

import com.hy.service.EmpService;

 

public class EmpServiceImpl implements EmpService {

 

public EmpServiceImpl(int age) {

}

 

@Override

public void reg() {

System.out.println("用戶注冊");

}

}

 

報錯: 如果沒有無參構造方法,則會拋出下面的例外:

 

 

 

 

所以對一個JavaBean來說,無參構造器屬性的getXxx()setXxx()方法必須存在的,特別是在框架中,

 

5.1.7 IOC容器創建物件和自己建區別

 

 

被放入到容器當中,相當于加入了會員俱樂部

 

Spring環境下能夠享受到的所有福利,都必須通過 IOC 容器附加到組件類上,所以隨著我們在 Spring 中學習的功能越來越多,IOC 容器創建的組件類的物件就會比自己 new 的物件 其功能強大的越來越多,

 

5.2 實驗02[重要]創建bean,并根據class型別來獲取

5.2.1 指定型別的 bean 唯一(只有一個)

 

5.2.2 測驗

package com.hy.test;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.hy.service.EmpService;

import com.hy.service.impl.EmpServiceImpl;

 

public class TestService2 {

// ApplicationContext就是我們的IOC容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");

 

//實驗02 [重要] 創建bean并且根據型別獲取bean物件

//IOC容器中根據型別獲取已配置的bean物件

@Test

public void testEmpService() {

// EmpService empService = iocContainer.getBean(EmpService.class);       //正確

EmpService empService = iocContainer.getBean(EmpServiceImpl.class);  //正確

empService.reg();  //用戶注冊

}

}

 

 

5.2.3 問題:如果配置了兩個同樣型別的bean物件,則報錯,根據型別獲取報錯,

<?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">

 

<!-- 實驗01 [重要] 創建bean -->

<!-- bean標簽,通過配置bean標簽告訴IOC容器需要創建是哪個類的物件

id屬性:當前bean的唯一標識,設定了這個唯一標識后,在其他地方就可以用來參考這個bean物件

class屬性:指定這個bean要配置的類的全類名 -->

<bean id="empService" class="com.hy.service.impl.EmpServiceImpl" />

 

<bean id="empService2" class="com.hy.service.impl.EmpServiceImpl" />

</beans>

 

package com.hy.test;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.hy.service.EmpService;

import com.hy.service.impl.EmpServiceImpl;

 

public class TestService2 {

// ApplicationContext就是我們的IOC容器

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");

 

//實驗02 [重要] 創建bean并且根據型別獲取bean物件

//如果容器中配置了同樣型別的兩個bean物件,

//IOC容器中根據型別獲取已配置的bean物件時,則報錯,

@Test

public void testEmpService() {

// EmpService empService = iocContainer.getBean(EmpService.class);       //失敗

EmpService empService = iocContainer.getBean(EmpServiceImpl.class);  //失敗

}

}

 

 

 

 

 

 

 

 

5.2.4 總結

如果一個類實作了某個介面,根據介面型別可以獲取 bean 嗎?

可以,前提是bean唯一,如下的配置就不行,

<bean id="empService" class="com.hy.service.impl.EmpServiceImpl" />

 

<bean id="empService2" class="com.hy.service.impl.EmpServiceImpl" />

 

如果一個介面有多個實作類,這些實作類都配置了 bean標簽,根據介面型別可以獲取 bean 嗎?

不行,因為bean不唯一

 

根據型別來獲取bean時,在滿足bean唯一性的前提下,其實只是看:『物件 instanceof 指定的型別』的回傳結果,只要回傳的是true就可以認定為和型別匹配,能夠獲取到,

5.3 實驗03[重要] bean的屬性賦值:通過setXxx方法注入

5.3.1 首先,給EmpServiceImpl添加一個屬性,提供setXxxgetXxx方法

package com.hy.service.impl;

 

import com.hy.service.EmpService;

 

public class EmpServiceImpl implements EmpService {

private String empStatus;

 

 

public String getEmpStatus() {

return empStatus;

}

 

 

public void setEmpStatus(String empStatus) {

this.empStatus = empStatus;

}

@Override

public void reg() {

System.out.println("用戶注冊");

}

}

 

5.3.2 在配置時給通過property標簽給屬性賦值

 

 

 

 

 

<!-- 實驗03 [重要] 創建bean,同時給bean的屬性賦值:通過setXxx方法注入 -->

<bean id="empService3" class="com.hy.service.impl.EmpServiceImpl">

<!-- property標簽:通過類的setXxx()方法給該類的物件設定屬性值

name屬性:指定屬性名(其實這個名字是setXxxgetXx方法定義的,和屬性名無關)

value屬性:指定屬性值

 -->

<property name="empStatus" value=https://www.cnblogs.com/lijili/p/"積極"/>

</bean>

 

5.3.3 測驗

package com.hy.test;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.hy.service.impl.EmpServiceImpl;

 

public class TestService3 {

private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");

 

//實驗03 [重要]

@Test

public void testEmpService() {

//通過beanid屬性的值得,獲取這個bean物件

EmpServiceImpl empService3 = (EmpServiceImpl)iocContainer.getBean("empService3");

System.out.println(empService3.getEmpStatus());  //積極

}

}

 

5.4 實驗04[重要] 引入外部已宣告的bean

<!-- 實驗四 [重要]bean的屬性賦值:參考外部已宣告的bean -->

    <bean id="empMapper" font-family: Consolas">hy.mapper.impl.EmpMapperImpl ">

        <property name="name" value="https://www.cnblogs.com/lijili/p/范冰冰"/>

    </bean>

 

    <bean id="empService" >

        <!-- 使用外部已經配置好的empMapper這個bean來給當前組件的happyMachine屬性賦值 -->

        <!-- 參考另外一個bean不能再使用value屬性,而要使用ref屬性指定beanid -->

        <!--

            如果錯把ref屬性寫成了value屬性,會拋出例外:

            Caused by: java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.' for property ' empMapper ': no matching editors or conversion strategy found

            意思是不能把String型別轉換成我們要的EmpMapper型別

            說明我們使用value屬性時,Spring只把這個屬性看做一個普通的字串,不會認為這是一個beanid,更不會根據它去找到bean來賦值

        -->

        <property name="empMapper" ref=" empMapper "/>

    </bean>

 

5.5 內部bean[重要]

 

<!-- 內部bean PersonServiceImpl里有一個Dept屬性 -->

<bean id="personService" class="com.hy.service.impl.PersonServiceImpl">

<property name="dept" >

           <!-- property標簽內部再配置一個bean,這就是內部bean

內部bean可以直接用來給property指定的屬性賦值

-          ->

<!--  

內部bean,僅僅被外部bean使用,不能讓其他的bean使用,所以內部bean不需要id

 -->

<bean class="com.hy.bean.Dept"/>

</property>

</bean>

 

5.6  引入外部屬性檔案[重要]

<!-- 實驗六 [重要]bean的屬性賦值:引入外部屬性檔案 -->

<!-- 使用context名稱空間下的property-placeholder標簽引入外部屬性檔案(本質上就是記錄外部屬性檔案的位置) -->

    <!-- location屬性:指定外部屬性檔案的路徑,classpath:表示這個路徑從類路徑根目錄開始 -->

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

 

    <bean id="druidDataSource" >

        <!-- 通過 ${key}的形式參考外部屬性檔案中的資料 -->

        <property name="url" value="https://www.cnblogs.com/lijili/p/${jdbc.url}"/>

        <property name="driverClassName" value="https://www.cnblogs.com/lijili/p/${jdbc.driver}"/>

        <property name="username" value="https://www.cnblogs.com/lijili/p/${jdbc.user}"/>

        <property name="password" value="https://www.cnblogs.com/lijili/p/${jdbc.password}"/>

    </bean>

5.7 bean的屬性賦值:級聯屬性賦值(不重要,不怎么使用)

使用內部bean,給級聯屬性賦值,

 

<!-- 實驗七 給bean的屬性賦值:級聯屬性賦值 -->

    <bean id="happyComponent7" >

 

        <!-- 使用內部bean的形式將happyMachine屬性初始化 -->

        <property name="happyMachine">

            <!-- 相當于創建了HappyMachine的空物件賦值給happyMachine屬性 -->

            <bean font-family: Consolas">hy.ioc.component.HappyMachine"/>

        </property>

 

        <!--

            如果happyMachine屬性沒有被初始化,那么直接訪問級聯屬性會拋出例外:

            Caused by: org.springframework.beans.NullValueInNestedPathException: Invalid property 'happyMachine' of bean class [com.atguigu.ioc.component.HappyComponent]: Value of nested property 'happyMachine' is null

        -->

        <property name="happyMachine.machineName" value="https://www.cnblogs.com/lijili/p/aaa"/>

    </bean>

5.8 通過構造方法,給bean屬性賦值[不重要]

<!-- 實驗八 給bean的屬性賦值:構造器注入 -->

    <bean id="happyTeam" >

        <!-- 呼叫類的構造器創建物件并同時傳入引數值 -->

        <!-- constructor-arg標簽:給構造器對應位置傳入引數 -->

        <!-- index屬性:指定當前引數在引數串列中的索引位置 -->

        <!-- name屬性:指定當前引數的引數名 -->

        <!-- value屬性:指定引數值 -->

        <constructor-arg index="0" name="teamName" value="https://www.cnblogs.com/lijili/p/gaysTeam"/>

        <constructor-arg index="1" name="memberCount" value="https://www.cnblogs.com/lijili/p/10" />

        <constructor-arg index="2" name="memberSalary" value="https://www.cnblogs.com/lijili/p/555.55"/>

    </bean>

5.9 bean的集合屬性賦值[不重要]

private List<String> nameList;  //標簽不需要完全一致,一樣可以賦值成功

private Map<String,String> nameMap;

 

<!-- 實驗十一 給bean的屬性賦值:集合屬性 -->

    <bean id="classes" >

        <property name="nameList">

            <!-- list標簽:準備一組集合型別的資料,給集合屬性賦值 -->

            <!--<list>

                <value>member01</value>

                <value>member02</value>

                <value>member03</value>

            </list>-->

 

            <!-- 使用set標簽也能實作相同效果,只是附帶了去重功能 -->

            <!--<set>

                <value>member01</value>

                <value>member02</value>

                <value>member02</value>

            </set>-->

 

            <!-- array也同樣兼容 -->

            <array>

                <value>member01</value>

                <value>member02</value>

                <value>member02</value>

            </array>

 

        </property>

 

        <property name="nameMap">

            <!-- Map型別的屬性賦值 -->

            <!--<map>

                <entry key="財務部" value="https://www.cnblogs.com/lijili/p/張三"/>

                <entry key="行政部" value="https://www.cnblogs.com/lijili/p/李四"/>

                <entry key="銷售部" value="https://www.cnblogs.com/lijili/p/王五"/>

            </map>-->

 

            <!-- 也可以使用props標簽 -->

            <props>

                <prop key="財務部">張三2</prop>

                <prop key="行政部">李四2</prop>

                <prop key="銷售部">王五2</prop>

            </props>

        </property>

    </bean>

5.10 自動裝配 手動裝配[了解]

所謂自動裝配就是一個組件需要其他組件時,由 IOC 容器負責找到那個需要的組件,并裝配進去,

    <!-- 實驗十二 自動裝配 -->

    <bean id="happyService3" />

    <bean id="happyService2" />

 

    <!-- 使用bean標簽的autowire屬性設定自動裝配效果 -->

    <!-- byType表示根據型別進行裝配,此時如果型別匹配的bean不止一個,那么會拋NoUniqueBeanDefinitionException -->

    <!-- byName表示根據beanid進行匹配,而beanid是根據需要裝配組件的屬性的屬性名來確定的 -->

    <bean id="happyController"

          

          autowire="byName">

        <!-- 手動裝配:在property標簽中使用ref屬性明確指定要裝配的bean -->

        <!--<property name="happyService" ref="happyService"/>-->

    </bean>

@Test

public void testExperiment12() {

    HappyController happyController = iocContainer.getBean(HappyController.class);

    

    HappyService happyService = happyController.getHappyService();

    

    System.out.println("happyService = " + happyService);

}

5.11 bean的宣告周期以及初始化

在無參構造方法打一個斷點,

bean標簽scope配置singleton時,bean的創建是在IOC容器初始化的時候,創建的,而不是在getBean的時候創建的,

bean標簽scope配置prototype時,bean的創建實在呼叫getBean方法的時候創建的,

 

IOC容器關閉之前銷毀bean物件,

 

 

 

 

 

 

 

這個介面總沒有close方法在子介面中,

 

 

 

 

6,基于注解管理bean

XML 組態檔一樣,注解本身并不能執行,注解本身僅僅只是做一個標記,具體的功能是框架檢測到注解標記的位置,然后針對這個位置按照注解標記的功能來執行具體操作,

本質上:所有一切的操作都是Java代碼來完成的,XML和注解只是告訴框架中的Java代碼如何執行,

 

 

 

 

1) 首先根據所需要的組件型別到IOC容器中查找

能夠找到唯一的bean:直接執行裝配

如果完全找不到匹配這個型別的bean:裝配失敗

和所需型別匹配的bean不止一個

沒有@Qualifier注解:根據@Autowired標記位置成員變數的變數名作為beanid進行匹配

能夠找到:執行裝配

找不到:裝配失敗

使用@Qualifier注解:根據@Qualifier注解中指定的名稱作為beanid進行匹配

能夠找到:執行裝配

找不到:裝配失敗

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505576.html

標籤:Java

上一篇:springcloud-@RefreshScope注解

下一篇:JAVA中讓Swagger產出更加符合我們訴求的描述檔案,按需決定顯示或者隱藏指定內容

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more