<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們通常所說的 Spring 指的是 Spring Framework(Spring 框架),它是一個開源框架,有著活躍而龐 大的社群,這就是它之所以能長久不衰的原因。Spring 支援廣泛的應用場景,它可以讓 Java 企業級的應用程式開發起來更簡單。
一句話概括 Spring :Spring 是包含了眾多工具方法的 IOC 容器
那麼什麼是 IOC 呢
IOC (Inversion of Control 控制反轉),就是說 Spring 是一個控制反轉的容器
既然提到了控制反轉,那麼就來看看什麼是正向控制,什麼是反向控制
在我們之前的大部分程式碼中,當我們要用到一個物件時,我們就需要自己構造這個物件,自己 new 物件,自己造,自己用,典型的自給自足生產模式
在 Spring 的大部分程式碼中,我們只需要宣告我們需要一個什麼樣的物件,物件的構造我們不管,這裡的物件就是 Spring 幫我們注入進來的,物件就來自於 IOC 容器
說到 IoC 不得不提的一個詞就是“DI”,DI 是 Dependency Injection 的縮寫,翻譯成中文是“依賴注入”的 意思。
所謂依賴注入,就是由 IoC 容器在執行期間,動態地將某種依賴關係注入到物件之中。所以,依賴注入 (DI)和控制反轉(IoC)是從不同的角度的描述的同一件事情,就是指通過引入 IoC 容器,利用依賴關係注入的方式,實現物件之間的解耦。
Spring 容器就是這個市場,我們既可以是賣家,也可以是買家
當我們是賣家時,將我們的物件注入到 Spring 庫
當我們是買家時,宣告我們需要的物件,Spring 從庫中將物件取出來給我們
當我們需要造一輛車時,就需要得到一個四個部分,才能造成一輛車
以程式碼實現時,我們就需要這四個物件,先手動將這四個物件注入到庫中
@Component:將被修飾的類註冊到庫中
@Autowired:自動注入,在這裡可以理解成從庫中拿到所修飾的元素
這裡重寫 toSpring() 只是為了列印物件,沒有其他特殊意義
使用 context.getBeanDefinitionNames() 得到庫中所有物件並列印後,可以清楚的看到,這四個物件已經被注入到庫中
後續 car 物件也成功列印
@Component public class Car { @Autowired private Framework framework; @Override public String toString() { return "Car{" + "framework=" + framework + '}'; } }
@Component public class Framework { @Autowired private Bottom bottom; @Override public String toString() { return "Framework{" + "bottom=" + bottom + '}'; } }
@Component public class Bottom { @Autowired private Tire t1; @Autowired private Tire t2; @Autowired private Tire t3; @Autowired private Tire t4; @Override public String toString() { return "Bottom{" + "t1=" + t1 + ", t2=" + t2 + ", t3=" + t3 + ", t4=" + t4 + '}'; } }
@Component public class Tire { @Override public String toString() { return "輪子"; } }
主類
@SpringBootApplication public class IocApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(IocApplication.class, args); Car car = context.getBean(Car.class); // 得到庫中所有的 bean(物件) String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(beanDefinitionName); } System.out.println(car); } }
當有一個物件沒有被 @Component 修飾,即庫中沒有這個物件,那麼其他物件就不能用@Autowired 得到這個物件,則就會出現以下異常
現在這個 XML 檔案就可以看成是一個空的 Spring 庫
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
用 FileSystemXmlApplicationContext() 開啟這個 XML 檔案之後,就可以在這裡對剛剛建立的 Spring 進行一些操作
public class Main { public static void main(String[] args) { //1. 以 XML 組態檔手動建立 Spring 容器 FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("spring-config.xml"); // 2. 列印容器中所有物件的 bean-id String[] names = context.getBeanDefinitionNames(); System.out.println("所有物件陳列:"); for (String name : names) { Object bean = context.getBean(name); // 得到此類的全名,即包含包名的名稱 String canonicalName = bean.getClass().getCanonicalName(); System.out.println(name + " " + canonicalName); } int count = context.getBeanDefinitionCount(); System.out.println("一共有" + count + "個"); } }
以 bean 標籤來對物件進行注入,以下 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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- xml的方式注入類,new 的過程也交給 Spring--> <bean id="empty-class" class="com.hsq.ioc2.EmptyClass"/> <!-- 構造方法注入類--> <bean id="second-class" class="com.hsq.ioc2.SecondClass"> <!-- 依賴 EmptyClass 注入 SecondClass--> <constructor-arg ref="empty-class"/> </bean> <!-- set 方法注入類--> <bean id="third-class" class="com.hsq.ioc2.ThirdClass"> <property name="EmptyClass" ref="empty-class"/> <property name="SecondClass" ref="second-class"/> </bean> </beans>
public class EmptyClass { public EmptyClass() { System.out.println("被呼叫"); } }
public class SecondClass { public SecondClass(EmptyClass emptyClass) { System.out.println("second 被呼叫"); } }
public class ThirdClass { public EmptyClass emptyClass; public SecondClass secondClass; public void setEmptyClass(EmptyClass emptyClass) { System.out.println("setEmptyClass() " + emptyClass); this.emptyClass = emptyClass; } public void setSecondClass(SecondClass secondClass) { System.out.println("setSecondClass() " + secondClass); this.secondClass = secondClass; } public ThirdClass() { System.out.println("third 被呼叫"); } }
到此這篇關於Spring IOC與DI核心重點分析的文章就介紹到這了,更多相關Spring IOC與DI內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45