文章目錄
一、Maven
1、什麼是maven
管理項目的構建,報告和文檔的項目管理工具軟件。將程序中要使用的jar包存在放在maven倉庫中,只需要在pom.xml文檔中進行配置,就可以聯網獲得對應的jar包,而且會將所導入的jar包的所有依賴的jar包一起導入進去。
可以簡單的理解爲就是一個管理項目,管理依賴的工具
2、Maven核心功能
- 依賴管理
- 模塊管理
- 插件管理
- 部署管理
3、Maven生命週期
maven將工程的構建過程理解爲不同的生命週期和階段, 一個工程的構建過程中,存在着不同的生命週期,生命週期間互相獨立,沒有一定的順序關係。 每個生命週期又劃分爲不同的階段,不同的階段之間有明確的順序關係, 同一生命週期內的階段必須按順序依次執行。
-
clear(清除)
- pre-clean:執行清理的準備工作
- clean:執行清理工作
- post-clean:執行清理後的後續工作
-
default(核心)
- validate:驗證項目的正確性及項目所必需的信息是否可用
- compile:編譯項目中代碼
- test:用相關的單元測試框架測試編譯後的代碼,測試代碼並不會隨項目打包和佈署
- package:將編譯後的代碼打包成相應的格式文件,如jar包
- integration-test: 如果需要在一個綜合環境中運行我們的測試,這個階段將會運行和佈署項目到該環境中
- verify: 檢查項目中的包是否正確與符合要求
- install:將包安裝到本地maven倉庫,其他項目也可以使用該包作爲依賴
- deploy:將包發佈到遠程的maven倉庫,並提供給其他開發者使用
-
site(建立發佈項目站點)
- pre-site:準備生成
- site:生成項目站點和文檔
- post-site:執行生成文檔後的後續工作
- site-deploy:發佈項目文檔
二、Spring
1、Spring的Maven倉庫核心依賴
springcore4.3.18
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
springcontext
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
2、Java中創建對象的方法
-
new關鍵字
-
克隆,重寫clone()方法
實體類實現Cloneable接口,重寫clone()方法,調用clone()方法,克隆得到的對象與原來的對象不是一個對象
-
反射
得到Students類的Class對象,根據Class對象得到構造器,再根據構造器得到對象
-
對象反序列化
實體類實現Serializable接口,先序列化將對象寫入文件中,再反序列化從文件中得到對象,記得關閉流
Students類
//Students類
package org.westos.domain;
import java.io.Serializable;
public class Students implements Cloneable, Serializable {
private String sid;
private String sname;
private String gender;
private String birthday;
private String major;
//實現Cloneable接口,重寫父類的clone()方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Students{" +
"sid='" + sid + '\'' +
", sname='" + sname + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
", major='" + major + '\'' +
'}';
}
public Students() {
}
public Students(String sid, String sname, String gender, String birthday, String major) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
測試類
package org.westos.test;
import org.westos.domain.Students;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException, InvocationTargetException {
//1.使用new關鍵字創建對象
Students s1 = new Students("001", "張三", "男", "1993-02-03", "古文");
System.out.println("s1:" + s1);
//2.使用clone()方法創建對象
Students s2 = (Students) s1.clone();
System.out.println("s2:" + s2);
System.out.println(s1 == s2);//s1與s2不相等
//3.使用反射得到對象
Class aClass = Class.forName("org.westos.domain.Students");//使用類名得到類的Class對象
//使用構造器的參數得到構造器
Constructor constructor = aClass.getConstructor(String.class, String.class, String.class, String.class, String.class);
//使用構造器得到對象
Students s3 = (Students) constructor.newInstance(new Object[]{"002", "李四", "男", "1994-02-04", "高數"});
System.out.println("s3:" + s3);
//4.使用反序列化得到對象
//得到對象輸出流
File file = new File("studentLists.text");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
//將對象序列化寫到文件studentLists.txt中
out.writeObject(s2);
//得到對象輸入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
//反序列化讀取對象
Students s4 = (Students) in.readObject();
System.out.println("s4:" + s4);
//關閉流資源
in.close();
out.close();
}
}
3、使用spring創建對象
-
spring也不適用new關鍵字創建對象,使用Ioc容器注入
-
先在xml配置文檔裏配置好對象的屬性與id值,得到與配置文檔的連接,根據配置文檔裏id屬性的值,得到對象(內部也是通過反射+xml文檔的解析實現的)
-
對象的創建是通過默認無參構造創建的,而屬性的初始化時使用set方法初始化的,所以一定要保留默認的無參構造和set方法
測試類
public class IocDemo2 { public static void main(String[] args) { //使用Spring的ioc拿到對象 //得到context對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //得到Students對象 Students s1 = (Students) context.getBean("s1"); System.out.println(s1); } }
applicationContext.xml文檔
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--定義學生對象--> <bean id="s1" class="org.westos.domain.Students"> <property name="sid" value="200"/> <property name="sname" value="張三丰"/> <property name="gender" value="男"/> <property name="birthday" value="1998-10-10"/> <property name="major" value="太極拳"/> </bean> </beans>
4、spring創建對象順序
- 加載applicationContext.xml文檔
- 解析對應的id的對象
- 通過反射區調用默認無參構造
- 使用set方法初始化屬性
5、spring的兩大核心技術
-
IOC(DI),控制反轉/依賴注入
如何理解依賴注入
-
創建對象,不適用new關鍵字
-
面向接口的編程,UsbInterface接口、Computer類、IocDemo3類
不修改代碼,使用多態的形式,用IOC在配置文檔中讀取對象,修改配置文檔
什麼是IOC容器:xml文檔中的beans標籤就是一個IOC容器
爲什麼不推薦使用new創建對象
- 麻煩,可以直接在配置文檔裏面配置好,然後用的時候直接根據id屬性獲取對象就行了
-
-
AOP,面向切面的編程
- 可以簡單的理解爲在不改變原有程序的基礎上爲代碼增加新的功能
2. 分爲前置增強、後置增強、最終增強、異常增強、環繞增強
3. 需要在原有的類上定義一個切口(方法),然後定義一個用於增強的AOP類,可以在類中定義增強的方法。最後在xml配置文檔中進行配置
- 可以簡單的理解爲在不改變原有程序的基礎上爲代碼增加新的功能