目錄
一、第一個(gè) Spring 項(xiàng)目
1、配置環(huán)境
2、Spring 的 jar 包
Maven 項(xiàng)目導(dǎo)入 jar 包和設(shè)置國(guó)內(nèi)源的方法:
3、Spring 的配置文件
4、Spring 的核心 API
ApplicationContext
4、程序開(kāi)發(fā)
5、細(xì)節(jié)分析
(1)名詞解釋
(2)Spring 工廠的相關(guān)方法
(3)配置文件中的細(xì)節(jié)
1、只配置 class 屬性
2、name 屬性
6、Spring 工廠的底層實(shí)現(xiàn)原理(簡(jiǎn)易版)?
7、思考
二、Spring 與 日志框架的整合
1、Spring 如何整合日志框架?
一、第一個(gè) Spring 項(xiàng)目
1、配置環(huán)境
2、Spring 的 jar 包
在項(xiàng)目的 porm.xml 中添加 Spring 框架的支持,xml 配置如下:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
復(fù)制的時(shí)候注意觀察當(dāng)前的 pom.xml 中是否已經(jīng)有 dependices
如果 jar 包下載過(guò)慢或者下載失敗,我們可以設(shè)置國(guó)內(nèi)源來(lái)解決?
Maven 項(xiàng)目導(dǎo)入 jar 包和設(shè)置國(guó)內(nèi)源的方法:
1、打開(kāi)自己的 idea 檢測(cè) maven 的配置是否正確
這兩個(gè)地方都要進(jìn)行配置!??!
然后設(shè)置 settings 文件:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
如果電腦中沒(méi)有 settings 文件,就自己創(chuàng)建一個(gè),如果有,就直接在原來(lái)的 settings 文件上更改就行
2、如果繼續(xù)出錯(cuò),就刪除本地 maven 倉(cāng)庫(kù)的 jar 包重新下載
3、當(dāng)前網(wǎng)絡(luò)運(yùn)營(yíng)商有問(wèn)題,就嘗試更換鏈接的數(shù)據(jù)源,使用更好的網(wǎng)絡(luò),如果還是不行,就間隔一段時(shí)間之后再去嘗試
3、Spring 的配置文件
1、配置文件的放置位置:任意位置,沒(méi)有硬性要求
2、配置文件的命名:沒(méi)有硬性要求,建議叫? applicationContext.xml
接下來(lái),我們思考一個(gè)問(wèn)題:
Spring 框架如何知道開(kāi)發(fā)人員未來(lái)會(huì)把配置文件放在哪里,叫什么名字呢?
所以,日后應(yīng)用 Spring 框架時(shí),需要進(jìn)行配置文件路徑的設(shè)置
按照?qǐng)D中步驟,在 resourses 下創(chuàng)建好一個(gè)文件,并按照建議給它命名為?applicationContext.xml
此時(shí)我們就會(huì)發(fā)現(xiàn),整個(gè) Spring 的配置文件就幫我們建好了,
4、Spring 的核心 API
ApplicationContext
作用:Spring 提供的 ApplicationContext 這個(gè)工廠,主要的作用就是用于對(duì)象的創(chuàng)建
好處:解耦合
ApplicationContext 是一個(gè)接口類型
接口的主要目的:屏蔽實(shí)現(xiàn)的差異(工廠可能會(huì)應(yīng)用到不同的開(kāi)發(fā)場(chǎng)景下,不同的開(kāi)發(fā)場(chǎng)景有不同的特點(diǎn))
Spring 主要提供兩種類型的工廠:
1、非 web 環(huán)境:ClassPathXmlApplicationContext(main,junit)
2、web 環(huán)境:XmlWebApplicationContext
我們稱?ApplicationContext 是一個(gè)重量級(jí)資源
那么什么是一個(gè)重量級(jí)資源?
如果一個(gè)對(duì)象對(duì)內(nèi)存占用的比較多,那么我們就稱之為重量級(jí)資源
這也就意味著,ApplicationContext 這個(gè)工廠的對(duì)象,會(huì)占用大量的內(nèi)存
正因?yàn)樗膬?nèi)存占用比較多,所以我們不會(huì)頻繁的創(chuàng)建對(duì)象:一個(gè)應(yīng)用只會(huì)創(chuàng)建一個(gè)工廠對(duì)象
也正是因?yàn)樗羞@樣的特點(diǎn),所以這個(gè)對(duì)象就有可能會(huì)出現(xiàn)并發(fā)訪問(wèn)(多線程訪問(wèn))的情況
所以,ApplicationContext 工廠,一定是線程安全的(多線程并發(fā)訪問(wèn))
4、程序開(kāi)發(fā)
Spring 提供的工廠和我們自己寫(xiě)的工廠,本質(zhì)上是沒(méi)有差異的,都是解耦合的
那么,對(duì)于 Spring 來(lái)講,它的工廠使用,和我們前面所總結(jié)的通用工廠的使用方式,本質(zhì)上是沒(méi)有區(qū)別的
1、創(chuàng)建類型
2、配置文件的配置 applicationContext.xml
3、通過(guò)工廠類,獲得對(duì)象 ApplicationContext
1、創(chuàng)建類型
2、配置文件的配置
我們要在 beans 下面創(chuàng)建一個(gè)子標(biāo)簽,里面有兩個(gè)屬性:id 和 class
id 屬性:就是起個(gè)名字,命名(唯一的)
class 屬性:配置所需要?jiǎng)?chuàng)建的文件的全限定名
雖然組織形式不同,但是所需要的要素是完全一樣的
通過(guò)這步,我們也告訴了 Spring ,需要生產(chǎn) Person 對(duì)象
3、通過(guò)工廠類,獲得對(duì)應(yīng)的對(duì)象
//用于測(cè)試 Spring 的第一個(gè)程序
public static void test() {
//1、獲得 Spring 工廠
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
//2、通過(guò)工廠類來(lái)獲得對(duì)象
Person person = (Person) ctx.getBean("person");
System.out.println("person = " + person);
}
此時(shí),我們會(huì)發(fā)現(xiàn),這個(gè)對(duì)象的引用打印出來(lái)了
說(shuō)明這個(gè)對(duì)象由 Spring 的工廠創(chuàng)建完成了
5、細(xì)節(jié)分析
(1)名詞解釋
Spring 工廠創(chuàng)建的對(duì)象,叫做 bean 或者 組件(componet)
(2)Spring 工廠的相關(guān)方法
//通過(guò)這種?式獲得對(duì)象,就不需要強(qiáng)制類型轉(zhuǎn)換
Person person = ctx.getBean("person", Person.class);
System.out.println("person = " + person);
//當(dāng)前Spring的配置?件中 只能有?個(gè)<bean class是Person類型
Person person = ctx.getBean(Person.class);
System.out.println("person = " + person);
//獲取的是 Spring??配置?件中所有bean標(biāo)簽的id值
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println("beanDefinitionName = " +
beanDefinitionName);
}
//根據(jù)類型獲得Spring配置?件中對(duì)應(yīng)的id值
String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);
for (String id : beanNamesForType) {
System.out.println("id = " + id);
}
//?于判斷是否存在指定id值得bean
if (ctx.containsBeanDefinition("a")) {
System.out.println("true = " + true);
}else{
System.out.println("false = " + false);
}
//?于判斷是否存在指定id值得bean
if (ctx.containsBean("person")) {
System.out.println("true = " + true);
}else{
System.out.println("false = " + false);
}
(3)配置文件中的細(xì)節(jié)
1、只配置 class 屬性
<bean class="Person"/>
上述這種配置,有沒(méi)有 id 值呢?
我們可以借助上面的 ctx.getBeanDefinitionNames(); 來(lái)進(jìn)行觀察
我們發(fā)現(xiàn),spring 會(huì)自動(dòng)生成一個(gè) id 的默認(rèn)值,所以我們沒(méi)有給它設(shè)定 id ,但是實(shí)際上還是存在一個(gè) id 與之對(duì)應(yīng)的
應(yīng)用場(chǎng)景:如果這個(gè) bean 只需要使用一次,那么就可以省略 id 值,反之,如果這個(gè) bean 會(huì)使用多次或者被其它 bean 引用,則需要設(shè)置 id 值
2、name 屬性
用于在 Spring 的配置文件中,為 bean 對(duì)象定義別名(小名)
<bean id="person1" name="p" class="Person" ></bean>
id 與 name 相同點(diǎn):
1、ctx.getBean(" id | name ") ; 都可以獲取到對(duì)象
2、 < bean id = " " class = " " > 和?< bean name?= " " class = " " >二者是等效的
id 和 name 的區(qū)別:
1、別名可以定義多個(gè),但是 id 只能是一個(gè)
2、XML 的 id 屬性的值,命名的時(shí)候要求:必須要以字母開(kāi)頭,字母,數(shù)字,下劃線,連字符,不能以特殊字符開(kāi)頭,比如 / ,而 name 屬性的值,在命名的時(shí)候,是沒(méi)有要求的,所以 name 屬性會(huì)應(yīng)用在特殊命名的場(chǎng)景下,但是 xml 發(fā)展到了今天,id 的屬性的限制,已經(jīng)不存在了
3、代碼的區(qū)別
//?于判斷是否存在指定id值得bean,不能判斷name值
if (ctx.containsBeanDefinition("person")) {
System.out.println("true = " + true);
}else{
System.out.println("false = " + false);
}
//?于判斷是否存在指定id值得bean,也可以判斷name值
if (ctx.containsBean("p")) {
System.out.println("true = " + true);
}else{
System.out.println("false = " + false);
}
6、Spring 工廠的底層實(shí)現(xiàn)原理(簡(jiǎn)易版)?
反射的底層是否會(huì)調(diào)用構(gòu)造方法呢?
雖然反射創(chuàng)建了對(duì)象,但是底層也一定會(huì)調(diào)用這個(gè)對(duì)象的構(gòu)造方法(無(wú)參),所以我們也可以認(rèn)為反射創(chuàng)建對(duì)象就等效于我們的 new 創(chuàng)建對(duì)象
如果這個(gè)構(gòu)造方法是私有的怎么辦呢?
private 修飾的只能在本類調(diào)用,而顯然 String 是外類
通過(guò)代碼實(shí)驗(yàn),我們能發(fā)現(xiàn),即使構(gòu)造方法被設(shè)為了私有的,private 的構(gòu)造方法依舊會(huì)被調(diào)用
底層還是通過(guò)反射來(lái)實(shí)現(xiàn)的,因?yàn)榉瓷淠軌蛘{(diào)用一個(gè)類的私有的屬性和構(gòu)造方法,所以 Spring 工廠是可以調(diào)用對(duì)象私有的構(gòu)造方法來(lái)創(chuàng)建對(duì)象的
7、思考
未來(lái)在開(kāi)發(fā)過(guò)程中,是不是所有的對(duì)象都會(huì)被交給 Spring 工廠來(lái)創(chuàng)建呢?
理論上來(lái)說(shuō),是的,但是有特例:實(shí)體對(duì)象(entity)
實(shí)體對(duì)象是不會(huì)交給 Spring 創(chuàng)建的,是由持久層框架來(lái)進(jìn)行創(chuàng)建的。
二、Spring 與 日志框架的整合
Spring 與日志框架整合,日志框架就可以在控制臺(tái)中輸出 Spring 框架運(yùn)行過(guò)程中的一些重要的信息
好處:便于我們了解 Spring 框架的運(yùn)行過(guò)程,利于程序的調(diào)試
1、Spring 如何整合日志框架?
Spring 的不同版本,針對(duì)于日志框架的整合,以及整合的內(nèi)容和方式,是有一些區(qū)別的
比如:Spring 1.2.3早期的日志框架,都是與 common-logging.jar 這個(gè)日志進(jìn)行整合的
? ? ? ? ? ?Spring 5.x 默認(rèn)整合的日志框架是 logback 或者 log4j2
根據(jù)我們的開(kāi)發(fā)需要,我們想讓?Spring 5.x 整合 log4j,那么整合 log4j 怎么整合呢?
1、引入 log4j 的 jar 包
2、引入 log4j.properties 配置文件
以 jar 包的方式,我們肯定要通過(guò) maven 來(lái)完成,所以我們要設(shè)置我們的 pom 文件,那么在 pom 文件中我們要添加對(duì)應(yīng)的依賴
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
第二個(gè)配置就是引入 log4j.properties 的配置文件
# resources # resources?件夾根?錄下
### ### 配置根
log4j.rootLogger = debug,console
### ### ?志輸出到控制臺(tái)顯示
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
整合完畢之后再次運(yùn)行代碼,就能發(fā)現(xiàn)區(qū)別了:
我們會(huì)發(fā)現(xiàn),當(dāng)我們整合日志之后,我們從控制臺(tái)中看到的內(nèi)容就不僅僅基于我們打印的,還基于我們 spring 內(nèi)部運(yùn)行的文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-709000.html
這樣的話,在日后解決復(fù)雜性問(wèn)題的時(shí)候,我們就可以通過(guò)日志,大概可以猜測(cè)到 Spring 幫我們做了什么,就更加利于我們后續(xù)程序的調(diào)試文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-709000.html
到了這里,關(guān)于Spring 的創(chuàng)建和日志框架的整合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!