主頁 > 後端開發 > Spring學習筆記

Spring學習筆記

2021-08-31 17:50:20 後端開發

目錄
  • 一、spring檔案及注解
    • 1、spring配置主要全部檔案
      • pom.xml
      • applicationContext.xml
      • Main.java
      • UserDao.java
      • UserDaoImpl.java
    • 2、spring配置主要全部注解
    • 3、Spring重點基礎知識
      • 1.名詞解釋
      • 2.Bean生命周期:1實體化、2屬性賦值、3初始化、4使用、5銷毀
      • 3.Bean 標簽屬性
      • 4.Spring核心:
    • 4、bean實體化:無參、工廠靜態、工廠實體
      • 1.無參構造方法實體化:默認
      • 2.工廠靜態方法實體化:直接呼叫方法
      • 3.工廠實體方法實體化:先有工廠物件再調方法
    • 5、依賴注入DI:注入型別:物件、普通資料、集合資料
      • 1.構造方法注入:有參構造
      • 2.set方法注入:
      • 3.p命名空間注入:(本質set)
        • 1引入p命名空間:
        • 2修改注入方式:
    • 6、依賴注入型別:參考資料(物件)、普通資料、集合資料
      • 1.普通資料
      • 2.參考資料
      • 3.集合資料
  • 三、引入其他組態檔(分模塊開發)
    • 1、< import >標簽
  • 四、Spring的重點配置
    • 1、< property >標簽:屬性注入、setter()
      • 1. name屬性:屬性名稱
      • 1. value屬性:注入的普通屬性值
      • 1. ref屬性:注入的物件參考值
      • 1. < set >標簽:集合——參考ref
      • 1. < list >標簽:集合——參考ref
      • 1. < map >標簽:集合——鍵值對
      • 1. < properties >標簽:與map類似——鍵值對
    • 2、< constructor-arg >標簽:指定建構式的引數注入
  • 五、SpringAPI
    • 1、ApplicationContext的繼承
    • 2、ApplicationContext的實作類
      • 1.ClassPathXmlApplicationContext:類 路徑 檔案型別 應用 背景關系——resource下檔案(相對)
      • 2.FileSystemXmlApplicationContext:檔案 系統 檔案型別 應用 背景關系——磁盤絕對路徑
      • 3.AnnotationConfigApplicationContext:注解 配置 應用 背景關系——注解開發
    • 3、getBean()方法的使用
      • 1.強轉型別
      • 2.直接獲取類物件:類檔案直接指定
      • 3.通過java物件獲取
  • 六、配置資料源
    • 1 、資料源(連接池)的作用
      • 1.提高程式性能
      • 2.事先實體化資料源、初始化部分連接資
      • 3.使用連接資源時從資料源中獲取
      • 4.使用完畢后將連接資源歸還給資料源
    • 2 、引入相關坐標依賴
    • 3、手動創建C3P0資料源:一定要注意空格、注意名稱正確
    • 4、手動創建Druid資料源:一定要注意空格、注意名稱正確
    • 5、手建C3P0(加載properties組態檔):注意空格、名稱正確
      • 1.創建代碼:
      • 2.組態檔jdbc.properties:注意陳述句正確、空格、名稱
  • 七、Spring配置資料源:DataSource——.set方法注入
    • 1、application組態檔:配置連接資訊——com.mchange.v2.c3p0.ComboPooledDataSource
      • 1.注意一個問題:&會報錯——寫成&
    • 2、代替ComboPooledDataSource——>ClassPathXmlApplicationContext
  • 八、Spring單獨配置資料源:xml加載properties檔案——分開資料庫與Spring
    • 1、spring加載properties檔案步驟:
      • 1.引入context命名空間和約束路徑:
        • 1命名空間:xmlns:context="http://www.springframework.org/schema/context"
        • 2約束路徑:http://www.springframework.org/schema/context
      • 2.加載組態檔標簽:< context:property-placeholder location="xx.properties"/ >
      • 3.< property name="" value="https://www.cnblogs.com/REMLI-2018/p/${key}"/ >:spr語言——EL
      • 4.DataSource.class
      • 5.DruidDataSource.class
  • 九、Spring注解開發
    • 1、 Spring原始注解
      • @Component——id——實體化——隨便那個——無語意
      • @Controller——Web層控制類實體化——語意化
      • @Service——Service層服務類實體化——語意化
      • @Repository——id——Dao層資料存盤類實體化——語意化
      • @Autowired——無需Setter——欄位按型別注入——可單獨使用
      • @Qualifier——name/id——@Autowired+按名稱注入——必須配合使用
      • @Resource——按名稱注入=@Autowired+@Qualifier——J2EE提供
      • @Value——注入普通屬性
      • @Scope——Bean作用范圍
      • @PostConstruct——Bean初始化方法——構造后
      • @PreDestroy——Bean銷毀方法——銷毀前
      • @Order——注入物件參考集合
    • 2、組件掃描:component-scan
    • 3、2種配置/注解方式對比:
      • 1.原始xml配置方式
      • 2.注解@方式!!!
    • 2、Spring新注解
      • @Configuration——指定類為Spring配置類
      • @ComponentScan——指定Spring初始化容器掃描包
      • @Bean——方法回傳值存盤到Spring容器中
      • @PropertySource——加載properties檔案配置
      • @Import——匯入其他類配置
    • 3、Spring物件創建——實體化——找到類創建物件——所在位置
      • @Component——隨便
      • @Controller——web視圖控制層
      • @Service——Service業務服務層
      • @Repository——Dao資料持久化層
    • 4、Spring注入
      • 1.物件注入:依據、bean(id)=name、類、屬性注入
        • @Resource:默認按名稱byName注入——(J2EE提供注解)——需添加其依賴
          • 1name: Spring 將 name 的屬性值決議為 bean 的名稱, 使用 byName 的自動注入策略
          • 2type: Spring 將 type的屬性值決議為 bean 的型別,使用 byType 的自動注入策略
          • 3反射—— byName 自動注入策略
        • @Autowried:默認按型別byType注入
        • @Qualifier:默認類名
      • 2.普通屬性注入:——Value

