目錄
- 一、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、spring配置主要全部檔案
- 三、引入其他組態檔(分模塊開發)
- 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 >標簽:指定建構式的引數注入
- 1、< property >標簽:屬性注入、setter()
- 五、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:注意陳述句正確、空格、名稱
- 1 、資料源(連接池)的作用
- 七、Spring配置資料源:DataSource——.set方法注入
- 1、application組態檔:配置連接資訊——com.mchange.v2.c3p0.ComboPooledDataSource
- 1.注意一個問題:&會報錯——寫成&
- 2、代替ComboPooledDataSource——>ClassPathXmlApplicationContext
- 1、application組態檔:配置連接資訊——com.mchange.v2.c3p0.ComboPooledDataSource
- 八、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
- 1.引入context命名空間和約束路徑:
- 1、spring加載properties檔案步驟:
- 九、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:默認類名
- @Resource:默認按名稱byName注入——(J2EE提供注解)——需添加其依賴
- 2.普通屬性注入:——Value
- 1.物件注入:依據、bean(id)=name、類、屬性注入
- 1、 Spring原始注解
一、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.名詞解釋
-
類(人類):共同特征的物體的集合、模板、一類事物、抽象、概念、同種屬性
-
實體:一個真實的物件
-
物件(個人):組成類的元素、類的具體實作、實際執行者
-
屬性:資料(變數/值)
-
定義:編譯器創建物件、分配記憶體、取名(變數名/物件名)
-
宣告:宣告物件(物件名/物件型別)、告知編譯器物件/屬性的情況
-
實體化:類創建物件的程序
-
初始化:為變數分配記憶體空間、并確定其初始值的程序
-
構造方法:與類同名的特殊方法、創建物件
-
構造器:與類同名的特殊方法、創建物件
2.Bean生命周期:1實體化、2屬性賦值、3初始化、4使用、5銷毀
-
實體化前階段:執行Instantiation Aware Bean PostProcessor Adapter的post Process Before ln station方法
-
執行Instantiation Aware Bean PostProcessor Adapter的determine Candidate Constructors方法
-
介面Merged Bean Definition PostProcessor的post Process Merged Bean Definition方法
-
實體化Bean(執行Bean構造方法)
-
實體化后階段:執行Instantiation Aware Bean PostProcessor Adapter的post Process After In station方法,方法回傳false的時候, 后續的Bean屬性賦值前處理、Bean屬性賦值都會被跳過了,
-
屬性賦值前階段(可在此修改屬性的值):執行Instantiation Aware Bean PostProcessor的post Process Properties方法,回傳空的時候, 表示這個bean不需要設定屬性, 直接回傳了, 直接進入下一個階段,
-
屬性賦值(Populate)
-
Aware介面
-
執行Instantiation Aware Bean PostProcessor Adapte的post Process Before ln it i alization方法
-
自定義初始化方法
-
執行Instantiation Aware Bean PostProcessor Adapte的post Process After ln it i alization方法
-
容器創建成功,提供使用
-
呼叫自定義銷毀方法方法
3.Bean 標簽屬性
-
id 屬性:唯一性、不可重復
屬性值任意命名,但不可以包含中文以及特殊字符,
根據 id 屬性值得到配置物件, -
class 屬性:類的全路徑名稱
創建物件所在類的全路徑名稱, -
name 屬性:不可重復
功能和 id 一致,已基本不用,
區別: id 屬性值不可以包含特殊字符, name 屬性值可以包含, -
scope 屬性
bean 作用范圍屬性值:
| 取值范圍 | |
|---|---|
| singleton 單例 | 默認值、只生成1個實體 |
| prototype 多例 | 多例的 |
| request | WEB專案中, Spring創建一個Bean的物件, 將物件存入到request域中 |
| session | WEB專案中, Spring創建一個Bean的物件, 將物件存入到session域中 |
| global session | WEB專案中, 應用在Portlet環境, 如果沒有Portlet環境那么global Session相當于session |
-
作用域: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核心:
-
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.注意一個問題:&會報錯——寫成&
<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配置變了
