1. 程式人生 > >Spring框架入門(一)簡介及三種基本注入方式例項

Spring框架入門(一)簡介及三種基本注入方式例項

目錄

1介面注入

2設值注入

配置:導包

配置檔案:

測試類:

配置檔案:

Test:

一、基本含義

Spring框架主要降低程式的耦合性,耦合性的意思為實現介面和實現類之間的關聯性,Spring框架用的實現類是利用配置檔案配置進去。Spring引領了javaEE的方向是一種輕量級J2EE應用開發框架。

主要構成:依賴注入容器 和AOP實現。

在學習了三個框架之後Struts2,Hibernate框架分別是對檢視層和直流層的操作,而Spring框架負責將兩個框架的內容進行配置。

什麼是loc?

Inversion of Control。控制反轉,指的是將傳統程式設計方式中的程式依賴關係的控制錢從程式內部轉移到程式外部,執行程式設計師從程式邏輯中分離出對具體實現的依賴和管理,修改依賴關係只需要修改配置檔案。將程式碼中的控制例項方法轉移到程式外面。

為什麼要使用Spring框架?

改變實現類的時候,如果在實現介面的實現類中多次更改,會使編譯器多次編譯多個class檔案,現在將依賴關係加入配置檔案,只需要生成一個class檔案,配置檔案中提供什麼實現類就用什麼實現類。

ssh框架的整體作用分別為:

Struts:

