Spring基礎之 IOC九種bean宣告方式

ckxllf發表於2019-12-12

  Spring簡介

  Spring不是服務於開發web專案的功能,或業務。而是服務於專案的開發,方便各層間的解耦呼叫,方便對類的批次管理,是提高軟體開發效率,降低後期維護成本的框架。

  Spring的核心思想是IOC(控制反轉),AOP(切面程式設計)兩點。

  IOC:即不再需要程式設計師去顯式地New一個物件,而是把Spring框架把框架建立出的物件拿來用。因為是spring框架建立的物件,物件都在spring框架物件中儲存,亦稱為spring容器,這樣spring就知道當前專案中都建立了哪些物件,這個物件歸屬於那一層,該如何管理。想使用spring的其他功能第一點就是要用spring的物件,也稱為將控制權交給spring管理。

  AOP:對某種路徑下的所有類,或有共同特性的類或方法統一管理,在原任務執行的前後,加入新功能。做出監控,初始化,整理,銷燬等一系列統一的伴隨動作。

  如果你從事Java程式設計有一段時間了, 那麼你或許會發現(可能你也實際使用過) 很多框架透過強迫應用繼承它們的類或實現它們的介面從而導致應用與框架綁死。這種侵入式的程式設計方式在早期版本的Struts以及無數其他的Java規範和框架中都能看到。Spring竭力避免因自身的API而弄亂你的應用程式碼。Spring不會強迫你實現Spring規範的介面或繼承Spring規範的類,相反,在基於Spring構建的應用中,它的類通常沒有任何痕跡表明你使用了Spring。 最壞的場景是, 一個類或許會使用Spring註解, 但它依舊是POJO。

  任何一個有實際意義的應用(肯定比Hello World示例更復雜) 都會由兩個或者更多的類組成, 這些類相互之間進行協作來完成特定的業務邏輯。 按照傳統的做法, 每個物件負責管理與自己相互協作的物件(即它所依賴的物件) 的引用, 這將會導致高度耦合和難以測試的程式碼。

  IOC宣告Bean

  首先建立的Maven Poject,詳細包結構如下

  其中AOP會在下一篇進行講解;

  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無法單獨演示,所以Controller_.java是建立的是一個Servlet,直接呼叫doPost或者doGet方法,進行Service的實現,輸出Service_物件s,執行show方法。

  Service_.java

  public interface Service_ {

  public void show();

  }

  建立一個Service介面,用來實現Spring。

  1.無參構造方法宣告bean

  Service_Impl1.java

  public class Service_Impl1 implements Service_{

  public Service_Impl1() {

  // TODO Auto-generated constructor stub

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

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl1");

  }

  }

  重寫Service_的show方法輸出實現了Service_Impl1,編寫無參構造方法。

  ApplicationContext.xml

  只需要設定id與class,class對應Service_Impl1,id則是Controller_.java呼叫的getBean中的引數。執行結果見自定義構造方法注入bean。

  2.自定義構造方法宣告bean

  Service_Impl2.java

  public class Service_Impl2 implements Service_{

  public Service_Impl2(int a) {

  // TODO Auto-generated constructor stub

  System.out.println("service2-自定義構造引數:"+a);

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl2");

  }

  }

  ApplicationContext.xml

  這是構造方法中引數的設定,index顧名思義就是索引的意思,其中a引數是第0個,value是引數的值。

  3.單例項 懶載入宣告bean

  Service_Impl3.java

  public class Service_Impl3 implements Service_{

  public Service_Impl3() {

  // TODO Auto-generated constructor stub

  System.out.println("service3-懶載入 單例項");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl3");

  }

  }

  ApplicationContext.xml

  lazy-init=“true” 設定懶載入,也就是呼叫的時候才會載入bean,不會自動載入;scope=“singleton” 作用域標籤,單例項也就是隻建立一個例項。

  4.引數引用宣告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-引數引用bean");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl4");

  }

  }

  ApplicationContext.xml

  引數標籤,name是Service_Impl4中的引數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");

  }

  }

  其中初始化引數有list,map,set以及普通引數,重寫了hashCode和equals方法,詳見HashMap記憶體洩漏;重寫toString方法用來輸出初始化屬性。

  ApplicationContext.xml

  QQQ

  WWW

  111

  222 鄭州哪個婦科醫院好

  其中map標籤內使用進行賦值。其他的正常使用property和value進行賦值。

  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-呼叫方法返回值");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

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

  }

  }

  其中呼叫了Service_Impl5的toString方法並且進行了輸出。

  ApplicationContext.xml

  固定用來宣告呼叫方法返回值。

  引用目標的bean

  引用目標的方法

  7.靜態工廠——宣告工廠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-靜態工廠");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl7");

  }

  }

  靜態工廠在實現類中使用了switch語句進行模擬,靜態工廠在方法前加上static關鍵字,分別呼叫上面的其他實現類方法。

  ApplicationContext.xml

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

  8.例項工廠——宣告工廠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-例項工廠");

  }

  @Override

  public void show() {

  // TODO Auto-generated method stub

  System.out.println("Service_Impl8");

  }

  }

  ApplicationContext.xml

  建立例項工廠bean,首先建立一個例項工廠的bean,然後再建立一個工廠方法的bean去呼叫工廠的bean。

  呼叫的時候要呼叫工廠方法的bean,這裡就要呼叫service_Impl8_new

  9.註解宣告bean

  @Service:用於標註業務層元件

  @Controller:用於標註控制層元件(如struts中的action)

  @Repository:用於標註資料訪問元件,即DAO元件

  @Component(value="*"):泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註

  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進行bean的宣告(註解只能宣告無參構造方法,使用註解預設宣告的bean是類名的首字母小寫),這裡宣告的bean的id應該是service_Impl9。

  ApplicationContext.xml

  使用註解需要加上註解掃描,其中base-package是掃描的目錄,一般使用的是專案的根目錄,以後使用SpringMVC的話,就不用掃描Controller。

  註解寫入bean

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

  @Autowired/@Qualifier

  @inject/@named


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2668234/,如需轉載,請註明出處,否則將追究法律責任。

相關文章