Maven生命週期、Spring核心技術IOC與AOP、Java中創建對象的5種方式(含使用Spring)

一、Maven

1、什麼是maven

管理項目的構建,報告和文檔的項目管理工具軟件。將程序中要使用的jar包存在放在maven倉庫中,只需要在pom.xml文檔中進行配置,就可以聯網獲得對應的jar包,而且會將所導入的jar包的所有依賴的jar包一起導入進去。

可以簡單的理解爲就是一個管理項目,管理依賴的工具

2、Maven核心功能

  1. 依賴管理
  2. 模塊管理
  3. 插件管理
  4. 部署管理

3、Maven生命週期

maven將工程的構建過程理解爲不同的生命週期和階段, 一個工程的構建過程中,存在着不同的生命週期,生命週期間互相獨立,沒有一定的順序關係。 每個生命週期又劃分爲不同的階段,不同的階段之間有明確的順序關係, 同一生命週期內的階段必須按順序依次執行。

  1. clear(清除)

    1. pre-clean:執行清理的準備工作
    2. clean:執行清理工作
    3. post-clean:執行清理後的後續工作
  2. default(核心)

    1. validate:驗證項目的正確性及項目所必需的信息是否可用
    2. compile:編譯項目中代碼
    3. test:用相關的單元測試框架測試編譯後的代碼,測試代碼並不會隨項目打包和佈署
    4. package:將編譯後的代碼打包成相應的格式文件,如jar包
    5. integration-test: 如果需要在一個綜合環境中運行我們的測試,這個階段將會運行和佈署項目到該環境中
    6. verify: 檢查項目中的包是否正確與符合要求
    7. install:將包安裝到本地maven倉庫,其他項目也可以使用該包作爲依賴
    8. deploy:將包發佈到遠程的maven倉庫,並提供給其他開發者使用
  3. site(建立發佈項目站點)

    1. pre-site:準備生成
    2. site:生成項目站點和文檔
    3. post-site:執行生成文檔後的後續工作
    4. 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中創建對象的方法

  1. new關鍵字

  2. 克隆,重寫clone()方法

    實體類實現Cloneable接口,重寫clone()方法,調用clone()方法,克隆得到的對象與原來的對象不是一個對象

  3. 反射

    得到Students類的Class對象,根據Class對象得到構造器,再根據構造器得到對象

  4. 對象反序列化

    實體類實現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創建對象

  1. spring也不適用new關鍵字創建對象,使用Ioc容器注入

  2. 先在xml配置文檔裏配置好對象的屬性與id值,得到與配置文檔的連接,根據配置文檔裏id屬性的值,得到對象(內部也是通過反射+xml文檔的解析實現的)

  3. 對象的創建是通過默認無參構造創建的,而屬性的初始化時使用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創建對象順序

  1. 加載applicationContext.xml文檔
  2. 解析對應的id的對象
  3. 通過反射區調用默認無參構造
  4. 使用set方法初始化屬性

5、spring的兩大核心技術

  1. IOC(DI),控制反轉/依賴注入

    如何理解依賴注入

    1. 創建對象,不適用new關鍵字

    2. 面向接口的編程,UsbInterface接口、Computer類、IocDemo3類

      不修改代碼,使用多態的形式,用IOC在配置文檔中讀取對象,修改配置文檔

    什麼是IOC容器:xml文檔中的beans標籤就是一個IOC容器

    爲什麼不推薦使用new創建對象

    1. 麻煩,可以直接在配置文檔裏面配置好,然後用的時候直接根據id屬性獲取對象就行了
  2. AOP,面向切面的編程

    1. 可以簡單的理解爲在不改變原有程序的基礎上爲代碼增加新的功能
      2. 分爲前置增強、後置增強、最終增強、異常增強、環繞增強
      3. 需要在原有的類上定義一個切口(方法),然後定義一個用於增強的AOP類,可以在類中定義增強的方法。最後在xml配置文檔中進行配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章