天天看點

ssh備考-07 搭建spring架構環境

目錄

​​一、搭建簡單spring架構​​

​​1、建立項目,導入jar包​​

​​2、編寫service層接口與實作類​​

​​UserService.java​​

​​UserServiceImpl.java​​

​​3、編寫spring核心配置檔案 applicationContext.xml  (應用程式上下文配置檔案)​​

​​applicationContext.xml​​

​​4、編寫測試程式​​

​​Demo1.java​​

​​二、詳細學習​​

​​1.applicationContext.xml中标簽的配置​​

​​bean标簽詳解​​

​​2.依賴注入DI​​

​​a.簡單示範注入String類型的屬性​​

​​2.service中依賴注入一個dao​​

​​其他注入方式(了解)​​

今日資料下載下傳: ​​直接下載下傳spring01.zip​​​       ​​網盤備份下載下傳​​

一、搭建簡單spring架構

1、建立項目,導入jar包

ssh備考-07 搭建spring架構環境
ssh備考-07 搭建spring架構環境

2、編寫service層接口與實作類

ssh備考-07 搭建spring架構環境

UserService.java

package cn.ahpu.service;

public interface UserService {
  public void sayHello();
}      

UserServiceImpl.java

package cn.ahpu.service;

public class UserServiceImpl implements UserService {

  @Override
  public void sayHello() {
    System.out.println("Hello Spring!!");
  }

}      

3、編寫spring核心配置檔案 applicationContext.xml  (應用程式上下文配置檔案)

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标簽配置需要由spring建立并管理的類  -->
  <bean id="userService" class="cn.ahpu.service.UserServiceImpl"></bean>
   
</beans>      

4、編寫測試程式

ssh備考-07 搭建spring架構環境

Demo1.java

package cn.ahpu.Test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ahpu.service.UserService;
import cn.ahpu.service.UserServiceImpl;

/**
 * 測試IOC的程式  以後會由action調用service
 * @author 軟體163韓竹安
 * 2019年12月25日-下午1:19:54
 */
public class Demo1 {
  //原來方式
  @Test
  public void run1(){
    UserService us=new UserServiceImpl();
    us.sayHello();
  }
  
  //新方式要寫配置檔案
  
  //spring架構的方式
  @Test
  public void run2(){
    //建立工廠,加載核心配置檔案 (一加載工廠就會幫你建立配置了的對象)
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//classPath表示加載src路徑下的檔案
    //從工廠擷取對象    ac.getBean("id值")
    UserService usi = (UserService) ac.getBean("userService");
    //調用對象方法執行
    usi.sayHello();
  }
  
}      
ssh備考-07 搭建spring架構環境

二、詳細學習

1.applicationContext.xml中标簽的配置

bean标簽詳解

1. id屬性和name屬性的差別 (id不可出現特殊字元   name可以出現特殊字元)
  * id    -- Bean起個名字,在限制中采用ID的限制,唯一
    * 取值要求:必須以字母開始,可以使用字母、數字、連字元、下劃線、句話、冒号  id:不能出現特殊字元
  
  * name    -- Bean起個名字,沒有采用ID的限制(了解)
    * 取值要求:name:出現特殊字元.如果<bean>沒有id的話 , name可以當做id使用
    * Spring架構在整合Struts1的架構的時候,Struts1的架構的通路路徑是以/開頭的,例如:/bookAction

2. class屬性      -- Bean對象的全路徑
3. scope屬性      -- scope屬性代表Bean的作用範圍
  * singleton     -- 單例(預設值)
  * prototype     -- 多例,在Spring架構整合Struts2架構的時候,Action類也需要交給Spring做管理,配置把Action類配置成多例!!
  * request     -- 應用在Web項目中,每次HTTP請求都會建立一個新的Bean(少用)
  * session     -- 應用在Web項目中,同一個HTTP Session 共享一個Bean(少用)
  * globalsession   -- 應用在Web項目中,多伺服器間的session

4. Bean對象的建立和銷毀的兩個屬性配置(了解)
  * 說明:Spring初始化bean或銷毀bean時,有時需要作一些處理工作,是以spring可以在建立和拆卸bean的時候調用bean的兩個生命周期方法
  * init-method   -- 當bean被載入到容器的時候調用init-method屬性指定的方法
  * destroy-method  -- 當bean從容器中删除的時候調用destroy-method屬性指定的方法
    * 想檢視destroy-method的效果,有如下條件
      * scope= singleton有效
      * web容器中會自動調用,但是main函數或測試用例需要手動調用(需要使用ClassPathXmlApplicationContext的close()方法)      

小結:

    1.id不可出現特殊字元,name可以出現特殊字元

        沒有id時,name可以當id用

    2.scope:singleton預設值單例

             prototype 多例 Action必須配置為多例

             (每個請求一個單獨action,那麼每個請求就都有一個單獨的值棧,取值存值安全多了)

2.依賴注入DI

service需要用到dao,但是所有的類都不能自己new呀,那麼就要在service裡寫個dao類的屬性,然後配置bean是多配置個property屬性,依賴注入把該屬性的值傳入,傳入一個dao給service

a.簡單示範注入String類型的屬性

serviceImpl中加一個屬性

ssh備考-07 搭建spring架構環境

配置檔案中多注入屬性值

ssh備考-07 搭建spring架構環境

測試方法直接拿值

ssh備考-07 搭建spring架構環境
ssh備考-07 搭建spring架構環境

2.service中依賴注入一個dao

UserDaoImpl.java

package cn.ahpu.dao;

public class UserDaoImpl implements UserDao {

  @Override
  public void save() {
    System.out.println("我是dao層save");
  }
  
}      

