spring入門

Spring簡介

  • Spring 是一個開放源代碼的框架。
  • Spring爲簡化企業級應用開發而生,使用spring可以使簡單的javaBean實現以前只有EJB才能實現的功能。
  • Spring是一個IOC(DI)、AOP容器框架。
  • Spring是一個一站式的開發框架。

 

 

  Spring是輕量級的框架

輕量級:Spring是非侵入性的-基於Spring開發的應用中的對象可以不依賴於Spring的API。(不用繼承或實現接口)。

  控制反轉(DI—dependency injection、IOC—Inversion of Control) 

當應用了IOC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建(不需要自己去new對象)。

  AOP(Aspect Oriented Programming :AOP編程的支持) 

通過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應付。

  聲明式事務的支持 

在Spring中,我們可以從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。

  方便程序的測試

可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring裏,測試不再是昂貴的操作,而是隨手可做的事情。例如:Spring對Junit4支持,可以通過註解方便的測試Spring程序

  方便集成各種優秀框架

簡化各種框架的使用難度,Spring提供了對各種優秀框架(如Struts,Hibernate、Mybatis、Quartz)等的直接支持。

 

 Spring的模塊架構圖

 

每個模塊的功能如下:

  • l  核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉(IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開
  • l  Spring 上下文:Spring 上下文是一個配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企業服務,例如JNDI、EJB、電子郵件、國際化、校驗和調度功能。
  • l  Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中
  • l  Spring DAO:JDBCDAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
  • l  Spring ORM:Spring 框架插入了若干個ORM框架,從而提供了 ORM 的對象關係工具,其中包括JDO、Hibernate和Mybatis。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
  • l  Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。所以,Spring框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
  • l  Spring MVC 框架:MVC框架是一個全功能的構建 Web應用程序的 MVC 實現。

 

 


 

Spring的入門小demo

1. 創建maven  web工程

2. 解決web工程的兩個問題

    •  jdk版本過低問題
    • 丟失web.xml的問題

3. 導入我們工程必須的jar包

複製代碼
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.4.RELEASE</version>
  </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.4.RELEASE</version>
  </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.4.RELEASE</version>
  </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.2.4.RELEASE</version>
  </dependency>

</dependencies>
複製代碼

 

4. 創建接口及實現類

接口:

public interface IUserDao {

    public void sayHello();
}

實現類:

複製代碼
public class UserDaoImpl implements IUserDao {
    private String username;
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public void sayHello() {
        System.out.println("hello " + username);
    }
}
複製代碼

 

5. 創建spring容器的核心配置文件applicationContext.xml

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="userDaoImpl" class="spring.spring01.demo1.UserDaoImpl">
        <property name="username" value="spring"></property>
    </bean>
</beans>
複製代碼

 

6. 編寫測試代碼

複製代碼
public class UserDaoTest {
    @Test
    public void test() throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserDao bean = (IUserDao) context.getBean("userDaoImpl");
        bean.sayHello();
    }
}
複製代碼

 


 


 

spring容器的概念及三種創建方式

