一、這裡先引入一點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是一個概念的兩種表示,實際上是同一種東西,隻是表達不同。
舉例:人開車,人對象依賴車對象(注入:将汽車對象交給司機,不用司機自己建立)
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);
}
}
測試結果
由測試結果可以看出來,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();
}
}
從結果看也無需自己建立JavaBean對象。
總結:
上述兩種配置方法都是由Spring容器建立javaBean對象,然後測試類裡建立一個相關容器對象,
由容器對象調用getBean()方法獲得容器裡的JavaBean對象。
在spring架構的實際開發中,這樣的好處是隻需要建立一個容器對象,就可以由配置資訊獲得想要的JavaBean對象。
無需自己new對象,擴充、修改、維護都比較友善。
4、對比以上兩種方法的優缺點:
注解優點是比較簡潔,缺點是和代碼耦合性高
XML優點是耦合性低,缺點是配置比較複雜