UserServiceImpl.java

package cn.ahpu.service;

import cn.ahpu.dao.UserDao;
import cn.ahpu.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {
  
  //依賴注入方式
  private UserDaoImpl userDao;
  public void setUserDao(UserDaoImpl userDao) {
    this.userDao = userDao;
  }
  @Override
  public void save() {
    System.out.println("我是service層save");
    //new UserDaoImpl().save();
    userDao.save();
  }
}      

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标簽配置需要由spring建立并管理的類  -->
  <bean id="userService" class="cn.ahpu.service.UserServiceImpl" scope="prototype">
    <property name="userDao" ref="userDao"/><!-- ref那個bean的id值 -->
  </bean>
  <!-- spring一啟動就會建立一個userDao類 -->
  <bean id="userDao" class="cn.ahpu.dao.UserDaoImpl"/>
   
</beans>      

Demo1.java

package cn.ahpu.Test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ahpu.service.UserService;
import cn.ahpu.service.UserServiceImpl;

/**
 * 測試IOC的程式  以後會由action調用service
 * @author 軟體163韓竹安
 * 2019年12月25日-下午1:19:54
 */
public class Demo1 {
  
  //依賴注入方式
  @Test
  public void run5(){
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//classPath表示加載src路徑下的檔案
    UserServiceImpl usi = (UserServiceImpl) ac.getBean("userService");
    usi.save();
  }
  
}      
ssh備考-07 搭建spring架構環境

其他注入方式(了解)

構造方法注入:

package com.itheima.demo4;
 
public class Car1 {
  private String name;
  private Double price;
  
  //public Cart() {}//注意沒有空參構造方法  配置時必須提供參數
  public Car1(String name, Double price) {
    super();
    this.name = name;
    this.price = price;
  }
  
  @Override
  public String toString() {
    return "Car1 [name=" + name + ", price=" + price + "]";
  }
  
}      
<bean id="car1" class="com.itheima.demo4.Car1">
    <!-- 配置構造方法的參數 那麼架構建立此類時就拿着參數調用對應的構造方法 -->
    <!-- <constructor-arg name="name" value="奇瑞QQ"/>
    <constructor-arg name="price" value="35000"/> -->
    
    <!-- 另一種配置參數的方式   index="0"表示第一個構造參數  ="1"表示第二個構造參數-->
    <constructor-arg index="0" value="奇瑞QQ2"/>
    <constructor-arg index="1" value="50000"/>
  </bean>      
/**
   * 通過構造方法實作注入   用得不多  标準用法是set方法
   */
  @Test
  public void run1(){
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
    Car1 car1=(Car1) ac.getBean("car1");
    System.out.println(car1);
  }      

今日代碼彙總:

UserDao.java

package cn.ahpu.dao;

public interface UserDao {
  public void save();
}      

UserDaoImpl.java

package cn.ahpu.dao;

public class UserDaoImpl implements UserDao {

  @Override
  public void save() {
    System.out.println("我是dao層save");
  }
  
}      

UserService.java

package cn.ahpu.service;

public interface UserService {
  public void sayHello();
  public void save();
}      

UserServiceImpl.java

package cn.ahpu.service;

import cn.ahpu.dao.UserDao;
import cn.ahpu.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {

  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }

  @Override
  public void sayHello() {
    System.out.println("Hello Spring!!");
  }
  
  //依賴注入方式
  private UserDaoImpl userDao;
  public void setUserDao(UserDaoImpl userDao) {
    this.userDao = userDao;
  }
  @Override
  public void save() {
    System.out.println("我是service層save");
    //new UserDaoImpl().save();
    userDao.save();
  }
}      

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标簽配置需要由spring建立并管理的類  -->
  <bean id="userService" class="cn.ahpu.service.UserServiceImpl" scope="prototype">
    <property name="name" value="天河"/>
    <property name="userDao" ref="userDao"/><!-- ref那個bean的id值 -->
  </bean>
  <!-- spring一啟動就會建立一個userDao類 -->
  <bean id="userDao" class="cn.ahpu.dao.UserDaoImpl"/>
</beans>      

Demo1.java

package cn.ahpu.Test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ahpu.service.UserService;
import cn.ahpu.service.UserServiceImpl;

/**
 * 測試IOC的程式  以後會由action調用service
 * @author 軟體163韓竹安
 * 2019年12月25日-下午1:19:54
 */
public class Demo1 {
  //原來方式
  @Test
  public void run1(){
    UserService us=new UserServiceImpl();
    us.sayHello();
  }
  
  //新方式要寫配置檔案
  
  //spring架構的方式
  @Test
  public void run2(){
    //建立工廠,加載核心配置檔案 (一加載工廠就會幫你建立配置了的對象)
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//classPath表示加載src路徑下的檔案
    //從工廠擷取對象    ac.getBean("id值")
    UserService usi = (UserService) ac.getBean("userService");
    //調用對象方法執行
    usi.sayHello();
  }
  
  //依賴注入傳入屬性值
  @Test
  public void run3(){
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//classPath表示加載src路徑下的檔案
    UserServiceImpl usi = (UserServiceImpl) ac.getBean("userService");
    System.out.println(usi.getName());
  }
  
  //依賴注入:在service裡注入dao
  /*//原始方式  serviceimpl的save裡直接new
  @Test
  public void run4(){
    UserServiceImpl usi = new UserServiceImpl();
    usi.save();
  }*/
  //依賴注入方式
  @Test
  public void run5(){
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//classPath表示加載src路徑下的檔案
    UserServiceImpl usi = (UserServiceImpl) ac.getBean("userService");
    usi.save();
  }
  
}