核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉(IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。

 

 

Ⅰ.  XmlBeanFactory來獲取容器類

使用XmlBeanFactory來獲取我們的beanFactory(已經過期,不建議使用)

 

複製代碼
/**
     * 第一種方式:    使用XmlBeanFactory的方式來獲取容器類(已過期,不建議使用)
     * XmlBeanFactory需要傳入一個配置文件的路徑,這個配置文件就是spring的配置文件
     * spring默認的配置文件是applicationContext.xml
     */
    @Test
    public void test01() throws Exception {
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        
        Class<? extends BeanFactory> class1 = factory.getClass();
        
        System.out.println(class1);
        //結果:class org.springframework.beans.factory.xml.XmlBeanFactory
    }
複製代碼

 

 

 

Ⅱ.  ClassPathXmlApplicationContext獲取容器類

從類路徑下加載配置文件:

複製代碼
/**
     * 第二種方式:ClassPathXmlApplicationContext
     */
    @Test
    public void test02() throws Exception {
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        Class<? extends BeanFactory> class1 = factory.getClass();
        
        System.out.println(class1);
        //結果:class org.springframework.context.support.ClassPathXmlApplicationContext
    }
複製代碼

 

Ⅲ.  FileSystemXmlApplicationContext來獲取容器

從文件系統中加載配置文件:

複製代碼
/**
     * 第三種方式:FileSystemXmlApplicationContext
     * 注意:這種方式需要傳入配置文件的絕對路徑
     * 可以使用外部的配置文件
     */
    @Test
    public void test03() throws Exception {
        BeanFactory factory = new FileSystemXmlApplicationContext("D:\\source\\Web\\maven\\springStart\\src\\main\\resources\\applicationContext.xml");
        
        Class<? extends BeanFactory> class1 = factory.getClass();
        
        System.out.println(class1);
        //結果:class org.springframework.context.support.FileSystemXmlApplicationContext
    }
複製代碼

 


 


 

 

 

IOC

 

IOC:inversion  of  control 控制反轉:說白了就是將創建對象的過程或者說創建對象的權限交給了spring框架來幫我們處理,我們再不用通過new的方式來創建Javabean對象,這個過程就叫做控制反轉。

DI:dependency injection 依賴注入: 就是組件以一些預先定義好的方式(例如: setter 方法)接受來自如容器的資源注入。說白了就是使用spring框架爲我們的JavaBean的屬性賦值的過程。

 

· 默認構造器創建對象

創建bean

複製代碼
public class UserBean {

    private String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
    
    public void show(){
        System.out.println("show method is invoked!");
    }
}
複製代碼

配置配置文件

複製代碼
  <!--
        id:唯一標識
        class:創建對象的類路徑
        
        通過反射創建userBean對象
     -->
    <bean id="userBean" class="spring.ioc.UserBean">
        <property name="info" value="this is userBean... ... "></property>
    </bean>
複製代碼

注意:Class:bean的全類名,通過反射的方式在IOC容器中創建Bean,所以要求Bean中必須有無參的構造器。

Id:標識容器中的bean,id唯一。

 

  從容器中獲取我們的UserBean對象

複製代碼
  /**
     * 默認構造器創建對象
     */
    @Test
    public void iocTest() throws Exception {
        /**
         * 1、創建spring容器
         * 2、從容器中獲取userBean的對象
         * 3、調用userBean的方法
         */
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-ioc.xml"); 
        UserBean bean = (UserBean) applicationContext.getBean("userBean");
        bean.show(); 
        System.out.println(bean.getInfo());
    }
複製代碼

 

· 靜態工廠創建對象

調用靜態工廠方法創建Bean是將對象創建的過程封裝到靜態方法中。當客戶端需要對象時,只需要簡單地調用靜態方法,而不用關心創建對象的細節(往往使用工廠方法就是爲了應對創建對象比較複雜的情況)。

創建bean

複製代碼
public class Car {

    private String brand;
    
    private Integer price;
        ...
        // get、set方法,有參、無參構造器
}    
複製代碼

 

創建靜態工廠

複製代碼
/**
 * 靜態工廠:創建對象的方式,調用靜態方法的方式
 */
public class StaticCarFactory {

    private static Map<String, Car> cars = new HashMap<>();
    
    static{
        cars.put("奧迪", new Car("audiA8",100000));
        cars.put("寶馬", new Car("bmw",500000));
    }
    
    public static Car getCar(String brand){
        return cars.get(brand);
    }
}
複製代碼

 

  配置配置文件

複製代碼
   <!-- 
        id:唯一標識
        class:靜態工廠的class路徑
        factory-method:靜態工廠方法
     -->
     <bean id="car" class="spring.ioc.StaticCarFactory" factory-method="getCar">
         <!-- 如果工廠方法需要參數,通過constructor-arg傳遞參數 -->
         <constructor-arg value="奧迪"></constructor-arg>
     </bean>
複製代碼

 

  編寫測試代碼

複製代碼
  /**
     * 靜態工廠創建對象
     */
    @Test
    public void staticFactoryTest() throws Exception {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-ioc.xml");       
        Car bean = (Car) applicationContext.getBean("car");
        System.out.println(bean);       
    }
複製代碼

 

 

· 實例工廠創建對象

 

實例工廠方法:將對象的創建過程封裝到另外一個對象實例的方法裏。當客戶端需要請求對象時,只需要簡單的調用該實例方法而不需要關心對象的創建細節(往往使用工廠方法就是爲了應對創建對象比較複雜的情況)。

 

創建bean

 

複製代碼
public class Car {

    private String brand;
    
    private Integer price;
        ...
        // get、set方法,有參、無參構造器
}  
複製代碼

 

創建靜態工廠

 

複製代碼
public class InstanceCarFactory {
    private Map<String, Car> cars = null;

    public InstanceCarFactory() {
        cars = new HashMap<String,Car>();    
        cars.put("one", new Car("小天", 100));
        cars.put("two", new Car("大波", 50));
    }
    
    public Car getCar(String brand){
        return cars.get(brand);
    }    
}
複製代碼

 

  配置配置文件

 

複製代碼
    <!-- 
         首先創建實例工廠,才能創建javaBean
      -->
      <bean id="instanceCarFactory" class="spring.ioc.InstanceCarFactory"></bean>
      <bean id="car" factory-bean="instanceCarFactory" factory-method="getCar">
          <!-- 如果工廠方法需要參數,通過constructor-arg傳遞參數 -->
         <constructor-arg value="one"></constructor-arg>
      </bean>
複製代碼

 

  編寫測試代碼

複製代碼
  /**
     * 實例工廠創建對象
     */
    @Test
    public void instanceFactoryTest() throws Exception {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-ioc.xml");
        Car bean = (Car) applicationContext.getBean("car");
        System.out.println(bean);
    }
複製代碼

 



Bean的作用域

默認情況下,Spring只爲每個在IOC容器裏聲明的Bean創建唯一一個實例(singleton),整個IOC容器範圍內都可共享該實例:所有後續的getBean()調用和Bean引用都將返回這個唯一的Bean實例。該作用域被稱爲singleton,它是所有Bean的默認作用域。

在Spring中,可以在< bean>元素的scope屬性裏設置Bean的作用域。默認有四種取值:

Singleton、prototype、request、session

singleton:默認值,容器初始化是創建bean實例,在整個容器的生命週期內只創建這一個bean,單例的。

prototype:原型的,容器初始化時不創建bean的實例,而在每次請求時都創建一個新的Bean實例,並返回。

Bean的生命週期

         

SpringIOC容器可以管理Bean的生命週期,Spring允許在Bean生命週期的特定點執行定製的任務。

Spring IOC容器對Bean的生命週期進行管理的過程:

    • 通過構造器或工廠方法創建Bean實例
    • 爲Bean的屬性設置值和對其他Bean的引用set()
    • 調用Bean的初始化方法init()
    • 使用Bean的方法get()
    • 當容器關閉時,調用Bean的銷燬方法destory()


 

DI

 

set方法注入

通過setter方法注入Bean的屬性值或依賴的對象。 

對應的實體類中一定要有gettersetter方法,如果寫了帶參的構造器,

一定要有無參構造器,因爲容器用此方法創建對象時會調用空參的構造器

 

    使用< property>元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 子節點指定屬性值,如果是依賴對象類型,就使用ref屬性。

 

 構造器注入

    通過構造方法注入Bean 的屬性值或依賴的對象。

    

    配置使用p和c命名空間配置javabean

  

 

    配置帶集合屬性的Javabean

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章