主頁 > 後端開發 > 1.sprng 簡介

1.sprng 簡介

2022-05-06 07:59:22 後端開發

容器(可以用來管理所有的組件(類))

核心關注:IOC和AOP

1.IOC

Inversion(反轉) Of Control:控制反轉
    控制:資源的獲取方式
        1.主動式(要什么資源自己創建)
            Person{
                Book book=new Book();
                Dog dog=new Dog();
                //復雜物件的創建時比較龐大的工程
            }
        2.被動式:資源的獲取不是自己創建,而是交給一個容器創建和設定
            Person{
                Book book;
                public void test(){
                    book.read();
                }
            }
    容器:管理所有的組件(有功能的類),主動的new資源改為被動的接受資源

 1.1 DI(Dependency Injection)依賴注入

容器能知道哪個組件(類)運行的時候,需要另外一個組件(類);
容器通過反射的形式,將容器中準備好的Book物件注入(利用反射給屬性賦值)到Person中
IOC只是思想,而DI是具體的實作
代碼實作:
    1.物體類
    public class Person {
        private String name;
        private Integer age;
        private String gender;
        private String email;
        public Person() {
            System.out.println("person的構造器!");
        }
        public void setName(String name) {
            System.out.println("設定pserson的name");
            this.name = name;
        }
        public void setAge(Integer age) {
            System.out.println("設定person的age");
            this.age = age;
        }
        public void setGender(String gender) {
            System.out.println("設定person的gender");
            this.gender = gender;
        }
        public void setEmail(String email) {
            System.out.println("設定person的email");
            this.email = email;
        }
      ....
      ...get()
    }
    2.spring的組態檔ioc.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">
            <!--注冊person物件,spring會自動創建這個person物件-->
            <bean  id="person01">
                <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>------------->name是bean中的屬性,通過set方法反射注入
                <property name="email" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/[email protected]"/>
                <property name="gender" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/男"/>
                <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"/>
            </bean>
        </beans>
    3.測驗類:
        public class Test {
            public static void main(String[] args) {
                System.out.println("啟動spring容器....");
                ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");--------->啟動spring的組態檔
                System.out.println("spring容器啟動成功!");
                Person person= (Person) ioc.getBean("person01");----------->此處的person01為spring組態檔中的bean的id
                System.out.println(person);
            }
        }
    輸出:
        啟動spring容器....
        person的構造器!
        設定person的age
        設定person的email
        設定person的gender
        設定pserson的name
        spring容器啟動成功!
        Person{name='吳孟達', age=18, gender='男', email='[email protected]'}

結論:------>發現其執行順序為:
    1.<bean...>元素驅動spring容器呼叫構造器創建物件
    2.<property...>元素驅動spring執行setter方法
如果一個物體類中參考了其他物體類,容器加載的執行順序
1.第一種情況:范圍大的(person參考book)在范圍小的前面
    spring組態檔內容:
        <bean id="person01" >
            <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
            <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
            <property name="book" ref="book"/>
        </bean>
        <bean id="book" >
            <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
            <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
        </bean>
    物體類資訊:
    ,,,
    測驗類資訊:
        public static void main(String[] args) {
            System.out.println("加載spring....");
            ApplicationContext ac=new ClassPathXmlApplicationContext("ioc.xml");
            System.out.println("spring容器啟動成功!");
            Person person= (Person) ac.getBean("person01");
            System.out.println(person.toString());
        }
    輸出:
        加載spring....
        person實體化!
        Book實體化!
        Book執行set name方法
        Book執行set price方法
        person執行set age方法
        person執行set name方法
        spring容器啟動成功!
    發現執行順序為:
        1.先實體化兩個物件
        2.在執行小的set方法
        3.再執行大的set方法


第二種情況:小范圍的在上
    spring組態檔內容:
      <bean id="book" >
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
        <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
    </bean>
    <bean id="person01" >
        <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
        <property name="book" ref="book"/>
    </bean>
      輸出:
        Book實體化!
        Book執行set name方法
        Book執行set price方法
        person實體化!
        person執行set age方法
        person執行set name方法
        spring容器啟動成功! 
    執行順序為:
        1.小范圍物件實體化
        2.小范圍物件set方法
        3.大范圍物件實體化
        4.大范圍物件set方法

 

