溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring IOC的bean聲明方式有哪些

發(fā)布時(shí)間:2021-12-16 09:39:07 來源:億速云 閱讀:131 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“Spring IOC的bean聲明方式有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Spring IOC的bean聲明方式有哪些”吧!

  Spring簡(jiǎn)介

  Spring不是服務(wù)于開發(fā)web項(xiàng)目的功能,或業(yè)務(wù)。而是服務(wù)于項(xiàng)目的開發(fā),方便各層間的解耦調(diào)用,方便對(duì)類的批量管理,是提高軟件開發(fā)效率,降低后期維護(hù)成本的框架。

  Spring的核心思想是IOC(控制反轉(zhuǎn)),AOP(切面編程)兩點(diǎn)。

  IOC:即不再需要程序員去顯式地New一個(gè)對(duì)象,而是把Spring框架把框架創(chuàng)建出的對(duì)象拿來用。因?yàn)槭莝pring框架創(chuàng)建的對(duì)象,對(duì)象都在spring框架對(duì)象中保存,亦稱為spring容器,這樣spring就知道當(dāng)前項(xiàng)目中都創(chuàng)建了哪些對(duì)象,這個(gè)對(duì)象歸屬于那一層,該如何管理。想使用spring的其他功能第一點(diǎn)就是要用spring的對(duì)象,也稱為將控制權(quán)交給spring管理。

  AOP:對(duì)某種路徑下的所有類,或有共同特性的類或方法統(tǒng)一管理,在原任務(wù)執(zhí)行的前后,加入新功能。做出監(jiān)控,初始化,整理,銷毀等一系列統(tǒng)一的伴隨動(dòng)作。

  如果你從事Java編程有一段時(shí)間了, 那么你或許會(huì)發(fā)現(xiàn)(可能你也實(shí)際使用過) 很多框架通過強(qiáng)迫應(yīng)用繼承它們的類或?qū)崿F(xiàn)它們的接口從而導(dǎo)致應(yīng)用與框架綁死。這種侵入式的編程方式在早期版本的Struts以及無數(shù)其他的Java規(guī)范和框架中都能看到。Spring竭力避免因自身的API而弄亂你的應(yīng)用代碼。Spring不會(huì)強(qiáng)迫你實(shí)現(xiàn)Spring規(guī)范的接口或繼承Spring規(guī)范的類,相反,在基于Spring構(gòu)建的應(yīng)用中,它的類通常沒有任何痕跡表明你使用了Spring。 最壞的場(chǎng)景是, 一個(gè)類或許會(huì)使用Spring注解, 但它依舊是POJO。

  任何一個(gè)有實(shí)際意義的應(yīng)用(肯定比Hello World示例更復(fù)雜) 都會(huì)由兩個(gè)或者更多的類組成, 這些類相互之間進(jìn)行協(xié)作來完成特定的業(yè)務(wù)邏輯。 按照傳統(tǒng)的做法, 每個(gè)對(duì)象負(fù)責(zé)管理與自己相互協(xié)作的對(duì)象(即它所依賴的對(duì)象) 的引用, 這將會(huì)導(dǎo)致高度耦合和難以測(cè)試的代碼。

  IOC聲明Bean

  首先創(chuàng)建的Maven Poject,詳細(xì)包結(jié)構(gòu)如下

  其中AOP會(huì)在下一篇進(jìn)行講解;

  Controller_.java

  /**

  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

  */

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  // TODO Auto-generated method stub

  response.getWriter().append("Served at: ").append(request.getContextPath());

  ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("/ApplicationContext.xml");

  Service_ s = (Service_) ctx.getBean("service_Impl1_new");

  System.out.println(s);

  s.show();

  }

  由于Spring無法單獨(dú)演示,所以Controller_.java是創(chuàng)建的是一個(gè)Servlet,直接調(diào)用doPost或者doGet方法,進(jìn)行Service的實(shí)現(xiàn),輸出Service_對(duì)象s,執(zhí)行show方法。

  Service_.java

  public interface Service_ {

  public void show();

  }

  創(chuàng)建一個(gè)Service接口,用來實(shí)現(xiàn)Spring。

  1.無參構(gòu)造方法聲明bean

  Service_Impl1.java

  public class Service_Impl1 implements Service_{

  public Service_Impl1() {

  // TODO Auto-generated constructor stub

  System.out.println("service1-無參構(gòu)造方法");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl1");

  }

  }

  重寫Service_的show方法輸出實(shí)現(xiàn)了Service_Impl1,編寫無參構(gòu)造方法。

  ApplicationContext.xml

  只需要設(shè)置id與class,class對(duì)應(yīng)Service_Impl1,id則是Controller_.java調(diào)用的getBean中的參數(shù)。運(yùn)行結(jié)果見自定義構(gòu)造方法注入bean。

  2.自定義構(gòu)造方法聲明bean

  Service_Impl2.java

  public class Service_Impl2 implements Service_{

  public Service_Impl2(int a) {

  // TODO Auto-generated constructor stub

  System.out.println("service2-自定義構(gòu)造參數(shù):"+a);

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl2");

  }

  }

  ApplicationContext.xml

  這是構(gòu)造方法中參數(shù)的設(shè)置,index顧名思義就是索引的意思,其中a參數(shù)是第0個(gè),value是參數(shù)的值。

  3.單實(shí)例 懶加載聲明bean

  Service_Impl3.java

  public class Service_Impl3 implements Service_{

  public Service_Impl3() {

  // TODO Auto-generated constructor stub

  System.out.println("service3-懶加載 單實(shí)例");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl3");

  }

  }

  ApplicationContext.xml

  lazy-init=“true” 設(shè)置懶加載,也就是調(diào)用的時(shí)候才會(huì)加載bean,不會(huì)自動(dòng)加載;scope=“singleton” 作用域標(biāo)簽,單實(shí)例也就是只創(chuàng)建一個(gè)實(shí)例。

  4.參數(shù)引用聲明bean

  Service_Impl4.java

  public class Service_Impl4 implements Service_{

  Service_ s3;

  public Service_ getS3() {

  return s3;

  }

  public void setS3(Service_ s3) {

  this.s3 = s3;

  }

  public Service_Impl4() {

  // TODO Auto-generated constructor stub

  System.out.println("service4-參數(shù)引用bean");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl4");

  }

  }

  ApplicationContext.xml

  參數(shù)標(biāo)簽,name是Service_Impl4中的參數(shù)s3,ref鏈接要引用的bean。

  5.初始化屬性聲明bean

  Service_Impl5.java

  public class Service_Impl5 implements Service_{

  String name;

  ArrayList list;

  HashMap map;

  HashSet set;

  @Override

  public int hashCode() {

  final int prime = 31;

  int result = 1;

  result = prime * result + ((list == null) ? 0 : list.hashCode());

  result = prime * result + ((map == null) ? 0 : map.hashCode());

  result = prime * result + ((name == null) ? 0 : name.hashCode());

  result = prime * result + ((set == null) ? 0 : set.hashCode());

  return result;

  }

  @Override

  public boolean equals(Object obj) {

  if (this == obj)

  return true;

  if (obj == null)

  return false;

  if (getClass() != obj.getClass())

  return false;

  Service_Impl5 other = (Service_Impl5) obj;

  if (list == null) {

  if (other.list != null)

  return false;

  } else if (!list.equals(other.list))

  return false;

  if (map == null) {

  if (other.map != null)

  return false;

  } else if (!map.equals(other.map))

  return false;

  if (name == null) {

  if (other.name != null)

  return false;

  } else if (!name.equals(other.name))

  return false;

  if (set == null) {

  if (other.set != null)

  return false;

  } else if (!set.equals(other.set))

  return false;

  return true;

  }

  @Override

  public String toString() {

  return "Service_Impl5 [name=" + name + ", list=" + list + ", map=" + map + ", set=" + set + "]";

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  public ArrayList getList() {

  return list;

  }

  public void setList(ArrayList list) {

  this.list = list;

  }

  public HashMap getMap() {

  return map;

  }

  public void setMap(HashMap map) {

  this.map = map;

  }

  public HashSet getSet() {

  return set;

  }

  public void setSet(HashSet set) {

  this.set = set;

  }

  public Service_Impl5() {

  // TODO Auto-generated constructor stub

  System.out.println("service5-初始化屬性");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl5");

  }

  }

  其中初始化參數(shù)有l(wèi)ist,map,set以及普通參數(shù),重寫了hashCode和equals方法,詳見HashMap內(nèi)存泄漏;重寫toString方法用來輸出初始化屬性。

  ApplicationContext.xml

  QQQ

  WWW

  111

  222鄭州哪個(gè)婦科醫(yī)院好 http://www.sptdfk.com/

  其中map標(biāo)簽內(nèi)使用進(jìn)行賦值。其他的正常使用property和value進(jìn)行賦值。

  6.初始化屬性引用方法返回值聲明bean

  Service_Impl6.java

  public class Service_Impl6 implements Service_{

  String s5_toString;

  public String getS5_toString() {

  return s5_toString;

  }

  public void setS5_toString(String s5_toString) {

  this.s5_toString = s5_toString;

  }

  public Service_Impl6() {

  // TODO Auto-generated constructor stub

  System.out.println("service6-調(diào)用方法返回值");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl6 返回值"+s5_toString);

  }

  }

  其中調(diào)用了Service_Impl5的toString方法并且進(jìn)行了輸出。

  ApplicationContext.xml

  固定用來聲明調(diào)用方法返回值。

  引用目標(biāo)的bean

  引用目標(biāo)的方法

  7.靜態(tài)工廠——聲明工廠bean

  Service_Impl7.java

  public class Service_Impl7 implements Service_{

  public static Service_ StaticFactory(int num) {

  switch (num) {

  case 1:

  return new Service_Impl1();

  case 2:

  return new Service_Impl2(100);

  case 3:

  return new Service_Impl3();

  case 4:

  return new Service_Impl4();

  case 5:

  return new Service_Impl5();

  default:

  return new Service_Impl6();

  }

  }

  public Service_Impl7() {

  // TODO Auto-generated constructor stub

  System.out.println("service7-靜態(tài)工廠");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl7");

  }

  }

  靜態(tài)工廠在實(shí)現(xiàn)類中使用了switch語句進(jìn)行模擬,靜態(tài)工廠在方法前加上static關(guān)鍵字,分別調(diào)用上面的其他實(shí)現(xiàn)類方法。

  ApplicationContext.xml

  使用構(gòu)造方法注入的方法來賦值 ;factory-method=“StaticFactory” ( factory-method工廠的方法名)

  8.實(shí)例工廠——聲明工廠bean

  Service_Impl8.java

  public class Service_Impl8 implements Service_{

  public Service_ factory1(int num) {

  switch (num) {

  case 1:

  return new Service_Impl1();

  case 2:

  return new Service_Impl2(100);

  case 3:

  return new Service_Impl3();

  case 4:

  return new Service_Impl4();

  case 5:

  return new Service_Impl5();

  default:

  return new Service_Impl6();

  }

  }

  public Service_Impl8() {

  // TODO Auto-generated constructor stub

  System.out.println("service8-實(shí)例工廠");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl8");

  }

  }

  ApplicationContext.xml

  創(chuàng)建實(shí)例工廠bean,首先創(chuàng)建一個(gè)實(shí)例工廠的bean,然后再創(chuàng)建一個(gè)工廠方法的bean去調(diào)用工廠的bean。

  調(diào)用的時(shí)候要調(diào)用工廠方法的bean,這里就要調(diào)用service_Impl8_new

  9.注解聲明bean

  @Service:用于標(biāo)注業(yè)務(wù)層組件

  @Controller:用于標(biāo)注控制層組件(如struts中的action)

  @Repository:用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件

  @Component(value="*"):泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注

  Service_Impl9.java

  @Service

  public class Service_Impl9 implements Service_{

  public Service_Impl9() {

  // TODO Auto-generated constructor stub

  System.out.println("service9-注解注入bean");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl9");

  }

  }

  @Service進(jìn)行bean的聲明(注解只能聲明無參構(gòu)造方法,使用注解默認(rèn)聲明的bean是類名的首字母小寫),這里聲明的bean的id應(yīng)該是service_Impl9。

  ApplicationContext.xml

  使用注解需要加上注解掃描,其中base-package是掃描的目錄,一般使用的是項(xiàng)目的根目錄,以后使用SpringMVC的話,就不用掃描Controller。

  注解寫入bean

  @Resource(name="" type="")bean寫入

  @Autowired/@Qualifier

  @inject/@named

到此,相信大家對(duì)“Spring IOC的bean聲明方式有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI