初識spring到搭建spring IoC

什麼是Spring

Spring是分層的Java SE/Java EE應用的full-stack輕量級開源框架,以IoC(Inverse Of Control 反轉控制)和AOP(Aspect Oriented Programing 面向切面編程)爲內核,提供了表現層(View)Spring MVC和持久層Spring JDBC以及業務層事務管理的衆多的企業級應用技術,還能整合開源世界衆多知名的第三方框架和類庫,逐漸成爲是哎喲個最多的Java EE企業應用的開源框架。官網


Spring框架結構


Spring優勢

  • 降低耦合,簡化開發。

    • 通過Spring提供IoC容器可以講對象之間的依賴關係交給Spring控制,避免硬編碼造成的過度的程序耦合。程序員不必在位單例模式類、屬性文件解析等這些底層的需求編寫代碼,可以更專注與上層應用。
  • AOP編程的支持

    • 通過Spring的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應對。
  • 聲明式事務的支持

    • 通過聲明(配置)的方式靈活的進行事務的管理,提高開發效率和質量
  • 方便程序的測試

    • 可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試編的簡單容易
  • 方便集成各種優秀的框架

    • Spring可以降低各種框架的使用難度,提供了對各種優秀框架(Struts、Hibernate、Hessian、Quartz……)的直接支持
  • 降低Java EE API的使用難度

    • Spring對Java EE API(如 JDBC、JavaMail、RPC等)進行了封裝,使這些API的使用難度大大降低

使用Spring

基於xml的IoC環境搭建

  1. 新建maven工程,在pom.xml中導入spring依賴,依賴關係可直接在maven倉庫官網中去複製 maven倉庫
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId> 
    <version>5.2.6.RELEASE</version>
</dependency>

下載成功後,如下:

圖中的spring-jcl 包是apache的日誌框架

打開maven中依賴關係視圖查看當前項目的依賴結構如下:

  1. 創建serverce類和serverceImpl類

server類:

public interface IUserServerce {

    public void updateUser();
}

實現類:

public class UserServerceImpl implements IUserServerce {
    public void updateUser() {
        System.out.println("用戶信息更新成功");
    }
}
  1. 創建測試類
public class IoCTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        IUserServerce userSvc = (IUserServerce) applicationContext.getBean(IUserServerce.class.getName());
        userSvc.updateUser();
    }
}

執行測試程序結果如下:


分析

ApplicationContext類

光標停留在ApplicationContext類上,右鍵,選擇Diagrams命令、Show Diagrm查看依賴關係的UML圖

  1. 可以看到,ApplicationContext是實現了BeanFactory的,那麼這兩個核心Core(容器)接口有什麼區別?

    • ApplicationContex:在構建容器時,採用即時加載的策略創建對象,在讀取完配置文件後,立刻就創建了配置的所有對象。適用於單例模式

    • BeanFactory:在構建容器時,採用延時加載策略創建對象,在獲取對象時,才創建對象。適用多例模式,按需加載

  2. ApplicationContex的實現類
    在UML圖中右鍵ApplicationContext,選擇Show Implementions

在測試程序用是實現類ClassPathXmlApplicationContext,從圖中看到類似的實現類還有

  1. 那麼這3個實現類有什麼區別?
    • ClassPathXmlApplicationContext:加載類路徑下的配置文件,如果配置文件不存在於類路徑下,加載失敗
    • FileSystemXmlApplicationContext:加載磁盤中的配置文件(必須要有訪問權限),但是項目部署後,不能保證每臺機器(服務器)都有指定的磁盤,因此侷限性太大
    • AnnotationConfigApplicationContext:用於讀取註解創建容器

創建bean的三種方式

  1. 使用默認構造函數創建,配置如下:
 <bean id="serverce.IUserServerce" class="serverImpl.UserServerceImpl"></bean>

實現類如下:

public class UserServerceImpl implements IUserServerce {
    public void updateUser() {
        System.out.println("用戶信息更新成功");
    }
}

執行結果如下:

問題:實現類中並沒有寫構造函數,那怎麼執行成功的?

答:java中默認無參構造,當不重載構造函數時,默認調用無參構造,且午餐構造可省略不寫。當重寫了構造函數後,必須手動添加無參構造,否則此方式創建bean,會拋出異常

添加了無參構造後,執行成功:

問題: 當使用某個jar包中的類,它沒有構造函數,又不能修改,此時怎麼創建bean?代碼如下:

/**
 * 模擬使用jar包中的類
 */
public class NewJar {
    public IUserServerce getUserSvc(){
        return new UserServerceImpl();
    }
}

該怎麼獲取到IUserServerce的對象?直接new一個NewJar,然後獲取?注意我們需要的是IUserServerce的對象,並不需要NewJar的對象,但是卻創建了一個我們不需要的對象。方式2解決這個問題。

  1. 使用普通工廠方式創建
<!--    方式2. 使用普通工廠方式創建-->
    <bean id="factory.NewJar" class="factory.NewJar"></bean>
    <bean id="serverce.IUserServerce" factory-bean="factory.NewJar" factory-method="getUserSvc"></bean>

執行結果如下:

有了第二種方式,引發出第三種方式。

  1. 使用工廠的靜態方法創建
<bean id="serverce.IUserServerce" class="factory.NewJar" factory-method="getUserSvc"></bean>

執行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章