2.原始碼決議

1.
 以此為示例:
     <bean id="book" ></bean>
    實際上<bean.../>元素默認一反射的方式來呼叫該類的無參構造器
    底層簡單原始碼如下:
        String idStr=...;//決議<bean,,,,/>元素的id屬性得到該欄位的字串值為"book"
        String classStr=...;//決議class屬性得到該欄位的值為:entity.Book
        Class clazz=Class.forName(classStr);
        Object object=clazz.newInstance();//通過反射示例化物件
        container.put(idstr,obj);//將物件放入容器給中,container為spring容器
    
2.
   <bean id="person01" >
        <property name="book" ref="book"/>
    </bean>
    底層的簡單原始碼如下:
        String nameStr=...;決議<property.../>元素的name屬性得到該字串的值為book
        String refStr=..;決議<property.../>元素的ref屬性得到該字串的值為book
        String setterName-"set"+nameStr.subString(0,1).toUpperCase()+name.subString(1);//生成將要呼叫的setter方法】
        Object paramBean=container.get(refStr);//從容器中取到refStr的bean,作為傳入引數
        Method setter=clazz.getMethod(setterName,parmBean.getClass())//此處的clazz和1的對應起來
        setter.incoke(obj,parmBean);//此處的obj和1的對應起來

 

3.組件在spring容器中是單例的

public static void main(String[] args) {
        System.out.println("加載spring....");
        ApplicationContext ac=new ClassPathXmlApplicationContext("ioc.xml");
        System.out.println("spring容器啟動成功!");
        Person person1= (Person) ac.getBean("person01");
        Person person2= (Person) ac.getBean("person01");
        System.out.println(person1==person2);------------------------->此時輸出為true;
}

 

4.使用構造器為bean的屬性賦值

spring組態檔為:
    <bean id="book" >
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
        <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
    </bean>
    <bean id="person01" >-------------------------------->此處有兩個person的bean:這一個使用set方法給屬性賦值,呼叫的是無參構造器
        <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
        <property name="book" ref="book"/>
    </bean>
    <bean id="person02" >------------------------------>這里呼叫的是有參構造器來進行屬性賦值
        <constructor-arg name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></constructor-arg>
        <constructor-arg name="book" ref="book"></constructor-arg>
        <constructor-arg name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達02"></constructor-arg>
    </bean>
person類的代碼:
    public class Person {
        private String name;
        private Integer age;
        private Book book;
        public Person() {
            System.out.println("person執行無參構造器");
        }
        public Person(String name, Integer age, Book book) {
            this.name = name;
            this.age = age;
            this.book = book;
            System.out.println("person執行有參構造器");
        }
        get/set方法
    }
測驗類方法:
    public static void main(String[] args) {
        System.out.println("加載spring....");
        ApplicationContext ac=new ClassPathXmlApplicationContext("ioc.xml");
        System.out.println("spring容器啟動成功!");
        Person person= (Person) ac.getBean("person02");
        System.out.println(person.toString());
    }
輸出:
    加載spring...
    Book實體化!
    Book執行set name方法
    Book執行set price方法 
    person執行無參構造器-------------->呼叫無參構造器實體化物件,然后呼叫set方法賦值
    person執行set age方法
    person執行set name方法
    person執行有參構造器-------------->呼叫有參構造器,并且直接賦值
    spring容器啟動成功!
    Person{name='吳孟達02', age=18, book=Book{name='java分析', price=32}}

 

5.使用p名稱空間為bean屬性賦值

1.在spring的xml檔案中加入這一句:xmlns:p="http://www.springframework.org/schema/p"
    <?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:p="http://www.springframework.org/schema/p"----------------------------------->加入這一句
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="book" >
            <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
            <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
        </bean>
        <bean id="person03"  p:age="18" p:name="吳孟達03" p:book-ref="book"></bean>------>此時可以通過p標簽進行賦值
    </beans>

 

 