一、spring檔案及注解

1、spring配置主要全部檔案

在這里插入圖片描述

pom.xml

 	 <dependencies>
        <!--————————————————添加Spring依賴支持————————————————-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.7</version>
        </dependency>
        <!--————————————————添加Spring測驗支持————————————————-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.7</version>
        </dependency>
        <!--————————————————添加Spring-MVC視圖表現層支持————————————————-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.7</version>
        </dependency>
        <!--————————————————添加Spring 資料庫事務管理支持————————————————-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.7</version>
        </dependency>
        <!--————————————————添加Spring-aop面向切面編程支持————————————————-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.7</version>
        </dependency>
    </dependencies>

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">


    <bean id="userDao"  ></bean>

    
</beans>

Main.java

    public static void main(String[] args) {
        /*決議application.xml組態檔獲取Bean實體(物件)*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*物件獲取并強制轉換型別*/
        UserDao userDao = (UserDao) app.getBean("userDao");
        /*物件呼叫方法*/
        userDao.save();
    }
    
        /*獲取檔案流*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*介面*/                      /*介面實作*/

        /*獲取物件*/                /*強轉物件*/
        UserService userService = (UserService) app.getBean("userService");

        userService.save();

UserDao.java


public interface UserDao {
    /*介面的方法*/
    public void save();
}

UserDaoImpl.java

public class UserDaoImpl implements UserDao {
    /*實作介面的類的方法*/
    public void save() {
        System.out.println("程式啟動");
    }
}

2、spring配置主要全部注解

3、Spring重點基礎知識

1.名詞解釋

  1. 類(人類):共同特征的物體的集合、模板、一類事物、抽象、概念、同種屬性

  2. 實體:一個真實的物件

  3. 物件(個人):組成類的元素、類的具體實作、實際執行者

  4. 屬性:資料(變數/值)

  5. 定義:編譯器創建物件、分配記憶體、取名(變數名/物件名)

  6. 宣告:宣告物件(物件名/物件型別)、告知編譯器物件/屬性的情況

  7. 實體化:類創建物件的程序

  8. 初始化:為變數分配記憶體空間、并確定其初始值的程序

  9. 構造方法:與類同名的特殊方法、創建物件

  10. 構造器:與類同名的特殊方法、創建物件

2.Bean生命周期:1實體化、2屬性賦值、3初始化、4使用、5銷毀

  1. 實體化前階段:執行Instantiation Aware Bean PostProcessor Adapter的post Process Before ln station方法

  2. 執行Instantiation Aware Bean PostProcessor Adapter的determine Candidate Constructors方法

  3. 介面Merged Bean Definition PostProcessor的post Process Merged Bean Definition方法

  4. 實體化Bean(執行Bean構造方法)

  5. 實體化后階段:執行Instantiation Aware Bean PostProcessor Adapter的post Process After In station方法,方法回傳false的時候, 后續的Bean屬性賦值前處理、Bean屬性賦值都會被跳過了,

  6. 屬性賦值前階段(可在此修改屬性的值):執行Instantiation Aware Bean PostProcessor的post Process Properties方法,回傳空的時候, 表示這個bean不需要設定屬性, 直接回傳了, 直接進入下一個階段,

  7. 屬性賦值(Populate)

  8. Aware介面

  9. 執行Instantiation Aware Bean PostProcessor Adapte的post Process Before ln it i alization方法

  10. 自定義初始化方法

  11. 執行Instantiation Aware Bean PostProcessor Adapte的post Process After ln it i alization方法

  12. 容器創建成功,提供使用

  13. 呼叫自定義銷毀方法方法

3.Bean 標簽屬性

  1. id 屬性:唯一性、不可重復
    屬性值任意命名,但不可以包含中文以及特殊字符,
    根據 id 屬性值得到配置物件,

  2. class 屬性:類的全路徑名稱
    創建物件所在類的全路徑名稱,

  3. name 屬性:不可重復
    功能和 id 一致,已基本不用,
    區別: id 屬性值不可以包含特殊字符, name 屬性值可以包含,

  4. scope 屬性
    bean 作用范圍屬性值:

取值范圍
singleton 單例 默認值、只生成1個實體
prototype 多例 多例的
request WEB專案中, Spring創建一個Bean的物件, 將物件存入到request域中
session WEB專案中, Spring創建一個Bean的物件, 將物件存入到session域中
global session WEB專案中, 應用在Portlet環境, 如果沒有Portlet環境那么global Session相當于session
  1. 作用域:scope

     singleton: 單例模式,在整個Spring IoC容器中,singleton作用域的Bean將只生成一個實體,
     prototype: 每次通過容器的getBean()方法獲取prototype作用域的Bean時,都將產生一個新的Bean實體,
     request: 對于一次HTTP請求,request作用域的Bean將只生成一個實體,這意味著,在同一次HTTP請求內,程式每次請求該Bean,得到的總是同一個實體,只有在Web應用中使用Spring時,該作用域才真正有效,
     session:該作用域將 bean 的定義限制為 HTTP 會話, 只在web-aware Spring ApplicationContext的背景關系中有效,
     global session: 每個全域的HTTP Session對應一個Bean實體,在典型的情況下,僅在使用portlet context的時候有效,同樣只在Web應用中有效,
    

