目錄
一、搭建簡單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包
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SNxcjM3UTOwkTYhNzYxgjMzYzXwMzNzUTM5EzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
2、編寫service層接口與實作類
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、編寫測試程式
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();
}
}
二、詳細學習
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中加一個屬性
配置檔案中多注入屬性值
測試方法直接拿值
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();
}
}
其他注入方式(了解)
構造方法注入:
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();
}
}