6.復雜賦值

1.給屬性賦值null
    <bean id="person04" >
        <property name="name">
            <null></null>---------------------------->使用null標簽進行賦值:不能使用<property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/null">這是付了一個null的字串
        </property>
    </bean>
    
2.屬性是參考時
    2.1參考外部bean
        <bean id="book" >
            <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
            <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
        </bean>
        <bean id="person04" >
            <property name="name">
                <null></null>
            </property>
            <property name="book" ref="book"></property>------------->如果外邊已經有了像參考的Book bean,則使用ref參考:這里意思是:book=ioc.getBean("book")
        </bean>
        測驗代碼:
            ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
            Person person= (Person) ioc.getBean("person04");
            System.out.println(ioc.getBean("book")==person.getBook());------------->此時輸出為true
    2.2內部參考
        <bean id="person04" >
            <property name="name">
                <null></null>
            </property>
            <property name="book">
                <!--物件我們可以使用bean標簽創建 book=new Book();參考內部bean-->
                <bean >---------------------------------------->此處需要注意的是:內部bean不能直接通過ioc容器獲取:
                    <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java"></property>           ----->如<bean id="bookInner" >內部bean加上id
                    <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/25"></property>            ------>ioc.getBean("bookInner")會獲取出錯!
                </bean>
            </property>
        </bean>
        測驗代碼為:
             ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
            Person person= (Person) ioc.getBean("person04");
            System.out.println(ioc.getBean("book")==person.getBook());------------->此時輸出為false

3.為list屬性賦值
    為psrson新增屬性
        private List<Book> library;
    如何為library賦值
        <property name="library">
            <!--library=new ArrayLiast<Book>-->
            <list>-------------------------------->使用過list標簽
                <bean  p:name="java" p:price="14"></bean>------>1.用bean標簽創建list元素
                <ref bean="book"></ref>-------------------------------------------->2.用ref標簽引入外部bean
            </list>
        </property>
        
4.為map賦值
    為person新增一個屬性
        private Map map;
    springxml中的配置
      <property name="map">
            <map>-------------------------------------------->使用map標簽:map=new HashMap<>();
                <entry key="key01" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/張三"></entry>
                <entry key="key02" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></entry>
                <entry key="book01" value-ref="book"></entry>----->可以使用value-ref引入外部bean
                <entry key="key04">
                    <bean  p:name="吳孟達" p:age="18" p:book-ref="book"></bean>------>也可以使用該方式引入內部bean
                </entry>
                <entry key="key05">---->map中嵌套map
                    <map>
        
                    </map>
                </entry>
            </map>
        </property>  

5.為Properties賦值
    person新增一個屬性:
        private Properties properties;
    spring的組態檔中:
        <property name="properties">
            <!--properties=new Properties();所有的k=v都是String-->
            <props>
                <!--k=v都是string,值直接寫在標簽中-->
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
        
6.使用util名稱空間創建集合型別的bean
    使用場景:如果相同的map或者list在多處都有參考
    可以將map或list單獨拿出來做個bean
    使用步驟
        1.在spring的組態檔中加入:xmlns:util="http://www.springframework.org/schema/util"
            <?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:p="http://www.springframework.org/schema/p"
                   xmlns:util="http://www.springframework.org/schema/util"---------------------->在spring的組態檔中加入這行
                   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
                   ,,,,,
               </bean>
       2.
           <!--相當于new LinkedHashMap<>()-->
            <util:map id="mymap">
                <!--往map中添加元素-->
                <entry key="key01" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/張三"></entry>
                <entry key="key02" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></entry>
                <entry key="book01" value-ref="book"></entry>
                <entry key="key04">
                    <bean  p:name="吳孟達" p:age="18" p:book-ref="book"></bean>
                </entry>
                <entry key="key05">
                    <map></map>
                </entry>
            </util:map>
        3.其他地方的使用
            <property name="map" ref="mymap"></property>----->直接根據參考獲取即可
            也可以在代碼中直接獲取
            Map<String,Object> map= (Map<String, Object>) ioc.getBean("mymap");