4.Spring核心:

  1. Spring容器介面:ApplicationContext

     ClassPathXmlApplicationContext: 從類加載路徑下搜索組態檔,并根據組態檔來創建Spring容器,
     FileSystemXmlApplicationContext: 從檔案系統的相對路徑或絕對路徑下去搜索組態檔,并根據組態檔來創建Spring容器,
    

4、bean實體化:無參、工廠靜態、工廠實體

1.無參構造方法實體化:默認

    <!--找無參構造方法-->
    <bean id="userDao"   init-method="init" destroy-method="destroy" scope="prototype"></bean>

/*重寫無參構造——修改默認構造方法——對應介面*/
public UserDaoImpl(){
    System.out.println("無參構造修改:UserDaoImpl物件創建...");
}

2.工廠靜態方法實體化:直接呼叫方法

 	<!--找全包名對應內部指定的方法、去回傳對應的物件-->
    <bean id="userDao1"   scope="prototype" factory-method="getUserDao"></bean>
public class StaticFactory {
    /*物件工廠——物件創建——回傳物件*/
    public static UserDao getUserDao() {
        /*回傳物件*/
        return new UserDaoImpl();
    }
}

3.工廠實體方法實體化:先有工廠物件再調方法

 	<!--先創建工廠物件-->
    <bean id="factory"   scope="prototype" ></bean>
    <!--從容器當中工廠物件內部的方法獲取指定回傳的物件-->
    <bean id="userDao2"  factory-bean="factory" factory-method="getUserDao"></bean>
public class DynamicFactory {
    /*物件工廠*/
    public UserDao getUserDao() {
        /*回傳物件*/
        return new UserDaoImpl();
    }
}

5、依賴注入DI:注入型別:物件、普通資料、集合資料

1.構造方法注入:有參構造

    <bean id="userService"  >
                    <!--引數名-->            <!---->
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    public UserServiceImpl(UserDao userDao) {/*有參構造*/
        this.userDao = userDao;
    }

2.set方法注入:

    <!--找無參構造方法-->
    <bean id="userDao"   init-method="init" destroy-method="destroy" scope="prototype"></bean>

    <!--set依賴注入-->
    <bean id="userService"  >
        <property name="userDao" ref="userDao"></property>
    </bean>
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }

3.p命名空間注入:(本質set)

1引入p命名空間:

        xmlns:p="http://www.springframework.org/schema/p"

2修改注入方式:

    <bean id="userService"   p:userDao-ref="userDao" />

6、依賴注入型別:參考資料(物件)、普通資料、集合資料

1.普通資料

    private String username;
    private int age;


    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }
    <bean id="userDao11"   >
        <!--屬性注入-->
        <property name="username" value="https://www.cnblogs.com/REMLI-2018/p/注意空格"/>
        <property name="age" value="https://www.cnblogs.com/REMLI-2018/p/2021825"/>
    </bean>
        /*獲取檔案流*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*介面*/      /*介面實作*/
        UserDao ud = (UserDao) app.getBean("userDao11");
       /*獲取物件*/  /*強轉物件*/
       
        Object ud1 = app.getBean("userDao11");
        
        ud.save();

2.參考資料

3.集合資料

	/*定義變數、構造方法*/
    private List<String> strList;
    private Map<String , User> userMap;
    private Properties properties;

    public void setStrList(List<String> strList) {
        this.strList = strList;
    }

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }


   	/*實作介面的類的方法*/
    public void save() {
        System.out.println(strList);
        System.out.println(userMap);
        System.out.println(properties);
    }

    private String name;
    private String addr;

    public String getName() {
        return name;
    }

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

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
    <bean id="userDao222"   >
        <!--屬性注入-->
        <property name="strList">
            <list>
                <value>任</value>
                <value>明</value>
                <value>任</value>
            </list>
        </property>
        <property name="userMap">
            <map><!--key value-->
                <entry key="key1" value-ref="user11"> </entry>
                <entry key="key2" value-ref="user22"> </entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="1">111</prop>
                <prop key="2">1112</prop>
                <prop key="3">1113</prop>
            </props>
        </property>
    </bean>

    <bean id="user11" >
        <property name="name" value="https://www.cnblogs.com/REMLI-2018/p/我是"></property>
        <property name="addr" value="https://www.cnblogs.com/REMLI-2018/p/中國"></property>
    </bean>
    <bean id="user22" >
        <property name="name" value="https://www.cnblogs.com/REMLI-2018/p/我是1"></property>
        <property name="addr" value="https://www.cnblogs.com/REMLI-2018/p/中國1"></property>
    </bean>
        /*獲取檔案流*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*介面*/      /*介面實作*/
        UserDao u2= (UserDao) app.getBean("userDao222");
       /*獲取物件*/  /*強轉物件*/
       
        Object d2 = app.getBean("userDao222");

        u2.save();

三、引入其他組態檔(分模塊開發)

實際開發中,Spring的配置內容非常多,這導致Spring配置很繁雜,使用可以拆分到其它組態檔當
中,而且Spring主組態檔通過import標簽加載