Struts把Servlet、JSP、自定義標籤和資訊資源(message resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再自己編碼實現全套MVC模式,極大的節省了時間,是一種基於MVC模式的,就是模式—檢視—控制器的程式設計框架,起到輔助程式設計設計的作用,將java程式分成了JavaBean, servlet, JavaAction, JSP.

Hibernate:

Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任。

Spring: 
Spring提供了一個用標準Java語言編寫的AOP框架,還提供了可以和IoC容器整合的強大而靈活的MVC Web框架。它的IOC思想和AOP思想解決了類與類之間的強偶合問題。

struts主要負責表示層的顯示 
spring利用它的IOC和AOP來處理控制業務(負責對資料庫的操作) 
hibernate主要是資料的持久化到資料庫

二、提供三種注入方式

1介面注入

方法呼叫者通過方法引數提供一個介面的實現類

public class DemoAction{

public void execute(PersonLogic person){

system.out.println(person.sayHello());

}

}

呼叫方法時從外部注入所以來的元件



DemoAction action=nwe DemoAction();

PersonLogic person =nwe PersonLogicEnImpl();

action.execute(person);

2設值注入

藉助javaBean設計方法,把業務處理物件所依賴的其他元件通過setter方法傳遞進來。

public class Teacher implements Person {
	private TeachService service;
	public Teacher(TeachService service) {
		super();
		this.service = service;
	}
	@Override
	
	public String sayHello() {
		// TODO Auto-generated method stub
		return "Hello,I am a teacher";
	}
	@Override
	public String provideTeachingService() {
		// TODO Auto-generated method stub
		return service.provideTeachingService();
	}
/**
 * 	使用構造注入/serrer方法/java註解   
 */

	public TeachService getService() {
		return service;
	}

	public void setService(TeachService service) {
		this.service = service;
	}
	
}

3構造引數注入

在業務處理物件初始化的階段,就將所依賴的其他元件通過構造方法設定好,在初始化階段完成之後,就可以直接得到一個完整的業務物件直接使用。

public class Student implements Person{
	
	
	
	private TeachService teachingService;
	
	public Student(){
		
		System.out.println("學生的構造方法");
		
	}
	
	@Override
	public String sayHello() {
		// TODO Auto-generated method stub
		return "你好,我是學生";
	}

	@Override
	public String provideTeachingService() {
		// TODO Auto-generated method stub
		return "我們一起學貓叫";
	}

	public TeachService getTeachingService() {
		return teachingService;
	}

	public void setTeachingService(TeachService teachingService) {
		this.teachingService = teachingService;
	}

}

三、Spring例項操作流程

配置:導包

配置檔案:applicationContext.xml

將beans.xml檔案的xml匯入類似於在xml檔案中建立bean物件。

缺少提示需要找xsd檔案,找到spring-beans.xsd檔案匯入到web-inf,和匯入dtd方法相同,將url更改為Namespaces name選項

書寫介面。

Test1:常規介面注入

public interface Ifruit {

     public void eat();

}

定義注入依賴的類:

package com.it.spring;

public class Apple  implements Ifruit {

     @Override

     public void eat() {

          // TODO Auto-generated method stub

          System.out.println("吃蘋果");

     }

}

package com.it.spring;

public class Banana  implements Ifruit {

     @Override

     public void eat() {

          // TODO Auto-generated method stub

          System.out.println("吃香蕉");

     }

}

第一種我們的常規方法是在測試類中例項化一個Apple,實現一個向下轉型:    

 Ifruit fruit=new Apple();

        fruit.eat();

我們使用spring框架主要在配置檔案applicationContext.xml檔案中將所要使用到的Bean加入到配置檔案當中:

<bean id="fruit" class="com.it.spring.Apple"></bean>

將需要的呼叫的實體類的地址寫入class中,再設定name,name在Test中呼叫。

ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

          Ifruit fruit=(Ifruit)ac.getBean("fruit");

          fruit.eat();

即可在只編譯一次就可以將結果完成,如果要修改實體類配置檔案中需改路徑即可。這就是Spring框架的核心思想,配置檔案向java編譯器傳什麼值就執行什麼,將想要改變的實體從java檔案內部拿出來放在xml配置檔案中,大大降低了程式的耦合性。

Test2:值注入

定義注入依賴的類:

package com.it.spring2;

public class Sing {

     
      private Song song;

     public Song getSong() {

          return song;

     }

     public void setSong(Song song) {

          this.song = song;

     }

     public void startSing() {
 

          System.out.println("唱了一首"+song.getSongName());

          
     }

}

package com.it.spring2;

public class Song {

       private String songName;

     public String getSongName() {

          return songName;

     }

     public void setSongName(String songName) {

          this.songName = songName;

     }
     

}

配置檔案:

<bean id="song1"  class="com.it.spring2.Song">

  <property name="songName" value="莉莉安"></property>

  </bean>

  <bean id="sing" class="com.it.spring2.Sing">

  <property name="song" ref="song1"></property>

  </bean>

注:上面property中的value為歌曲名稱,下面ref中表示sing類中傳入的值為song1的value。意思將唱歌動作和唱歌內容兩個方法通過配置檔案中的property進行關聯。

測試類:

public class Test {



    public static void main(String[] args) {

        
   ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

     Sing sing=(Sing)ac.getBean("sing");
       
        sing.startSing();

       
    }
   

}

這個程式中使用到了第二種方式:設值注入,唱歌的內容songName通過set方法進行傳遞。

Test3:構造注入

定義注入依賴的介面:

package com.it.spring3;

public interface Person {

		public String sayHello();
		public String provideTeachingService();
}
package com.it.spring3;

public interface TeachService {

	
		public String provideTeachingService();
}

實現類Teacher和SwimmingTeachService:

package com.it.spring3;

public class Teacher implements Person {
	
	
	private TeachService service;
	public Teacher(TeachService service) {
		super();
		this.service = service;
	}
	@Override
	
	public String sayHello() {
		// TODO Auto-generated method stub
		return "Hello,I am a teacher";
	}

	

	@Override
	public String provideTeachingService() {
		// TODO Auto-generated method stub
		return service.provideTeachingService();
	}

	public TeachService getService() {
		return service;
	}

	public void setService(TeachService service) {
		this.service = service;
	}
	
	
	
}
package com.it.spring3;

public class SwimmingTeachService  implements TeachService{

	@Override
	public String provideTeachingService() {
		// TODO Auto-generated method stub
		return "I provide service of teaching swimming";
	}

}

配置檔案:

構造注入要是用constructor-arg的標籤。

<bean id="thePerson"  class="com.it.spring3.Teacher">
  <constructor-arg ref="theService1"></constructor-arg>
  </bean>
  <bean id="theService1" class="com.it.spring3.SwimmingTeachService"></bean>

Test:

public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person=(Person)ac.getBean("thePerson",Person.class);
		System.out.println(person.sayHello());
		System.out.println(person.provideTeachingService());
		
	}

本例使用了構造注入的注入方式,主要程式碼在Teacher實現類中的構造方法中進行實現。

Test4:setter注入

定義注入依賴的類Student:

注意事項 詳細
no1 setter方法需要有預設的構造方法
no2 set函式的變數名的大小寫規範
package com.it.spring3;

