激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring中實例化bean的四種方式詳解

Spring中實例化bean的四種方式詳解

2021-03-13 14:03linuxidc Java教程

這篇文章主要給大家介紹了關于Spring中實例化bean的四種方式,分別是setter 方法、構造函數、靜態工廠以及實例工廠等四種方法,分別給出了示例代碼供大家參考學習,需要的朋友們下面隨著小編來一起學習學習吧。

前言

在介紹Bean的實例化的方式之前,我們首先需要介紹一下什么是Bean,以及Bean的配置方式。

如果把Spring看作一個大型工廠,那么Spring容器中的Bean就是該工廠的產品。要想使用Spring工廠生產和管理Bean,就需要在配置文件中指明需要哪些Bean,以及需要使用何種方式將這些Bean裝配到一起。

Spring容器支持兩種格式的配置文件,分別為Properties文件格式和xml文件格式,而在實際的開發當中,最常使用的額是xml文件格式,因此在如下的講解中,我們以xml文件格式的配置方式進行說明。XML配置文件的根元素是<beans>,其可以包含多個子元素<bean>,每個子元素定義一個Bean,并描述了Bean該如何被裝配到Spring容器中。<bean>元素中的屬性如下:

  • id:Bean的唯一標識符,Spring對Bean的配置、管理都通過該屬性來完成;
  • name:Spring同樣可以通過name對Bean進行配置和管理,name屬性可以為Bean定義多個名稱,每個名稱以逗號隔開;
  • class:該屬性指定了Bean的具體實現類,必須是一個完成的類名,使用類的全限定名;
  • scope:設定Bean實例的作用域,其屬性有singleton(單例)、prototype(原型)、request、session、和global Session,默認值為singleton,該屬性會在下一篇博客中詳細講解;
  • constructor-arg:<bean>元素的子元素,可以使用此元素傳入構造參數進行實例化(上一篇博客的最后補充就是使用此屬性進行實例化的),該元素的index屬性指定構造參數的序號(從0開始);
  • property:<bean>元素的子元素,通過調用Bean實例中的setter方法完成屬性賦值,從而完成依賴注入;
  • ref:property、constructor-arg等元素的子元素,該元素中的bean屬性用于指定對Bean工廠中某個Bean實例的引用;
  • value:property、constructor-arg等元素的子元素,用來直接指定一個常量值;
  • list:用于封裝List或數組類型的依賴注入;
  • set:用于封裝Set或數組類型的依賴注入;
  • map:用于封裝Map或數組類型的依賴注入;
  • entry:map元素的子元素,用于設定一個鍵值對,其key屬性指定字符串類型的鍵值,ref或value子元素指定其值。

在配置文件中,通常一個普通的Bean只需要定義id和class兩個屬性即可,定義Bean的方式如下:

?
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 將指定對象配置給spring,讓spring創建其實例 -->
    <bean id="userDao" class="com.ioc.UserDaoImpl"/>
    <bean name="userDao1, userDao2" class="com.ioc.UserDaoImpl2"/>
</beans>

上述代碼中,分別使用id和name屬性定義了兩個Bean,并使用class元素指定其對應的實現類,如果未指定id和name,則Spring會將class值當做id使用。

Spring實例化bean的四種方式

本文主要介紹四種實例化bean的方式(注入方式) 或者叫依賴對象實例化的四種方式。上面的程序,創建bean 對象,用的是什么方法 ,用的是構造函數的方式 (Spring 可以在構造函數私有化的情況下把類對象創建出來)

常用的創建方式有以下四種:

1) setter 方法

2) 構造函數

3) 靜態工廠

4) 實例工廠