7.util:list的使用和list標簽類似
    <util:list id="mylist">
        <bean  p:book="西游" p:name="吳孟達"></bean>
        <ref bean="mymap"></ref>
        <value>12</value>
    </util:list>

8.級聯屬性:屬性的屬性
    <bean id="book" >
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/java分析"/>
        <property name="price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/32"/>
    </bean>
    <bean id="person05" >
        <property name="book" ref="book"></property>
        <property name="book.price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/1000"></property>
        ----->這里通過book.price直接更改:person的book屬性的price屬性:但這里注意的是這里一改,容器中的book的bean的price屬性改為1000
    </bean>

9.通過繼承實作bean屬性的重用
    <bean id="person01" >
        <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
        <property name="book" ref="book"/>
    </bean>
    這里需要一個personbean,其他屬性都一樣,只有age屬性變為19,則可以這樣
    <bean id="person06"  parent="person01">--------->使用parent屬性,指定需要繼承屬性的bean id,這里的繼承只是當前bean的配置資訊繼承,并不是真正的類繼承
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/劉丹"></property>
    </bean>
    結論:
       1. 這里的person01和pserson06在容器中是不同的組件(物件)
       2.這兩個組件的屬性都相同,只有name屬性值不同
       3.因為指定了要繼承配置資訊的類,所以上述還可以這樣寫
            <bean id="person06" parent="person01">-------------------------->省略了class,因為配置資訊繼承于person01,所以class配置值可以繼承person01的class配置值值
                     <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/劉丹"></property>
            </bean>
        4.父類的資訊不會因為子類而更改!
10.專門建立一個供其他bean繼承的bean
     <bean id="person01"  abstract="true">----------------------->加入:abstract="true"
        <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
        <property name="book" ref="book"/>
    </bean>
    abstract="true"這個bean的配置是一個抽象的,不能獲取他的實體,只能被別人繼承
    此時:
        ioc.getBean("person01");-------------------->此時獲取會報錯,因為這個是被其他bean繼承的

 

 

7.bean的作用域

1.單例:scope="singleton"
    <bean id="person05"  scope="singleton">
        <property name="book" ref="book"></property>
        <property name="book.price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/1000"></property>
    </bean>
2.多例:scope="prototype"
    <bean id="person05"  scope="prototype">
        <property name="book" ref="book"></property>
        <property name="book.price" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/1000"></property>
    </bean>
結論:
    1.scope="singleton"單例模式:默認
        1.1在容器啟動完成前就已經創建好物件,保存在容器中
        1.2任何獲取都是獲取之前創建好的物件
    2.scope="prototype"多例模式
        2.1容器啟動默認不會創建多例的bean
        2.2每次獲取的時候創建這個bean(ioc.getBean("person05"))
        2.3每次獲取都會創建一個新的物件

 

8.bean的生命周期(自定義初始化方法和銷毀方法)

1.當是單例模式
    1.person物體類
        public class Person {
            //person的無參構造器
            public Person() {
                System.out.println("person的無參構造器方法...");
            }
            //自定義初始化方法
            public void initMethod(){
                System.out.println("person的初始化方法");
            }
            //自定義物件銷毀方法
            public void destroyMethod(){
                System.out.println("person的銷毀方法");
            }
        }
    2.spring的組態檔
        <bean id="person" 
          init-method="initMethod"--------------------------->指定自定義的初始化方法
          destroy-method="destroyMethod"--------------------->指定自定義的銷毀方法
        >
        </bean>
    3.測驗類
        public static void main(String[] args) {
            System.out.println("spring容器啟動...");
            ConfigurableApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
            System.out.println("spring容器啟動成功!");
            System.out.println("關閉spring容器...");
            ioc.close();---------------------------------------->呼叫容器的停止方法
            System.out.println("關閉spring容器成功!");
        }
    輸出:
        spring容器啟動...
        person的無參構造器方法...
        person的初始化方法
        spring容器啟動成功!
        關閉spring容器...
        person的銷毀方法
        關閉spring容器成功!

