Spring(二):Spring通過IOC來創(chuàng)建對象
一、IOC如何獲取對象
1.1 Spring是如何獲取對象的?
①新建一個(gè)maven項(xiàng)目后導(dǎo)入webmvc的依賴:因?yàn)閣ebmvc包含了很多其他依賴,為了省事,干脆導(dǎo)入一個(gè)總的,方便省事!版本嘛!個(gè)人比較喜歡用最新版。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.5</version> </dependency>
②新建實(shí)體測試類:
public class Person { private String name; private int age; private String like; private String high; //get、set、tostring方法為了篇幅省略,可以自己加或者使用lombok }
③在resources目錄下新建ContextAplication.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="Person" class="entity.Person"> <property name="age" value="23"></property> <property name="name" value="丁大大"></property> <property name="like" value="釣魚"></property> <property name="high" value="173"></property> </bean> </beans>
④以上前提之后,你會發(fā)現(xiàn)你的測試Person類種發(fā)生了變化:點(diǎn)擊可以跳轉(zhuǎn)到指定的xml位置哦~
⑤測試:
Context.getBean() 不指定類時(shí),需要強(qiáng)制轉(zhuǎn)換,所以建議使用第二種方式來獲取對象
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); // Person person = (Person) Context.getBean("Person");//這里不指定的話需要強(qiáng)轉(zhuǎn),建議用下面的方式來拿對象 Person person = Context.getBean("Person",Person.class); System.out.println(person); } }
⑥執(zhí)行結(jié)果如下:成功拿到值!
⑦總結(jié):
- 控制: 傳統(tǒng)的程序?qū)ο蟮膭?chuàng)建是由程序來控制創(chuàng)建的。
- 反轉(zhuǎn): 交給Spring容器來創(chuàng)建對象,而程序只負(fù)責(zé)被動的接收對象。這就是反轉(zhuǎn)。
- 依賴注入: 就是通過set方法來注入的。
1.2 改造案例由xml選擇創(chuàng)建對象
①xml:
<bean id="StudentMapperImpl" class="mapper.impl.StudentMapperImpl"/> <bean id="TeacherMapperImpl" class="mapper.impl.TeacherMapperImpl"/> <bean id="PersonServiceImpl" class="service.impl.PersonServiceImpl"> <property name="studentMapper" ref="StudentMapperImpl"/> </bean>
②測試:
ApplicationContext Context1 = new ClassPathXmlApplicationContext("ContextAplication.xml"); PersonServiceImpl personServiceImpl = Context1.getBean("PersonServiceImpl", PersonServiceImpl.class); personServiceImpl.getPersonInfo();
③執(zhí)行結(jié)果:
⑤總結(jié):
對象由Spring 來創(chuàng)建 , 管理 , 裝配 !這就是 IOC!
二、IOC是通過什么方式來創(chuàng)建對象的?
2.1 通過無參構(gòu)造函數(shù)來創(chuàng)建對象
①以Person類為例子,但是加上一個(gè)無參構(gòu)造函數(shù)!
public class Person { private String name; private int age; private String like; private String high; public Person() { //輸出一句話證明自己被調(diào)用了! System.out.println("我是Person類的無參構(gòu)造函數(shù)!我被調(diào)用了?。。。?); } //set、get、tostring方法因?yàn)槠蚴÷?,請手動加? }
②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="Person" class="entity.Person"> <property name="age" value="23"></property> <property name="name" value="丁大大"></property> <property name="like" value="釣魚"></property> <property name="high" value="173"></property> </bean> </beans>
③測試類:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person = Context.getBean("Person", Person.class); System.out.println(person); } }
④執(zhí)行結(jié)果:
⑤去除無參構(gòu)造,增加有參構(gòu)造:
xml配置程序直接報(bào)錯(cuò):
⑥總結(jié):
Spring創(chuàng)建對象默認(rèn)是通過無參構(gòu)造函數(shù)創(chuàng)建的!能通過有參構(gòu)造函數(shù)來創(chuàng)建對象嘛?能!看下面!
2.2 通過有參構(gòu)造方法來創(chuàng)建對象
①前提于 2.1 一致,新增有參構(gòu)造函數(shù):(因?yàn)轭愔?,默認(rèn)的也就是不寫構(gòu)造參數(shù)就是無參構(gòu)造,寫了有參構(gòu)造才能真正意義上去除無參構(gòu)造,這個(gè)不用解釋太多吧,java基礎(chǔ)的內(nèi)容了~?。?/p>
public Person(String name, int age, String like, String high) { this.name = name; this.age = age; this.like = like; this.high = high; }
②xml配置文件中要發(fā)生一定的改變:
<?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="Person" class="entity.Person"> <!-- <property name="name" value="丁大大"></property>--> <!-- <property name="age" value="23"></property>--> <!-- <property name="like" value="釣魚"></property>--> <!-- <property name="high" value="173"></property>--> <constructor-arg index="0" value="丁大大"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
③執(zhí)行結(jié)果:
⑤總結(jié):
- 無參構(gòu)造函數(shù)指定值時(shí)使用 propert 標(biāo)簽
- 有參構(gòu)造函數(shù)指定值時(shí)使用 constructor-arg 標(biāo)簽,三種寫法
- index --通過下標(biāo)來給屬性賦值
- name --通過屬性名稱來給屬性賦值
- type -- 指定屬性的類型來給屬性賦值
- 基本類型可以直接寫
- 引用類型得加上全稱,如:java.lang.String
- 位置跟index差不多,依次從上到下對應(yīng)屬性的從上到下。
- 在配置文件加載的時(shí)候。其中管理的對象都已經(jīng)初始化了!
三、Spring的配置
3.1 alias(別名):
- 為bean設(shè)置別名,可設(shè)置多個(gè)!
①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"> <alias name="Person" alias="personAlias1"/> <alias name="Person" alias="personAlias2"/> <alias name="Person" alias="personAlias3"/> <bean id="Person" class="entity.Person"> <constructor-arg index="0" value="丁大大"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
②測試類:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person = Context.getBean("personAlias1", Person.class); System.out.println(person); } }
③執(zhí)行結(jié)果:
④總結(jié):講實(shí)話,這玩意用處不大,因?yàn)檫€有更好的方式來設(shè)置別名!
3.2 Bean的配置:
- bean就相當(dāng)于java對象,由Spring創(chuàng)建和管理
①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"> <alias name="Person" alias="personAlias1"/> <alias name="Person" alias="personAlias2"/> <alias name="Person" alias="personAlias3"/> <bean id="Person" name="person1,person2 person3;person4" class="entity.Person"> <constructor-arg index="0" value="丁大大"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
②測試類:
public class Test { public static void main(String[] args) { ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml"); Person person = Context.getBean("person4", Person.class); System.out.println(person); } }
③執(zhí)行結(jié)果:
④總結(jié):
- id是bean的唯一標(biāo)識符
- 如果沒有配置id,那么name相當(dāng)于標(biāo)識符,并且可以設(shè)置多個(gè)
- name也是別名,可多個(gè),并且可以通過 逗號 空格 分號 來分隔,是不是比alias別名方便?所以設(shè)置別名我們一般使用name
- id和name同時(shí)存在,name只是別名,不是標(biāo)識符
- class是類的全限定名 包名+類名
3.3 import(團(tuán)隊(duì)合作之導(dǎo)入)
①在實(shí)際工作的開發(fā)過程中,一個(gè)項(xiàng)目可能由多個(gè)程序員來進(jìn)行開發(fā),所以為了解決共性問題,比如:同一文件提交時(shí)都進(jìn)行了修改可能引起沖突,所以我們使用import來解耦!
②新建多個(gè)xml配置文件:
ContextAplication.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"> <import resource="dyj1.xml"/> <import resource="dyj3.xml"/> <import resource="dyj2.xml"/> </beans>
dyj1.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 name="person1,person2 person3;person4" class="entity.Person"> <constructor-arg index="0" value="丁大大1"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚1"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
dyj2.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 name="person1,person2 person3;person4" class="entity.Person"> <constructor-arg index="0" value="丁大大2"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚2"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
dyj3.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 name="person1,person2 person3;person4" class="entity.Person"> <constructor-arg index="0" value="丁大大3"/> <constructor-arg name="age" value="23"/> <constructor-arg type="java.lang.String" value="釣魚3"/> <constructor-arg type="java.lang.String" value="173"/> </bean> </beans>
③執(zhí)行:
④總結(jié):
- 如果三個(gè)文件都是對同一個(gè)操作同一個(gè)類,或者說內(nèi)容一致,那么就以主xml中從上到下最后一個(gè)impot為準(zhǔn)。
- 語法格式:
- 優(yōu)點(diǎn):
- 每個(gè)人開發(fā)的都是獨(dú)立的,如果重復(fù)的內(nèi)容,Spring會幫我們自動合并!
- 降低了程序的沖突性!
- 大大提高了后期代碼的可維護(hù)性!
總結(jié)
本篇文章就到這里了,希望能幫助到你,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)
這篇文章主要為大家介紹了shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08強(qiáng)烈推薦IDEA提高開發(fā)效率的必備插件
這篇文章主要介紹了強(qiáng)烈推薦IDEA提高開發(fā)效率的必備插件,文中有非常詳細(xì)的圖文示例,對想要提高企業(yè)開發(fā)效率的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫中字段名不對應(yīng)解決辦法
這篇文章主要介紹了詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫中字段名不對應(yīng)解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03springboot升級到j(luò)dk21最新教程(2023年)
你還在使用jdk8?快來看看最新出爐的SpringBoot+jdk21如何使用,下面這篇文章主要給大家介紹了關(guān)于springboot升級到j(luò)dk21的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10Spring實(shí)戰(zhàn)之使用注解實(shí)現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用注解實(shí)現(xiàn)聲明式事務(wù)操作,結(jié)合實(shí)例形式詳細(xì)分析了spring使用注解實(shí)現(xiàn)聲明式事務(wù)相關(guān)配置、接口實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2020-01-01Springboot繼承Keycloak實(shí)現(xiàn)單點(diǎn)登錄與退出功能
這篇文章主要介紹了Springboot繼承Keycloak實(shí)現(xiàn)單點(diǎn)登陸與退出,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式
這篇文章主要介紹了SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07