public class Student implements Person{
	
	
	
	private TeachService teachingService;
	
	public Student(){
		
		System.out.println("學生的構造方法");
		
	}
	
	@Override
	public String sayHello() {
		// TODO Auto-generated method stub
		return "你好,我是學生";
	}

	@Override
	public String provideTeachingService() {
		// TODO Auto-generated method stub
		return "我們一起學貓叫";
	}

	public TeachService getTeachingService() {
		return teachingService;
	}

	public void setTeachingService(TeachService teachingService) {
		this.teachingService = teachingService;
	}

}

配置spring設定檔案:

注意事項 詳細
no1 ref和bean id的一致
no2 property name和setter物件的一致
 <bean  id="thePerson" class="com.it.spring3.Student">
 <property name="teachingService" ref="theService"></property>
 </bean>
  <bean id="theService" class="com.it.spring3.SwimmingTeachService"></bean>

測試類不變。

  1. 七月 31, 2018 11:13:28 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
     
  2. 資訊: Refreshing org[email protected]421faab1: startup date [Tue Jul 31 11:13:28 CST 2018]; root of context hierarchy
  3. 七月 31, 2018 11:13:28 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. 資訊: Loading XML bean definitions from class path resource [applicationContext.xml]
  5. 七月 31, 2018 11:13:29 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. 資訊: Pre-instantiating singletons in org.s[email protected]1554909b: defining beans [fruit,song1,sing,thePerson,theService]; root of factory hierarchy
  7. 學生的構造方法
  8. 你好,我是學生
  9. 我們一起學貓叫

相關推薦

Spring框架入門()簡介基本注入方式例項

目錄 1介面注入 2設值注入 配置:導包 配置檔案: 測試類: 配置檔案: Test: 一、基本含義 Spring框架主要降低程式的耦合性,耦合性的意思為實現介面和實現類之間的關聯性,S

使用Spring框架入門:基於XML配置的IOC/DI的使用

測試結果 plugins rac prepare lombok ray instance private mls 一、Spring框架   1、方法一:逐項導入基礎依賴包:     spring-core、spring-beans、spring-context、s

spring框架入門()

一 spring框架簡介: spring是一個輕量級的開源框架,其主要優勢就是其分層架構。分層架構允許使用者選擇使用哪一個元件,在JavaEE開發中,它可以有選擇的整合web層,持久層的相關框架。同時

SSM框架Spring-IoC和DI的理解與常用注入方式

SSM 框架學習 (Spring篇) 一、IoC和DI IoC(Inversion of Control)控制反轉Spring兩大核心之一,是一種不同於傳統的設計思想。 那何來控制反轉一說呢?我們先看傳統的Java程式設計,當我們一個類內部需要一個物

資料歸方法(python)

資料標準化(歸一化)處理是資料探勘的一項基礎工作,不同評價指標往往具有不同的量綱和量綱單位,這樣的情況會影響到資料分析的結果,為了消除指標之間的量綱影響,需要進行資料標準化處理,以解決資料指標之間的可比性。原始資料經過資料標準化處理後,各指標處於同一數量級,適合進行綜合對比評價。以下是三種常用的歸一化方法:m

二叉樹的建立遍歷方式詳解

建立一個如下圖所示的二叉樹 程式如下: #include<stdio.h> #include<stdlib.h> //定義二叉樹 typedef struct _tree_node { char date; struct tree_node

深入淺出spring IOC中依賴注入方式

首先:第一個問題,參與者都有誰?1)物件2)IOC/DI容器3)某個物件的外部資源第二問題:依賴,誰依賴誰?為什麼需要依賴?依賴嘛,很好理解的,物件依賴於IOC/DI容器,至於為什麼要依賴呢?物件需要IOC/DI容器來提供物件需要的外部資源。第三個問題:注入,誰注入誰?又注入了什麼呢?顯而易見是IOC/DI容

Spring IOC(控制反轉)的依賴注入方式

1)、什麼是依賴注入(DI)和控制反轉(IOC) 依賴注入和控制反轉是對同一件事情的不同描述,從某個方面來講,就是他們描述的角度不同。 依賴注入是從應用程式的角度在描述,應用程式依賴容器建立並注入它所需要的外部資源; 控制反轉是從容器的角度在描述,描述完整點:容器控制應用程式,由容器反向的嚮應