2.當是多例模式
    2.1ioc的組態檔
            <bean id="person" 
                  scope="prototype"---------------------------->多例模式
                  init-method="initMethod"
                  destroy-method="destroyMethod"
            >
            </bean>
        測驗代碼:
            public static void main(String[] args) {
                System.out.println("spring容器啟動...");
                ConfigurableApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
                System.out.println("spring容器啟動成功!");
                System.out.println("關閉spring容器...");
                ioc.close();
                System.out.println("關閉spring容器成功!");
            }
        輸出:
            spring容器啟動...
            spring容器啟動成功!
            關閉spring容器...
            關閉spring容器成功!
        因為多例模式不是容器啟動的時候創創建,而是在ioc.getBean("id")時候創建該物件!
   
     2.2當測驗代碼為:
            public static void main(String[] args) {
                System.out.println("spring容器啟動...");
                ConfigurableApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
                System.out.println("spring容器啟動成功!");
                ioc.getBean("person");------------------------>多例模式獲取bean物件
                System.out.println("關閉spring容器...");
                ioc.close();
                System.out.println("關閉spring容器成功!");
            }
        輸出:
            spring容器啟動...
            spring容器啟動成功!
            person的無參構造器方法...
            person的初始化方法
            關閉spring容器...
            關閉spring容器成功!
            
結論:
    1.當是單例模式時:Bean的生命周期
        (容器啟動)構造器方法---->初始化方法----->(容器關閉)銷毀方法
    2.多實體
        獲取bean(構造器------>初始化方法---->容器關閉(不會呼叫銷毀方法))

 

9.Bean的后置處理器

1.自定義一個類實作BeanPostProcessor介面
    public class MyBeanPostProcess  implements BeanPostProcessor {
    /**
     * 自定義的初始化方法之前呼叫
     * Object o是容器創建的bean
     * String s是spring組態檔中配置的id
     */
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("bean的后置處理器Befor...方法");
        System.out.println(s+":"+o);
        return o;----->注意:這里不能return null,要不會報錯
    }
    //自定義初始化方法之后執行  
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("bean的后置處理器After...方法");
        System.out.println(s+":"+o);
        return o;------------------------->注意:這里如果return null;則ioc.getBean也是為null;
    }
}
2.在spring組態檔中配置后置處理器
    <!--物體類配置-->
    <bean id="person01"  
         init-method="initMethod"----------------------->perosn類的自定義初始化方法(person實體化時后會呼叫)
         destroy-method="destroyMethod">----------------->person類的自定義銷毀方法(spring容器銷毀前會呼叫)
        <property name="age" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/18"></property>
        <property name="name" value="https://www.cnblogs.com/wmd-l/archive/2022/05/05/吳孟達"></property>
    </bean>
    <!--后置處理器配置-->
    <bean id="myBeanPostProcess" ></bean>
3.測驗代碼如下:
    public static void main(String[] args) {
        System.out.println("加載spring....");
        ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
        System.out.println("spring容器啟動成功!");
        Object bean= ioc.getBean("person01");
        System.out.println("容器獲取的bean:"+bean);
    }
4.輸出:
    person執行無參構造器
    person執行set age方法
    person執行set name方法
    bean的后置處理器Befor...方法
    person01:Person{name='吳孟達', age=18, book=null}
    person自定義的初始化方法
    bean的后置處理器After...方法
    person01:Person{name='吳孟達', age=18, book=null}
    spring容器啟動成功!
    容器獲取的bean:Person{name='吳孟達', age=18, book=null}
結論:
    發現帶后置處理器的執行流程如下:        

執行順序:?

  • 1.bean實體化
  • 2.執行bean的后置處理器的postProcessBeforeInitialization方法
  • 3.執行自定義的初始化方法
  • 4.執行bean后置處理器的postProcessAfterInitialization方法

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

標籤:其他

上一篇:分享一下 Idea 的 scope 功能

下一篇:sqlx操作MySQL實戰及其ORM原理

標籤雲
其他(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