1、< import >標簽

  <!--主組態檔——引入分模塊檔案-->
    <import resource="applicationContext-user.xml"></import>
applicationContext.xml
applicationContext-product.xml
applicationContext-user.xml

四、Spring的重點配置

1、< property >標簽:屬性注入、setter()

property:通過setter對應的方法注入,

<property>標簽:屬性注入
	name屬性:屬性名稱
	value屬性:注入的普通屬性值
	ref屬性:注入的物件參考值
	<list>標簽
	<map>標簽
	<properties>標簽

1. name屬性:屬性名稱

1. value屬性:注入的普通屬性值

1. ref屬性:注入的物件參考值

1. < set >標簽:集合——參考ref

<!-- 給set注入值 不能有相同的物件 -->
<property name="empSets">
	<set>
		<ref bean="emp1" />
		<ref bean="emp2"/>
	</set>
</property>

1. < list >標簽:集合——參考ref

<!-- 給list注入值 可以有相同的多個物件 -->
	   <property name="strList">
	      <list>
	            <value>人</value>
	            <value>民</value>
	            <value>人</value>
	       </list>
	   </property>

1. < map >標簽:集合——鍵值對

<!-- 給map注入值 只要map中的key值不一樣就可以裝配value -->
        <property name="userMap">
            <map><!--key value-->
                <entry key="key1" value-ref="user11"> </entry>
                <entry key="key2" value-ref="user22"> </entry>
            </map>
        </property>

1. < properties >標簽:與map類似——鍵值對

        <property name="properties">
            <props>
                <prop key="1">111</prop>
                <prop key="2">1112</prop>
                <prop key="3">1113</prop>
            </props>
        </property>

2、< constructor-arg >標簽:指定建構式的引數注入

constructor-arg:通過建構式注入,

    <!--找無參構造方法-->
    <bean id="userDao"  >
    </bean>
    <bean id="userService"  >
                    <!--引數名-->            <!---->
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>

constructor-arg屬性通過指定type 型別來呼叫對應的建構式,


    <constructor-arg name="id" value="https://www.cnblogs.com/REMLI-2018/p/1"/>
    
    <constructor-arg name="name" value="https://www.cnblogs.com/REMLI-2018/p/student"/>
    
    <constructor-arg name="dream">
        <list>
            <value>soldier</value>
            <value>scientist</value>
            <value>pilot</value>
        </list>
    </constructor-arg>
    
    <constructor-arg name="score">
        <map>
            <entry key="math" value="https://www.cnblogs.com/REMLI-2018/p/90"/>
            <entry key="english" value="https://www.cnblogs.com/REMLI-2018/p/85"/>
        </map>
    </constructor-arg>

五、SpringAPI

1、ApplicationContext的繼承

applicationContext:介面型別,代表應用背景關系,可通過其實體獲得Spring容器中的Bean物件,

2、ApplicationContext的實作類

1.ClassPathXmlApplicationContext:類 路徑 檔案型別 應用 背景關系——resource下檔案(相對)

它是從類的根路徑下加載組態檔(常用)
        /*獲取檔案流*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*介面*/                      /*介面實作*/

2.FileSystemXmlApplicationContext:檔案 系統 檔案型別 應用 背景關系——磁盤絕對路徑

它是從磁盤路徑上加載組態檔,組態檔可以在磁盤的任何位置,
ApplicationContext appp = new FileSystemXmlApplicationContext("C:\\Users\\REMLI\\IdeaProjects\\REM_SSMS\\src\\main\\resources\\applicationContext.xml");

3.AnnotationConfigApplicationContext:注解 配置 應用 背景關系——注解開發

當使用注解配置容器物件時,需要使用此類來創建Spring容器,它用來讀取注解,

3、getBean()方法的使用

1.強轉型別

一個是通過id來獲取:某一個型別可存在多個,獲取后需要強轉,
        UserDao u111= (UserDao) appp.getBean("userDao222");

2.直接獲取類物件:類檔案直接指定

一個通過回傳值來獲取:一種型別只能有一個,獲取后不需要強轉,
        UserDao userDao = app.getBean(UserDao.class);

3.通過java物件獲取

        Object d111 = appp.getBean("userDao222");

六、配置資料源

1 、資料源(連接池)的作用

1.提高程式性能

2.事先實體化資料源、初始化部分連接資

3.使用連接資源時從資料源中獲取

4.使用完畢后將連接資源歸還給資料源

常見資料源:DBCP,C3P0,BoneCP、Druid等

2 、引入相關坐標依賴

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.3.7</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
    <!--添加Druid依賴-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

3、手動創建C3P0資料源:一定要注意空格、注意名稱正確

    @Test
    /*測驗手動創建c3p0資料源*/
    public void test1() throws Exception {
        /*創建資料源*/
        /*康波坡爾*/
        /*注意一個問題保證mysql陳述句的正確、Mysql 8.0.19和以前版本連接陳述句略微不同*/
        /*實體化物件*/
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        /*物件呼叫方法——并set方法賦值*/
        /*賦值驅動類資料庫連接資訊*/
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC");
        dataSource.setUser("root");
        dataSource.setPassword("2020");
        
        /*創建物件獲取連接資訊*/
        Connection connection = dataSource.getConnection();
        
        /*列印物件資訊*/
        System.out.println("\n地址:"+connection);
        
        /*連接關閉、歸還資源*/
        connection.close();

    }

