spring配置详解-三种对象创建方式_
生活随笔
收集整理的這篇文章主要介紹了
spring配置详解-三种对象创建方式_
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
新建一個包,b_create,關(guān)于Spring創(chuàng)建對象的方式,咱們首先先介紹默認方式,我復(fù)制一個配置文件過來,在這個包下創(chuàng)建一個配置文件,把這些注釋可以刪掉了,現(xiàn)在咱們看到的情況,是常見的情況,這種情況它是怎么創(chuàng)建對象的呢,這是創(chuàng)建方式一,這個問題我留給你們,一會創(chuàng)建對象,怎么創(chuàng)建的,我問的不是那么深奧,是不是走空參,空參構(gòu)造創(chuàng)建的,不經(jīng)歷構(gòu)造函數(shù)是不可能創(chuàng)建對象的,所以這種方式只有一個構(gòu)造,空參構(gòu)造,所以咱們測試看是不是走空參構(gòu)造,User對象聲明一個顯示的空參構(gòu)造,打印一下User對象空參構(gòu)造方法,只要走的話就會打印,配置文件,咱們要加載這個配置,把這個路徑粘過來,這樣就加載這個包的配置了,獲得咱們的user對象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><bean name="user" class="com.learn.bean.User"></bean></beans>
package com.learn.bean;/*** @author Leon.Sun*/
public class User {public User() {System.out.println("User空參構(gòu)造方法");}private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
package com.learn.a_hello;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.bean.User;public class Demo {@Testpublic void fun1() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user");/*** 打印user對象*/System.out.println(u);}}
User空參構(gòu)造方法
com.learn.bean.User@7113b13f顯然是走空參構(gòu)造,ApplicationContext容器的特點是,容器創(chuàng)建出來,所有對象都創(chuàng)建出來,現(xiàn)在我把所有代碼注掉了,是不是對象出來了,這就是咱們的創(chuàng)建方式一,創(chuàng)建方式一,空參構(gòu)造,Spring創(chuàng)建對象的方式,然后一共有三種方式,剛才咱們看的是第一種,空參構(gòu)造方式,這個標(biāo)上一個紅色,其他都是綠色,綠色是什么顏色,了解的意思,提前告訴你們,那這個了解,叫做靜態(tài)工廠,靜態(tài)對象工廠,靜態(tài)工廠方式,靜態(tài)工廠方式,是啥意思呢,比如說我user對象當(dāng)中,在這里寫太亂了,我在外面新建一個工廠吧,我在這里新建一個工廠,比如叫做BeanFactory,叫做UserFactory,UserFactory看名字就知道叫用戶工廠,返回值是User,方法名是createUser,導(dǎo)一個User的包,接下來咱們在方法當(dāng)中,咱們想手動把這個對象創(chuàng)建出來,調(diào)用這個方法把User創(chuàng)建出來,然后交給容器來管理,知道啥意思不,不讓Spring來創(chuàng)建了,而是咱們手動在方法里面創(chuàng)建,Spring幫我管理,調(diào)用這個方法創(chuàng)建出來又如何,明白啥意思不,那我們可以手動創(chuàng)建出來,咱們再打印一個,這個叫做靜態(tài)工廠創(chuàng)建User,然后咱們在這里return new一個User,希望Spring調(diào)這個方法來創(chuàng)建User,而不是直接調(diào)空參構(gòu)造,怎么配呢,這就是咱們的創(chuàng)建方式二,靜態(tài)工廠創(chuàng)建,咱們的user改成user2,class我們要配UserFactory的完整類名,class配置UserFactory的完整類名,你這樣配的話肯定不行,你要是這樣肯定是配置UserFactory對象給user2了,你還是得加上一個屬性,factory-method等于,把咱們的createUser方法名復(fù)制粘貼到這里來,把這三個屬性合在一起的話,那這個效果就出來了,意思就出來了,啥意思呢,意思就是調(diào)用UserFactory的createUser方法,創(chuàng)建一個user2的對象,知道啥意思不,這樣配置是調(diào)用咱們UserFactory的createUser方法,創(chuàng)建名為user2的對象,放入容器,那么接下來的話,咱們在測試類里面再測試一下,把這個測試方法復(fù)制一份,創(chuàng)建方式二,靜態(tài)工廠,那這個我們只要獲得user2就可以了,再執(zhí)行一下,看一下效果
package com.learn.b_create;import com.learn.bean.User;public class UserFactory {public static User createUser() {System.out.println("靜態(tài)工廠創(chuàng)建User");return new User();}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- 創(chuàng)建方式1:空參構(gòu)造方法 --><!-- <bean name="user" class="com.learn.bean.User"></bean> --><!-- 創(chuàng)建方式2:靜態(tài)工廠創(chuàng)建 調(diào)用UserFactory的createUser方法創(chuàng)建名為user2的對象,放入容器--><bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean></beans>
package com.learn.a_hello;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.bean.User;public class Demo {/*** 創(chuàng)建方式1:空參構(gòu)造*/@Testpublic void fun1() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user");/*** 打印user對象*/System.out.println(u);}/*** 創(chuàng)建方式2:靜態(tài)工廠*/@Testpublic void fun2() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);} }
靜態(tài)工廠創(chuàng)建User
User空參構(gòu)造方法
com.learn.bean.User@5ed828d看看效果,看到了不,上面是咱們的第一種方式,下面是不是靜態(tài)工廠,然后也創(chuàng)建成功了,第二種方式,接下來第三種方式了,第三種方式也是了解,實例工廠,這也是了解,實例工廠和靜態(tài)工廠實際上沒有太大區(qū)別,只不過現(xiàn)在通過調(diào)用createUser2方法來創(chuàng)建對象,那這兩個方法不能完全一樣,我要把這個static給刪掉,看到這兩個方法的區(qū)別了,上面的靜態(tài)工廠說白了就是,方法是靜態(tài)的而已,調(diào)這個方法的話,直接這個類名就可以調(diào),而下面這個,我要調(diào)的話,必須創(chuàng)建一個對象,UserFactory對象,才能執(zhí)行這個方法,那現(xiàn)在我想調(diào)用這個方法,來獲得User對象,那我該怎么配,這就是所謂的實例工廠,那我們再來一個配置,叫做user3,實例工廠創(chuàng)建,咋配呢,實例工廠相對于靜態(tài)工廠要麻煩一些,你要配置兩個bean,還得再來一個bean,因為你這個工廠對象,得要創(chuàng)建實例,所以你得把工廠對象配進來,所以這里來一個UserFactory對象,那完整名就需要復(fù)制工廠的完整名,然后粘貼過來,然后這個就不用了,首先讓UserFactory作為一個普通的bean配置到容器當(dāng)中,然后接下來,關(guān)鍵是在這,在這的話,在factory-bean這里要填寫userFactory,這樣的話配完了,配完了感受一下看看,這是不是也很好理解,createUser要改成2,首先配置一個工廠對象,然后再看這個配置,factory-bean是告訴哪一個對象是工廠對象,這個是告訴他是調(diào)用工廠對象的哪一個方法,是不是獲得你的UserFactory對象,調(diào)用UserFactory,對象的createUser2方法的創(chuàng)建名為user3的對象,放入容器,那這個配置完事以后,咱們再測試一下咱們的動態(tài)工廠方式,動態(tài)工廠咱們只要獲得user3就可以了,再執(zhí)行一下,看看動態(tài)工廠打印
package com.learn.b_create;import com.learn.bean.User;public class UserFactory {public static User createUser() {System.out.println("靜態(tài)工廠創(chuàng)建User");return new User();}public User createUser2() {System.out.println("實例工廠創(chuàng)建User");return new User();}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- 創(chuàng)建方式1:空參構(gòu)造方法 --><!-- <bean name="user" class="com.learn.bean.User"></bean> --><!-- 創(chuàng)建方式2:靜態(tài)工廠創(chuàng)建 調(diào)用UserFactory的createUser方法創(chuàng)建名為user2的對象,放入容器--><!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> --><!-- 創(chuàng)建方式2:實例工廠創(chuàng)建 --><bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean><bean name="userFactory" class="com.learn.b_create.UserFactory"></bean></beans>
package com.learn.a_hello;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.bean.User;public class Demo {/*** 創(chuàng)建方式1:空參構(gòu)造*/@Testpublic void fun1() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user");/*** 打印user對象*/System.out.println(u);}/*** 創(chuàng)建方式2:靜態(tài)工廠*/@Testpublic void fun2() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}/*** 創(chuàng)建方式2:動態(tài)工廠*/@Testpublic void fun3() {/*** 1.創(chuàng)建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user3");/*** 打印user對象*/System.out.println(u);}}
這是實例工廠,這就是第三種創(chuàng)建方式,后面兩種看看,以后基本上不用
?
總結(jié)
以上是生活随笔為你收集整理的spring配置详解-三种对象创建方式_的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring项目概念-BeanFacto
- 下一篇: spring配置详解-scope属性