<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由 Spring IoC 容器管理的物件稱為 Bean,Bean 設定方式有兩種:組態檔開發和註解開發
Spring 組態檔支援兩種格式:xml和properties,此教學以xml組態檔講解。
XML 組態檔的根元素是 <beans>,該元素包含了多個子元素 <bean>。每一個 <bean> 元素都定義了一個 Bean
XML 組態檔常用元素表
屬性名稱 | 描述 |
---|---|
id | Bean 的唯一識別符號,Spring IoC 容器對 Bean 的設定和管理都通過該屬性完成。 |
name | Bean 的別名,可以通過 name 屬性為同一個 Bean 同時指定多個名稱,每個名稱之間用逗號或分號隔開。 |
class | 指定了Bean 的具體實現類,它必須是一個類的全限定名。 |
scope | Bean 的作用域,屬性值可以為 singleton(單例)、prototype(原型)、request、session 和 global Session。預設值是 singleton。 |
先插個眼在這,過幾天會發一篇文章詳細介紹
通過控制反轉,物件的建立權就交給了IoC容器,但是容器是如何來建立物件的呢?
bean本質上就是物件,物件在new的時候會使用構造方法,建立bean其實也是使用構造方法完成的。
範例化bean的三種方式:構造方法,靜態工廠和範例工廠
1.準備一個UserDao
介面和一個UserDaoImpl
實現類
//UserDao介面 public interface UserDao { public void say(); } //UserDaoImpl實現類 public class UserDaoImpl implements UserDao { @Override public void say() { System.out.println("Hello,I am BigHorn!"); } }
2.編寫spring組態檔
<bean id="userDao" class="com.bighorn.dao.impl.UserDaoImpl"/>
3.編寫執行程式
public class App { public static void main(String[] args) { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取物件 UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class); userDao.say(); } }
第一種範例化bean的方法:構造方法範例化,這也是最常用的方法,因為類都會提供預設的構造方法。下面來測試下
1.在UserDaoImpl類中新增一個無參構造方法,並列印一句話,方便觀察結果。
public class UserDaoImpl implements UserDao { //新增一個無參構造方法 public UserDaoImpl() { System.out.println("這是UserDaoImpl的無參構造方法"); } @Override public void say() { System.out.println("Hello,I am BigHorn!"); } }
可以在控制檯看到輸出結果,說明Spring IoC 容器建立物件時用的也是構造方法
2.將構造方法改成private測試
public class UserDaoImpl implements UserDao { //將構造方法改成private private UserDaoImpl() { System.out.println("這是UserDaoImpl的無參構造方法"); } @Override public void say() { System.out.println("Hello,I am BigHorn!"); } }
發現還可以執行成功,這說明Spring底層用的是反射,存取到類中的私有構造方法。
3.將無參構造方法換成有參構造方法
public class UserDaoImpl implements UserDao { //將無參構造方法換成有參構造方法 private UserDaoImpl(int i) { System.out.println("這是UserDaoImpl的無參構造方法"); } @Override public void say() { System.out.println("Hello,I am BigHorn!"); } }
程式會報java.lang.NoSuchMethodException
錯,說明Spring底層使用的是類的無參構造方法。
4.畫個圖總結下:Spring 組態檔中 bean 標籤的 id 和類的全限定名一一對應,所以 Spring IoC容器的 getBean 方法其實就是先根據 bean 的 id 獲取該類的全限定名,然後再利用反射根據類的全限定名建立物件並返回。
第二種範例化Bean的方法:靜態工廠範例化
瞭解即可,一般是用來相容早期的一些老系統。
1.建立一個UserDaoFactory工廠類並提供一個靜態方法
//UserDao介面 public interface UserDao { public void say(); } //UserDaoImpl實現類 public class UserDaoImpl implements UserDao { public UserDaoImpl() { System.out.println("這是UserDaoImpl的無參構造方法"); } @Override public void say() { System.out.println("Hello,I am BigHorn!"); } } //UserDaoFactory工廠類 public class UserDaoFactory { //靜態工廠建立物件 public static UserDao getUserDao(){ System.out.println("這是靜態工廠範例化Bean"); return new UserDaoImpl(); } }
2.編寫spring組態檔
<!-- class:工廠類全類名 factory-method:工廠建立物件的方法名 --> <bean id="userDao" class="com.bighorn.factory.UserDaoFactory" factory-method="getUserDao"/>
3.編寫執行程式
public class App { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取物件 UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class); userDao.say(); } }
看見執行結果,輸出以下語句
第二種範例化Bean的方法:範例工廠範例化
瞭解即可,其實和靜態工廠差不多。只不過靜態工廠可以直接通過靜態方法建立bean,範例工廠要先new一個範例工廠物件,然後再通過這個範例工廠物件建立bean
1.建立一個UserDaoFactory
工廠類,和靜態工廠不一樣的是,實力工廠提供的是一個普通方法
//UserDaoFactory工廠類 public class UserDaoFactory { //範例工廠建立物件 public UserDao getUserDao(){ System.out.println("這是範例工廠範例化Bean"); return new UserDaoImpl(); } }
2.編寫spring組態檔
<!-- userFactory:工廠的範例物件 factory-bean:指向工廠的範例物件 factory-method:工廠物件中建立物件的方法名 --> <bean id="userFactory" class="com.bighorn.factory.UserDaoFactory"/> <bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>
3.執行程式和靜態工廠一樣,檢視執行結果
範例工廠的方法聽麻煩的,其實spring框架為我們一種範例工廠的方式:FactoryBean
,比較實用,用來整合其他框架
我們只需要實現FactoryBean介面即可簡化開發,下面來介紹下它的具體使用方法
1.建立UserDaoFactoryBean類,實現FactoryBean介面中的三個方法:
boolean isSingleton()
:設定bean作用域,預設true表示單例,false表示非單例T getObject() throws Exception
:返回的是bean範例物件Class<?> getObjectType()
:返回的是被建立類的Class物件public class UserDaoFactoryBean implements FactoryBean<UserDao> { //bean作用域:預設true表示單例 public boolean isSingleton() { return true; } //代替範例工廠中建立物件的方法 public UserDao getObject() throws Exception { System.out.println("這是FactoryBean範例化bean"); return new UserDaoImpl(); } //返回所建立類的Class物件 public Class<?> getObjectType() { return UserDao.class; } }
2.編寫spring組態檔
<bean id="userDao" class="com.bighorn.factory.UserDaoFactoryBean"/>
3.編寫執行程式
public class App { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取物件 UserDaoImpl userDao1 = context.getBean("userDao", UserDaoImpl.class); UserDaoImpl userDao2 = context.getBean("userDao", UserDaoImpl.class); System.out.println(userDao1); System.out.println(userDao2); } }
以上就是詳解Spring Bean的設定方式與範例化的詳細內容,更多關於Spring Bean設定方式 範例化的資料請關注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