4、手動創建Druid資料源:一定要注意空格、注意名稱正確

    @Test
    /*測驗手動創建druid資料源*/
    /*如果找不到DruidDataSource請在maven里清理clean里面的jar包*/
    public void test2() throws Exception {
        /*創建資料源*/
        /*注意一個問題保證mysql陳述句的正確、Mysql 8.0.19和以前版本連接陳述句略微不同*/
        /*實體化物件*/
        DruidDataSource dataSource = new DruidDataSource();
        
        /*物件呼叫方法——并set方法賦值*/
        /*賦值驅動類資料庫連接資訊*/
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");/*存在耦合*/
        dataSource.setUrl("jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC");/*存在耦合*/
        dataSource.setUsername("root");/*存在耦合*/
        dataSource.setPassword("2020");/*存在耦合*/
        
        /*創建物件獲取連接資訊*/
        DruidPooledConnection connection = dataSource.getConnection();
       
        /*列印物件資訊*/
        System.out.println(connection);
        
        /*連接關閉、歸還資源*/
        connection.close();
    }

5、手建C3P0(加載properties組態檔):注意空格、名稱正確

1.創建代碼:

    @Test
    /*測驗手動創建c3p0資料源(加載properties組態檔)*/
    public void test3() throws Exception {
    
        /*讀取組態檔*/
        ResourceBundle rb = ResourceBundle.getBundle("jdbc");
        String driver = rb.getString("jdbc.driver");
        String url = rb.getString("jdbc.url");
        String username = rb.getString("jdbc.username");
        String password = rb.getString("jdbc.password");

        /*創建資料源物件、設定連接引數*/
        /*康波坡爾*/
        /*注意一個問題保證mysql陳述句的正確、Mysql 8.0.19和以前版本連接陳述句略微不同*/
        /*實體化物件*/
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        /*物件呼叫方法——并set方法賦值*/
        /*賦值驅動類資料庫連接資訊*/
        /*注意值不能加雙引號*/
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);

        /*創建物件獲取連接資訊*/
        Connection connection = dataSource.getConnection();

        /*列印物件資訊*/
        System.out.println("\n地址:"+connection);

        /*連接關閉、歸還資源*/
        connection.close();

    }

2.組態檔jdbc.properties:注意陳述句正確、空格、名稱

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=2020

七、Spring配置資料源:DataSource——.set方法注入

將DataSource創建權——交給Spring容器完成
DataSource有無參構造方法——Spring默認通過無參構造方法實體化物件
使用DataSource獲取資料庫的連接物件——需通過set方法設定資料庫連接資訊——Spring可通過set方法進行字串注入

1、application組態檔:配置連接資訊——com.mchange.v2.c3p0.ComboPooledDataSource

1.注意一個問題:&會報錯——寫成&amp

    <bean id="dataSource" >
        <!--set方法注入引數-->
		<!--這里的名稱是java里面的首字母小寫-->
        <property name="driverClass" value="https://www.cnblogs.com/REMLI-2018/p/com.mysql.cj.jdbc.Driver"></property>
        <property name="jdbcUrl" value="https://www.cnblogs.com/REMLI-2018/p/jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC"></property>
        <property name="user" value="https://www.cnblogs.com/REMLI-2018/p/root"></property>
        <property name="password" value="https://www.cnblogs.com/REMLI-2018/p/2020"></property>
    </bean>

2、代替ComboPooledDataSource——>ClassPathXmlApplicationContext

    @Test
    /*測驗Spring容器產生資料源物件(加載application.xml組態檔)*/
    public void test4() throws Exception {
        /*讀取組態檔*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        /*創建資料源物件、設定連接引數*/
        /*實體化物件*/
        DataSource dataSource4 = app.getBean(DataSource.class);

        /*創建物件獲取連接資訊*/
        Connection connection4 = dataSource4.getConnection();

        /*列印物件資訊*/
        System.out.println("\n地址:"+connection4);

        /*連接關閉、歸還資源*/
        connection4.close();

    }

八、Spring單獨配置資料源:xml加載properties檔案——分開資料庫與Spring

properties的鍵值對寫法需要注意不要有鍵名相同!!!
各自的資料庫——加載——對應properties檔案

1、spring加載properties檔案步驟:

1.引入context命名空間和約束路徑:

applicationContext.xml加載jdbc.properties組態檔——獲得連接資訊
首先引入context命名空間和約束路徑:

1命名空間:xmlns:context="http://www.springframework.org/schema/context"

context命名空間中有組件掃描和加載外部.properties檔案的標簽
加載到IOC中的.properties檔案可以通過spring el運算式獲取,格式為:${鍵名}

<context:component-scan />:配置組件掃描,可以掃描指定包下的注解
<context:property-placeholder />:加載外部的.properties檔案到spring容器當中,
可以通過spel,即${}獲取到值,例如配置資料庫連接引數
       xmlns:context="http://www.springframework.org/schema/context"

2約束路徑:http://www.springframework.org/schema/context

約束路徑1:http://www.springframework.org/schema/context                      
約束路徑2:http://www.springframework.org/schema/context/spring-context.xsd

spring啟動時需驗證xml檔案,約束的作用就是來驗證組態檔的xml檔案語法的正確性,
		http://www.springframework.org/schema/context/spring-context.xsd

2.加載組態檔標簽:< context:property-placeholder location="xx.properties"/ >

<context:property-placeholder />:加載外部的.properties檔案到spring容器當中,
可以通過spel,即${}獲取到值,例如配置資料庫連接引數
    <!--加載外部properties組態檔-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

3.< property name="" value="https://www.cnblogs.com/REMLI-2018/p/${key}"/ >:spr語言——EL