一、用 setter 方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public interface IUserDao {
    void addUser();
    void delUser();
    void updateUser();
   }
   public class UserDaoImpl implements IUserDao {
    public void addUser() {
     System.out.println("addUser方法被調用了");
    
    public void delUser() {
     System.out.println("delUser方法被調用了");
    
    public void updateUser() {
     System.out.println("updateUser方法被調用了");
    }
   }
   public class UserAction {
     private IUserDao dao; //dao是一個依賴對象,要由springg進行管理,要生成 get set 方法
       public void execute(){
       dao.addUser();
       dao.updateUser();
       dao.delUser();
     }
    }
?
1
2
3
4
5
//配置文件
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" /> //引用的是下面的名稱
</bean>
<bean name="userDao_name" class="cat.dao.UserDaoImpl" />
?
1
2
3
4
//測試
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute();

二、構造函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class UserAction {
  //public UserAction(){} 可以保保留一個無參的構造函數
  //這是幾個依賴對象,不用生成get set方法了
  private UserInfo user;
  private String school;
  private IUserDao dao; 
  //希望Spring 由構造函數注入依賴對象
  public UserAction(IUserDao dao,UserInfo user,String school){
    this.dao=dao;
    this.school=school;
    this.user=user;
    }
  public void execute(){
    dao.addUser();
    dao.updateUser();
    dao.delUser();
    System.out.println(user);
    System.out.println(school);
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//配置文件
<bean name="userInfo_name" class="cat.beans.UserInfo" >
  <property name="id" value="1" />
  <property name="userName" value="周周" />
  <property name="password" value="123" />
  <property name="note" value="這是備注" />
</bean>  
<bean name="userAction_name" class="cat.action.UserAction" >
  <constructor-arg ref="userDao_name" />
  <constructor-arg ref="userInfo_name" />
  <constructor-arg value="哈爾濱師范大學" />
</bean>
/*
也可以指定 索引和 type 屬性 , 索引和type 都可以不指定
<bean name="userAction_name" class="cat.action.UserAction" >
<constructor-arg index="0" ref="userDao_name" type="cat.dao.IUserDao" /> 如果是接口,就不能指定是實現類的類型
<constructor-arg index="1" ref="userInfo_name" type="cat.beans.UserInfo" />
<constructor-arg index="2" value="哈爾濱師范大學" />
</bean>
*/  
<bean name="userDao_name" class="cat.dao.UserDaoImpl" />
?
1
2
3
4
//測試
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute();

三、靜態工廠方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//工廠,用來生成dao的實現類
public class UserDaoFactory {
public static IUserDao createUserDaoInstance(){
  return new UserDaoOracleImpl();
  }
}
public class UserAction {
  private IUserDao dao;//使用工廠方式注值,也要生成set方法
  public void execute(){
    dao.addUser();
    dao.updateUser();
    dao.delUser();
}
public void setDao(IUserDao dao) {
    this.dao = dao;
    }
}
?
1
2
3
4
5
//配置文件
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" />
</bean>
<bean name="userDao_name" class="cat.dao.UserDaoFactory" factory-method="createUserDaoInstance" />
?
1
2
3
4
//測試
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute();

四、實例工廠

?
1
2
3
4
5
6
7
//工廠 =>
public class UserDaoFactory {
//這個方法不是靜態的
public IUserDao createUserDaoInstance(){
  return new UserDaoOracleImpl();
  }
}
?
1
2
3
4
5
6
//配置文件
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" />
</bean>
<bean name="userDaoFactory_name" class="cat.dao.UserDaoFactory" />
<bean name="userDao_name" factory-bean="userDaoFactory_name" factory-method="createUserDaoInstance" />

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.linuxidc.com/Linux/2017-12/149963.htm

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 在线观看91精品 | 国产永久免费观看 | 精品久久久久久久久久中文字幕 | 久久精品一区二区三区四区五区 | 蜜桃91麻豆 | 久久精品久久精品国产大片 | 久久免费视频3 | 青草av.久久免费一区 | 久久金品| 亚洲国产精久久久久久久 | 亚洲第一页中文字幕 | 欧美成人三级大全 | 欧美成人免费在线视频 | 欧美日韩亚洲另类 | 青草av.久久免费一区 | 色婷婷久久久久久 | 免费视频xxxx| 欧美在线 | 亚洲 | 色婷婷久久久久久 | 九九热在线精品视频 | 超碰97最新 | 欧美激情猛片xxxⅹ大3 | 成人在线精品视频 | 成人国产精品一区二区毛片在线 | 免费一级a毛片免费观看 | 欧美国产成人在线 | 日本精品视频一区二区三区四区 | 黄色片网站免费在线观看 | 999久久久久久 | 国产免费激情视频 | 性片久久 | 91香蕉国产亚洲一区二区三区 | 日日狠狠久久偷偷四色综合免费 | 国产成人精品一区二区仙踪林 | 日本a级一区 | av中文一区 | 91久久九色| 成年人国产视频 | 福利在线影院 | 高清国产在线 | 成人羞羞在线观看网站 |