天天看點

Spring全家桶之springIOC

一、這裡先引入一點Spring的基本概念,大家可以百度檢視 spring的組成與介紹

Spring是一個輕量級控制反轉(IoC)和面向切面(AOP)的容器架構,能夠為企業級開發提供一站式服務。

重量級:EJB(Enterprise JavaBean)開發複雜,功能強,侵入性高

輕量級:Spring,開發比較簡單,功能強大,侵入性低

   IOC:控制反轉,實作代碼解耦

   AOP:面向切面程式設計

   容器:Spring用于儲存各種Java對象(JavaBean)

   一站式:Spring全家桶

二、IOC和DI

1、IOC (Inverse Of Control)控制反轉

一般情況下,開發者自己來建立對象,調用對象;

控制反轉是由容器來建立對象,通過反射的方式注入到開發者需要的地方(屬性、方法、類),進而達到代碼解耦的目的。

舉例:我做一頓晚飯(“飯”對象由自己建立自己調用),我點一份晚餐外賣(“飯”對象由别人建立)

代碼解耦帶來的好處:代碼的靈活性提高,擴充、修改、維護都比較友善。

2、DI(Dependency Injection)依賴注入

DI和IOC是一個概念的兩種表示,實際上是同一種東西,隻是表達不同。

舉例:人開車,人對象依賴車對象(注入:将汽車對象交給司機,不用司機自己建立)

Spring全家桶之springIOC

3、上代碼one(用xml配置IOC)這裡隻是最最基礎的例子,适合于入門級新手。

1)導入依賴

<dependency> <!--SpringIOC核心依賴-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
           
實體類:
      
public class Dinner {
    public void start(){
        System.out.println("這一頓晚餐");
    }
}
           

在resources下,右鍵New——>Xml Configuration File ——> Spring config

檔案名為spring.xml 配置<bean>

<?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">
    <!--配置Dinner的javaBean-->
    <bean id="dinner" class="com.hmq.Dinner"></bean>
</beans>
           

測試類

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args){
        //建立容器對象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        //通過spring.xml中的id讀取對象
        Dinner dinner1 = (Dinner) context.getBean("dinner");
        dinner1.start();

        //通過類型讀取對象
        Dinner dinner2 = context.getBean(Dinner.class);
        dinner2.start();

        //通過類型讀取對象
        Dinner dinner3 = new Dinner();
        dinner3.start();

        System.out.println(dinner1==dinner2);
        System.out.println(dinner2==dinner3);
    }
}
           

測試結果

Spring全家桶之springIOC

由測試結果可以看出來,Dinner對象是由spring容器建立的(因為在xml中配置了<bean>掃描了Dinner類),

不需要自己建立對象,跟自己建立的對象位址也不一樣。

3、上代碼two(用注解配置IOC)

實體類

import org.springframework.stereotype.Component;

@Component //類被該注解配置後 會被Spring發現并建立該類的對象,存入到Spring容器中
public class Cook {
    public void start(){
        System.out.println("我是一個廚師");
    }
}
           

測試類

public class Test2 {
    public static void main(String[] args) {
        //建立注解的容器對象
        ApplicationContext context=new AnnotationConfigApplicationContext(Cook.class);
        //讀取對象
        Cook cook = context.getBean(Cook.class);
        cook.start();
    }
}
           
Spring全家桶之springIOC

從結果看也無需自己建立JavaBean對象。

總結:

   上述兩種配置方法都是由Spring容器建立javaBean對象,然後測試類裡建立一個相關容器對象,

由容器對象調用getBean()方法獲得容器裡的JavaBean對象。

在spring架構的實際開發中,這樣的好處是隻需要建立一個容器對象,就可以由配置資訊獲得想要的JavaBean對象。

無需自己new對象,擴充、修改、維護都比較友善。

4、對比以上兩種方法的優缺點:

     注解優點是比較簡潔,缺點是和代碼耦合性高

     XML優點是耦合性低,缺點是配置比較複雜

繼續閱讀