獲取key值——獲取properties對應名稱值

    <bean id="dataSource" >
        <!--set方法注入引數-->
        <property name="driverClass" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.driver}"/>
        <property name="jdbcUrl" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.url}" />
        <property name="user" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.username}"/>
        <property name="password" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.password}"/>
    </bean>

4.DataSource.class

    <!--解耦合-->
    <!--這個地方可以更換資料源-->
    <!--加載外部properties組態檔-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" >
        <!--set方法注入引數-->
        <property name="driverClass" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.driver}"/>
        <property name="jdbcUrl" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.url}" />
        <property name="user" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.username}"/>
        <property name="password" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.password}"/>
    </bean>
    @Test
    /*測驗Spring容器產生資料源物件(加載application.xml組態檔)*/
    public void test4() throws Exception {
        /*讀取組態檔*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        /*創建資料源物件、設定連接引數*/
        /*實體化物件*/
        DataSource dataSource4 = app.getBean(DataSource.class);

        /*創建物件獲取連接資訊*/
        Connection connection4 = dataSource4.getConnection();

        /*列印物件資訊*/
        System.out.println("\n地址4:"+connection4);

        /*連接關閉、歸還資源*/
        connection4.close();

    }

5.DruidDataSource.class

    <!--解耦合-->
    <!--這個地方可以更換資料源-->
    <!--加載外部properties組態檔-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="druidDataSource" >
        <!--set方法注入引數-->
        <property name="driverClassName" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.driver}"/>
        <property name="url" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.url}" />
        <property name="username" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.username}"/>
        <property name="password" value="https://www.cnblogs.com/REMLI-2018/p/${jdbc.password}"/>
    </bean>
    @Test
    /*測驗Spring容器產生資料源物件(加載application.xml組態檔)*/
    public void test5() throws Exception {
        /*讀取組態檔*/
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        /*創建資料源物件、設定連接引數*/
        /*實體化物件*/
        DruidDataSource dr = app.getBean(DruidDataSource.class);

        /*創建物件獲取連接資訊*/
        Connection connection5 = dr.getConnection();

        /*列印物件資訊*/
        System.out.println("\n地址5:"+connection5);

        /*連接關閉、歸還資源*/
        connection5.close();

    }
2者不能同時開啟、會相互報錯

總結:命名空間修改方法,賦值xmlns后的url,將beans改為context,然后建立新的xmlns:context,
復制前一段xsi:schemaLocation將所有的beans都改為context添加在后面,
引入檔案路徑,classpath表示class檔案路徑,resource檔案默認保存在classpath檔案下,
所以路徑為"classpath:jdbc.properties",
在xml中呼叫properties檔案,使用EL運算式,