二叉樹的常見方法遍歷方式 Java 實現

讀完本文你將瞭解到: 樹的分類有很多種,但基本都是 二叉樹 的衍生,今天來學習下二叉樹。 什麼是二叉樹 Binary Tree 先來個定義: 二叉樹是有限個節點的集合,這個集合可以是空集,也可以是一個根節點和至多兩個子二叉樹組成的集合,其中一顆樹叫做根的左子樹,另一棵叫做根的右子樹。

控制反轉IOC的依賴注入方式 【調侃】IOC前世今生 IoC模式 談談對Spring IOC的理解 一個簡單的小程式演示Unity的三種依賴注入方式 小菜學習設計模式(五)—控制反轉(Ioc) IoC模式(依賴、依賴倒置、依賴注入、控制反轉) IoC模式

轉自:https://www.cnblogs.com/ysyn/p/5563256.html 引言:    專案中遇到關於IOC的一些內容,因為和正常的邏輯程式碼比較起來,IOC有點反常。因此本文記錄IOC的一些基礎知識,並附有相應的簡單例項,而在實際專案中再複雜的應用也只是在

spring IOC中依賴注入方式 經典總結

首先:第一個問題,參與者都有誰?1)物件2)IOC/DI容器3)某個物件的外部資源第二問題:依賴,誰依賴誰?為什麼需要依賴?依賴嘛,很好理解的,物件依賴於IOC/DI容器,至於為什麼要依賴呢?物件需要IOC/DI容器來提供物件需要的外部資源。第三個問題:注入,誰注入誰?又注入了什麼呢?顯而易見是IOC/DI容

Spring依賴注入方式

平常的java開發中,程式設計師在某個類中需要依賴其它類的方法,則通常是new一個依賴類再呼叫類例項的方法,這種開發存在的問題是new的類例項不好統一管理,spring提出了依賴注入的思想,即依賴類不由程式設計師例項化,而是通過spring容器幫我們new指定例項並且將例項

spring常用注入方式的測試與總結

spring三種常用注入方式 setter方法注入 欄位注入(註解實現) 構造器注入 1、setter方法注入 建立一個介面: public interface Axe { public String chop();

Spring學習(十八)Bean 的依賴注入方式介紹

依賴注入:讓呼叫類對某一介面實現類的依賴關係由第三方注入,以移除呼叫類對某一介面實現類的依賴。 接下來將詳細的向大家介紹Spring容器支援的三種依賴注入的方式以及具體配置方法: •    屬性注入方

Spring-依賴注入方式

            三種依賴注入方式,即構造方法注入(constructor injection),setter方法注入(setter injection)以及介面注入(interface inj

Springbean注入方式

(http://glzaction.iteye.com/blog/1299441) Spring中依賴注入有三種注入方式: 一、構造器注入; 二、設值注入(setter方式注入); 三、Feild方式注入(註解方式注入)。 一、構造器注入      構造器

GC 的基本實現方式

參考資料《程式碼的未來》(作者: [日] 松本行弘)。 由於並非本人原著(我只是個“搬運工“),SO 未經本人允許請盡情轉載。 另外個人像說明一下這裡所說的GC指泛指垃圾回收機制,而單指Java或其他某種特定語言中的GC——可能具體語言中實現的垃圾回收實現機制會有所不

Spring的四依賴注入方式例項

// 第三種方式,靜態工廠方式,在工廠類中返回靜態IOCFactory物件 public void setIOCdependency(IOCdependency iocdenpendency) { this.IOCdependency = iocdenpendency; }與上面兩個方法不同,這次在配置檔案中

Spring框架入門教程()——框架簡介

介紹 Spring是一個分層的(一站式) 輕量級開源框架 Spring的核心是控制反轉(IoC)和麵向切面(AOP) 為什麼說分層一站式呢? javaEE分三層開發 WEB層,業務層,持久層。在ssh整合框架中s == Struts2, s == spring,h

spring框架入門--方式配置Bean

spring框架的核心在於“Ioc控制反轉”“DI依賴注入”以及“AOP面向切面程式設計”,所以在實現這些核心是最基礎的一步即為在ioc容器中配置bean標籤,因為我們獲取物件是通過獲取bean 來獲得的,所以配置好bean,要用物件時我們才能想用就拿.今天查看