問題記錄:
	匯入properties后,Druid報錯:
		[create connection SQLException, 
		url:jdbc:mysql://localhost:3306/demo, errorCode 1045, state 28000]

錯誤原因:properties組態檔中的名字與Driud屬性名沖突,

修改前:
	driver=com.mysql.cj.jdbc.Driver
	url=jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC
	username=root
	password=2020

修改后:
	jdbc.driver=com.mysql.cj.jdbc.Driver
	jdbc.url=jdbc:mysql://localhost:3306/remli?useSSL=false&serverTimezone=UTC
	jdbc.username=root
	jdbc.password=2020

九、Spring注解開發

語意化:見名知意

1、 Spring原始注解

Spring原始配置主要替代<Bean>的配置

@Component——id——實體化——隨便那個——無語意

使用在類上用于實體化Bean
該組件用于Spring生成一個bean——>Component:組件
Component:組件 ByID
@Component("userDao")/*相當于組態檔id、定位類*/
@Component("userService")/*相當于組態檔id、定位類*/

@Controller——Web層控制類實體化——語意化

使用在web層類上用于實體化Bean
該控制器用于Spring生成一個bean

@Service——Service層服務類實體化——語意化

使用在service層類上用于實體化Bean
該業務邏輯類用于Spring生成一個bean
@Service("userService")/*相當于組態檔id、定位類*/

@Repository——id——Dao層資料存盤類實體化——語意化

使用在dao層類上用于實體化Bean
該Dao類用于Spring生成一個bean——>repository:貯藏室 資料封裝基地
Repository:貯藏室 ByID
@Repository("userDao")/*相當于組態檔id、定位類*/
@Controller
@Service
@Repository
@Component
4者無本質區別
他們存在是為區分開web、service、dao層
方便代碼閱讀,

@Autowired——無需Setter——欄位按型別注入——可單獨使用

型別
使用在欄位上用于根據型別依賴注入
作用:自動封裝該屬性、或者欄位
可不用Setter方法接收

單個類:獨自使用
    @Autowired
    //單個使用——按照資料型別從Spring容器中匹配進行注入、注意單個資料類可以、多個就識別確定不了
結合@Qualifier使用:
    @Autowired
    	//單個使用——按照資料型別從Spring容器中匹配進行注入、
    	//注意單個資料類可以、多個就識別確定不了
    @Qualifier("userDao")
		//按照id從容器中進行匹配
		//但是此處需要結合@Autowired一起使用

@Qualifier——name/id——@Autowired+按名稱注入——必須配合使用

id+name
結合@Autowired一起使用用于根據名稱進行依賴注入
根據提供的修飾語 @Qualifier('xxx')——>匹配該xxx屬性,
使用該注解,必須配合AutoWire一起使用,
Qualifier:修飾語 ByName
	@Autowire 
	@Qualifier("user") 
	意義:封裝user注解的bean為本類物件的成員,根據名稱注入 ByName,設定在欄位上. 

	@Qualifier常用在引數賦值上
	如: String getUsername(@Qualifier("user")User user){}


結合@Qualifier使用:
    @Autowired
    	//單個使用——按照資料型別從Spring容器中匹配進行注入、
    	//注意單個資料類可以、多個就識別確定不了
    @Qualifier("userDao")
	    //按照id從容器中進行匹配
   		//但是此處需要結合@Autowired一起使用
    @Autowired
    @Qualifier("userDao")

@Resource——按名稱注入=@Autowired+@Qualifier——J2EE提供

相當于@Autowired+@Qualifier, 按照名稱進行注入
Resource是Aotuwire注解和Qualifier注解的結合體.@Resource("user"),標注為user的bean

@Resource("user") 封裝user注解的bean為奔雷物件的成員 	== 
	@Autowire 
	@Qualifier
	
默認根據名稱依賴注入,

默認Resource() = Resource like Resource(name = "XXX")——>體現面向物件思想
應該設定在欄位上

可以手動設定為根據型別注入Resource(type = User.class)——>體現面向物件思想
應該設定在set方法上
    @Resource(name="userDao")
    	//相當于 @Autowired+@Qualifier("userDao")

@Value——注入普通屬性

注入普通屬性
@Value("xxx");為修飾欄位賦值;
	通常配合SpEL(Spring Expression Language)使用

@Value("${jdbc.url}") private String url; 為url賦值
	——> (Spring中引入的properties后綴檔案中的jdbc.url對應的值) 
	——>或者{PropertySrouce注解中的jdbc.url值}
    @Value("value注入成功")//屬性值注入
    private String vals;


    @Value("${jdbc.driver}")//資料庫屬性值注入
    private String sjk;

@Scope——Bean作用范圍

標注Bean的作用范圍
常用 : 	@Scope("singleton") 宣告從spring容器獲得的該類的bean
				有且只有一個(單例模式)
				
		@Scope("prototype") 宣告從spring容器獲得的該類的bean
				有多個(標準Bean模式)
@Scope("prototype")//多例
//@Scope("singleton")//單例

@PostConstruct——Bean初始化方法——構造后

使用在方法上標注該方法是Bean的初始化方法
注解使用在用戶定義的初始化方法前,
宣告該方法是該類的初始化方法
@PostConstruct :意為執行在構造方法后,構造方法創建物件,物件呼叫該初始化方法
    @PostConstruct
    public void init(){
        System.out.println("Service物件初始化方法");
    }

@PreDestroy——Bean銷毀方法——銷毀前

使用在方法上標注該方法是Bean的銷毀方法
注解使用在用戶自定義的結束方法前,
宣告該方法是該類的結束方法,
當前物件被銷毀前呼叫該方法
@PreDestroy ;Spring容器被銷毀的時候,執行.
   @PreDestroy
    public void destory(){
        System.out.println("Service物件銷毀方法");
//        /*讀取組態檔*/
//        /*子類實作銷毀方法——手動關閉*/
//        ClassPathXmlApplicationContext apps = new ClassPathXmlApplicationContext("applicationContext.xml");
//
//        /*創建資料源物件、設定連接引數*/
//        /*實體化物件*/
//        XXX drs = app.getBean(XXX.class);
//
//        /*手動關閉*/
//        drs.close();
    }

@Order——注入物件參考集合

注入物件參考的集合的時候使用:
@Order(1) 
@Order(2) 表示該類生成的bean將會存盤在某個List<該型別>中,并按照順序插入List

如果是Map<String,T> 那么order的順序沒有任何關系,
但是該Map必須定義為<String,T> String接收對應物件的id值(id唯一 ——> key唯一);

此處的List和Map可以通過@Autowired或@Resource注入;

2、組件掃描:component-scan

注意:注解開發時需在applicationContext.xml中配置組件掃描
作用::指定哪一個包及其包下的Bean需要掃描以便識別使用注解配置的類和方法
包:基礎包+包括里面的子包
    <!--注解開發——需要配置組件掃描-->
    <!--組件掃描——掃描指定檔案夾下的包-->
    <context:component-scan base-package="com.remli"/>

3、2種配置/注解方式對比:

1.原始xml配置方式

    <!--xml配置-->
    <bean id="userDao" ></bean>
	
    <bean id="userService" >
        <property name="userDao" ref="userDao"></property>
     </bean>
public interface UserDao {
    public void start();
}
public class UserDaoImpl implements UserDao {
    public void start(){
        System.out.println("啟動程式1·····");
    }
}
public interface UserService {
    public void start();
}
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    /*Setter方法*/
    public void setUserDao(UserDao userDao){
        this.userDao=userDao;
    }
    
    public void start(){
        System.out.println("程式啟動2·····");
    }
}
public class UserController {

    public static void main(String[] args) {

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService userService = app.getBean(UserService.class);

        userService.start();
    }

}

2.注解@方式!!!

    <!--注解開發——需要配置組件掃描-->
    <!--組件掃描——掃描指定檔案夾下的包-->
    <context:component-scan base-package="com.remli"/>

public interface UserDao {
    public void start();
}
/*xml配置定位類檔案位置*/
/*
<bean id="userDao" ></bean>
*/

/*注解*/
/*
@component
*/

@Component("userDao")/*相當于組態檔id、定位類*/
public class UserDaoImpl implements UserDao {
    public void start(){
        System.out.println("啟動程式1·····");
    }
}
public interface UserService {
    public void start();
}
/*xml配置定位類檔案位置*/
/*
<bean id="userService" ></bean>
*/


/*注解*/
/*
@component
*/

@Component("userService")/*相當于組態檔id、定位類*/
public class UserServiceImpl implements UserService {

    /*xml配置注入屬性*/
    /*
    <property name="userDao" ref="userDao"></property>
    */

    /*注解——注入*/
    /*
    @Autowired
    @Qualifier("userDao")
    */

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    /*Setter方法*/
    public void setUserDao(UserDao userDao){
        this.userDao=userDao;
    }

    public void start(){
        System.out.println("程式啟動2·····");
    }
}
public class UserController {

    public static void main(String[] args) {

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService userService = app.getBean(UserService.class);

        userService.start();
    }

}

2、Spring新注解

@Configuration——指定類為Spring配置類

用于指定當前類是一個Spring配置類,當創建容器時會從該類上加載注解

@ComponentScan——指定Spring初始化容器掃描包

用于指定Spring在初始化容器時要掃描的包
作用和在Spring的xml組態檔中的

<context:component-scan base-package=”com.code_g”/>一樣

ComponentScan:組件掃描 ByPackage ComponentScan:在使用全注解的時候,非常重要.如果未配置,那么Spring的IoC容器默認不會掃描任何包,就不會有任何Bean.

@Bean——方法回傳值存盤到Spring容器中

使用在方法上,標注將該方法的回傳值存盤到Spring容器中

@PropertySource——加載properties檔案配置

用于加載.properties檔案中的配置

@Import——匯入其他類配置

用于匯入其他配置類

3、Spring物件創建——實體化——找到類創建物件——所在位置

@Component——隨便

定義Bean, 不好歸類時使用

@Controller——web視圖控制層

@Controller("Bean的名稱")
定義控制層Bean,如Action

@Service——Service業務服務層

@Service("Bean的名稱")
定義業務層Bean

@Repository——Dao資料持久化層

@Repository("Bean的名稱")
定義DAO層Bean

4、Spring注入

1.物件注入:依據、bean(id)=name、類、屬性注入

@Resource:默認按名稱byName注入——(J2EE提供注解)——需添加其依賴

Spring將@Resource注解的name屬性決議為bean的名字,而type屬性則決議為bean的型別,
默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來注入,
它有兩個屬性是比較重要的:
如果想減少對 Spring 的依賴建議使用 @Resource 方法,
	<!--Resource注解依賴-->
    <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!-- Javax Annotation -->
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>jsr250-api</artifactId>
        <version>1.0</version>
    </dependency>
1name: Spring 將 name 的屬性值決議為 bean 的名稱, 使用 byName 的自動注入策略
2type: Spring 將 type的屬性值決議為 bean 的型別,使用 byType 的自動注入策略
3反射—— byName 自動注入策略
如果既不指定 name 屬性又不指定 type 屬性,Spring這時通過反射機制使用 byName 自動注入策略


@Resource 裝配順序:
	如果同時指定了 name 屬性和 type 屬性,那么 Spring 將從容器中找唯一匹配的 bean 進行裝配,找不到則拋出例外
	如果指定了 name 屬性值,則從容器中查找名稱匹配的 bean 進行裝配,找不到則拋出例外
	如果指定了 type 屬性值,則從容器中查找型別匹配的唯一的 bean 進行裝配,找不到或者找到多個都會拋出例外
	如果都不指定,則會自動按照 byName 方式進行裝配, 如果沒有匹配,則回退一個原始型別進行匹配,如果匹配則自動裝配

@Autowried:默認按型別byType注入

默認是按照型別進行裝配注入,
默認情況下,它要求依賴物件必須存在,如果允許 null 值,可以設定它 required 為false,
如果我們想要按名稱進行裝配的話,可以添加一個 @Qualifier 注解解決,

@Autowired 介面只能有一個實作類,通過byType方式注入
默認情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false)
	@Autowried
	@Qualifier("adminDAO")
	private AdminDAO adminDAO;

@Qualifier:默認類名

spring的注解,按名字注入 一般當出現兩個及以上bean時,不知道要注入哪個,作為@Autowired()的修飾用
@Qualifier 介面可以有多個實作類,可以按實作類的類名進行注入

2.普通屬性注入:——Value

通常不直接賦值,而是呼叫引入的properties檔案賦值,
只要核心類或者引入的子類引入了properties檔案就可以直接用EL運算式,
引入格式為EL運算式

使用@Value將外部值動態的注入到Bean中,使用情況:
	注入普通字串
	注入作業系統屬性
	注入運算式結果
	注入其他Bean屬性:注入beanInject物件的屬性another
	注入檔案資源
	注入URL資源
	@Value("${jdbc.username}")
	private String name;
@Value("normal")
    private String normal; // 注入普通字串

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName; // 注入作業系統屬性

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入運算式結果

    @Value("#{beanInject.another}")
    private String fromAnotherBean; // 注入其他Bean屬性:注入beanInject物件的屬性another,類具體定義見下面

    @Value("classpath:com/hry/spring/configinject/config.txt")
    private Resource resourceFile; // 注入檔案資源

    @Value("http://www.baidu.com")
    private Resource testUrl; // 注入URL資源

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

標籤:Java

上一篇:Swagger3 相比2配置變了

下一篇:面試官:如何防止 Java 原始碼被反編譯?我竟然答不上來。。

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