Spring入門學習創智版(一)

歷史回顧

struts:web層,比較簡單(ValueStack值棧,攔截器)
hibernate:dao層,知識點雜
spring:service層,重要,講多少用多少 --> 【瞭解】
在這裏插入圖片描述

:基礎(IoC控制反轉、DI依賴注入)、整合Junit、整合web
:AOP切面編程、JdbcTemplate
:事務管理、SSH整合

1、spring框架概述

1.1 什麼是spring
Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是爲了解決企業應用開發的複雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時爲 J2EE 應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和麪向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

輕量級:與EJB對比,依賴資源少,銷燬的資源少。
分層: 一站式,每一個層都提供的解決方案

web層strutsspring-MVC
service層spring
dao層hibernatemybatis
jdbcTemplate --> spring-data

1.2 spring由來
Expert One-to-One J2EE Design and Development
Expert One-to-One J2EE Development without EJB

1.3 spring核心
Spring的核心是 控制反轉(IoC)面向切面(AOP)

1.4 spring優點
在這裏插入圖片描述
1.5 spring體系結構
在這裏插入圖片描述

搭建spring環境

下載jar包 spring-framework-4.3.9.RELEASE-dist.zip
點擊進入

解壓後,取
(1) spring-aop-4.3.9.RELEASE.jar 開發AOP特性需要的jar
(2) spring-beans-4.3.9.RELEASE.jar 處理bean的jar
(3) spring-context-4.3.9.RELEASE.jar 處理spring上下文的jar
(4) spring-core-4.3.9.RELEASE.jar spring 核心jar
(5) spring-expression-4.3.9.RELEASE.jar spring 表達式
開發至少需要這5個+
1個第三方提供的commons-logging-1.1.1.jar 日誌
(下載地址:
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1.1
)

下載 STS.exe
參考博客:點擊進入

2、入門案例:IoC【掌握】

2.1 導入jar包
4 + 1 : 4個核心(beans、core、context、expression) + 1個依賴(commons-loggins…jar)
在這裏插入圖片描述

注意:jar包類型
在這裏插入圖片描述
2.2 目標類
提供UserService接口和實現類
獲得UserService實現類的實例
之前開發中,直接new一個對象即可。
學習spring之後,將由Spring創建對象實例–> IoC 控制反轉(Inverse of Control)之後需要實例對象時,從spring工廠(容器)中獲得,需要將實現類的全限定名稱配置到xml文件中
在這裏插入圖片描述
在這裏插入圖片描述
2.3 配置文件
位置:任意,開發中一般在classpath下(src)
名稱:任意,開發中常用applicationContext.xml
內容:添加schema約束
約束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html
在這裏插入圖片描述
2.4 測試
在這裏插入圖片描述

3、入門案例:DI【掌握】

DI Dependency Injection ,依賴注入
is a :是一個,繼承。
has a:有一個,成員變量,依賴。

class B {
           private A a;   //B類依賴A類
        }

依賴:一個對象需要使用另一個對象
注入:通過setter方法進行另一個對象實例設置。

例如:

class BookServiceImpl{
        //之前開發:接口 = 實現類  (service和dao耦合)
		//private BookDao bookDao = new BookDaoImpl();
 		//spring之後 (解耦:service實現類使用dao接口,不知道具體的實現類)
		private BookDao bookDao;
		setter方法
   }

模擬spring執行過程
創建service實例:BookService bookService = new BookServiceImpl() -->IoC
創建dao實例:BookDao bookDao = new BookDaoImple() -->IoC
將dao設置給service:bookService.setBookDao(bookDao); -->DI

在這裏插入圖片描述


在這裏插入圖片描述


在這裏插入圖片描述


在這裏插入圖片描述


在這裏插入圖片描述


在這裏插入圖片描述


在這裏插入圖片描述


3.1 目標類
創建BookService接口和實現類
創建BookDao接口和實現類
將dao和service配置 xml文件
使用api測試

3.1.1 dao
在這裏插入圖片描述
3.1.2 service
在這裏插入圖片描述
在這裏插入圖片描述
3.2 配置文件
在這裏插入圖片描述
在這裏插入圖片描述
3.3 測試
在這裏插入圖片描述

4、myeclipse schema xml提示

步驟一:確定xsd文件位置
spring-framework-3.2.0.RELEASE\schema\beans
在這裏插入圖片描述
步驟二:複製路徑
在這裏插入圖片描述
步驟三:搜索“xml catalog”
在這裏插入圖片描述
步驟四:添加約束提示
在這裏插入圖片描述

5、核心API

api整體瞭解,之後不使用,在學習過程需要。
在這裏插入圖片描述
BeanFactory :這是一個工廠,用於生成任意bean。
採取延遲加載,第一次getBean時纔會初始化Bean

ApplicationContext:是BeanFactory的子接口,功能更強大。
(國際化處理、事件傳遞、Bean自動裝配、各種不同應用層的Context實現)。

當配置文件被加載,就進行對象實例化。
ClassPathXmlApplicationContext 用於加載classpath(類路徑、src)下的xml
加載xml運行時位置 --> /WEB-INF/classes/…xml

FileSystemXmlApplicationContext 用於加載指定盤符下的xml
加載xml運行時位置 --> /WEB-INF/…xml
通過java web ServletContext.getRealPath() 獲得具體盤符

在這裏插入圖片描述

6、裝配Bean 基於XML

6.1 實例化方式
3種bean實例化方式默認構造靜態工廠實例工廠
在這裏插入圖片描述

6.1.1默認構造
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

6.1.2靜態工廠
常用與spring整合其他框架(工具)
靜態工廠:用於生成實例對象,所有的方法必須是static

共有的:
在這裏插入圖片描述
在這裏插入圖片描述

測試類
在這裏插入圖片描述
6.1.3 實例工廠
實例工廠:必須先有工廠實例對象,通過實例對象創建對象。提供所有的方法都是“非靜態”的。

在這裏插入圖片描述
在這裏插入圖片描述
測試類
在這裏插入圖片描述
6.3 作用域
作用域:用於確定spring創建bean實例個數。
在這裏插入圖片描述
取值
singleton 單例,默認值。
prototype 多例,每執行一次getBean將獲得一個實例。例如:struts整合spring,配置action多例。

在這裏插入圖片描述

UserService.java
在這裏插入圖片描述
UserServiceImpl.java

在這裏插入圖片描述
bean.xml
在這裏插入圖片描述

測試類
在這裏插入圖片描述

6.4 生命週期
6.4.1初始化和銷燬
目標方法執行前後執行後,將進行初始化或銷燬。
在這裏插入圖片描述
在這裏插入圖片描述
UserService.java
在這裏插入圖片描述
UserServiceImpl.java

在這裏插入圖片描述
在這裏插入圖片描述

測試類
在這裏插入圖片描述
6.4.2 BeanPostProcessor 後處理Bean
spring 提供一種機制,只要實現此接口BeanPostProcessor,並將實現類提供給spring容器,spring容器將自動執行,在初始化方法前執行before(),在初始化方法後執行after() 。

配置<bean class="">

在這裏插入圖片描述
Factory hook(勾子) that allows for custom modification of new bean instances, e.g. checking for marker interfaces or wrapping them with proxies.

spring提供工廠勾子,用於修改實例對象,可以生成代理對象,是AOP底層。

模擬

A a =new A();
a = B.before(a)			--> 將a的實例對象傳遞給後處理bean,可以生成代理對象並返回。
a.init();
a = B.after(a);

a.addUser();		//生成代理對象,目的在目標方法前後執行(例如:開啓事務、提交事務)

a.destroy()

在這裏插入圖片描述
測試類
在這裏插入圖片描述
bean.xml裏添加這個
在這裏插入圖片描述

6.5 屬性依賴注入

依賴注入方式:手動裝配 和 自動裝配
手動裝配:一般進行配置信息都採用手動
基於xml裝配:構造方法、setter方法
基於註解裝配
自動裝配:struts和spring 整合可以自動裝配
byType:按類型裝配
byName:按名稱裝配
constructor構造裝配,
auto: 不v確定裝配。
在這裏插入圖片描述

6.5.1 構造方法

User,java


package com.itheima.f_xml.a_construtor;

public class User {
	private Integer uid;
	private String name;
	private Integer age;

	/**
	 * 多個構造方法
	 */
	public User(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	public User(Integer uid, String name) {
		super();
		this.uid = uid;
		this.name = name;
	}

	public User(Integer uid, String name, Integer age) {
		super();
		this.uid = uid;
		this.name = name;
		this.age = age;
	}

	public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getName() {
		return name;
	}

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

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[User uid=" + uid + ",name=" + name + ",age=" + age + "]";
	}
}

bean.xml
在這裏插入圖片描述
測試類
在這裏插入圖片描述
6.5.2 setter方法
Person.java

package com.itheima.f_xml.b_setter;

public class Person {
	
	private String pname;
	private Integer age;
	
	private Address homeAddr;		//家庭地址
	private Address companyAddr;	//公司地址
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Address getHomeAddr() {
		return homeAddr;
	}
	public void setHomeAddr(Address homeAddr) {
		this.homeAddr = homeAddr;
	}
	public Address getCompanyAddr() {
		return companyAddr;
	}
	public void setCompanyAddr(Address companyAddr) {
		this.companyAddr = companyAddr;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "姓名:"+pname+"\n年齡:"+age+"\n"+homeAddr+"\n"+companyAddr;
	}
}

Address.java

package com.itheima.f_xml.b_setter;

public class Address {
	
	private String addr;	//地址信息
	private String tel;		//電話
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "地址:"+addr+"\t電話:"+tel;
	}
}

bean.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">

	<!-- 
	setter方法注入
		*普通數據	<property name="" value=""/>
				等效於:
				<property name="">
					<value></value>
				</property>	
		*引用數據	<property name="" ref="另外一個bean的Id"/>	
				等效於:
				<property name="">
					<ref bean="另外一個bean的Id"/>
				</property>
	-->
	
	<!-- main -->
	<bean id="personId" class="com.itheima.f_xml.b_setter.Person">
		<!-- 普通數據 -->
		<property name="pname" value="jack"/>
		<property name="age">
			<value>18</value>
		</property>
		
		<!-- 引用數據 -->
		<property name="homeAddr" ref="homeAddrId"/>
		<property name="companyAddr">
			<ref bean="CompanyAddrId"/>
		</property>
	</bean>
	
	
	
	<bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address">
		<property name="addr" value="北京"/>
		<property name="tel" value="110"/>
	</bean>
	<bean id="CompanyAddrId" class="com.itheima.f_xml.b_setter.Address">
		<property name="addr" value="上海"/>
		<property name="tel" value="120"/>
	</bean>
</beans>

測試類

在這裏插入圖片描述
6.5.3 P命令空間[瞭解]
對“setter方法注入”進行簡化,替換,而是在

<bean p:屬性名="普通值"  p:屬性名-ref="引用值">

p命名空間使用前提,必須添加命名空間
在這裏插入圖片描述在這裏插入圖片描述

6.5.2的beam.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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="personId" class="com.itheima.f_xml.c_p.Person"
	p:pname="mark" p:age="22"
	p:homeAddr-ref="homeAddrId" p:companyAddr-ref="CompanyAddrId">
	</bean>	
	
	<bean id="homeAddrId" class="com.itheima.f_xml.c_p.Address"
			p:addr="北京" p:tel="110">
	</bean>
	<bean id="CompanyAddrId" class="com.itheima.f_xml.c_p.Address"
		p:addr="上海" p:tel="120">
	</bean>
</beans>

6.5.4 SpEL[瞭解]
對進行統一編程,所有的內容都使用value

<property name="" value="#{表達式}">
	#{123}、#{'jack'} : 數字、字符串
	#{beanId}	:另一個bean引用
	#{beanId.propName}	:操作數據
	#{beanId.toString()}	:執行方法
	#{T().字段|方法}	:靜態方法或字段

在這裏插入圖片描述

Customer.java

package com.itheima.f_xml.d_spel;

public class Customer {

	private String cname="java";
	private Double pi;

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public Double getPi() {
		return pi;
	}

	public void setPi(Double pi) {
		this.pi = pi;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[Customer cname=" + cname + ",pi=" + pi + "]";
	}
}

bean.xml
在這裏插入圖片描述
測試類
在這裏插入圖片描述
6.5.5 集合注入
在這裏插入圖片描述

package com.itheima.f_xml.e_coll;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollData {
	private String[] arrayData;
	private List<String> listData;
	private Set<String> setData;
	private Map<String, String> mapData;
	private Properties prosData;

	public String[] getArrayData() {
		return arrayData;
	}

	public void setArrayData(String[] arrayData) {
		this.arrayData = arrayData;
	}

	public List<String> getListData() {
		return listData;
	}

	public void setListData(List<String> listData) {
		this.listData = listData;
	}

	public Set<String> getSetData() {
		return setData;
	}

	public void setSetData(Set<String> setData) {
		this.setData = setData;
	}

	public Map<String, String> getMapData() {
		return mapData;
	}

	public void setMapData(Map<String, String> mapData) {
		this.mapData = mapData;
	}

	public Properties getProsData() {
		return prosData;
	}

	public void setProsData(Properties prosData) {
		this.prosData = prosData;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "arrayData="+Arrays.asList(arrayData)+"\n"+
				"listData="+listData+"\n"+
				"setData="+setData+"\n"+
				"mapData="+mapData+"\n"+
				"prosData="+prosData+"\n"
				;
	}
}

bean.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="collDataId" class="com.itheima.f_xml.e_coll.CollData">
		<!-- 數組 -->
		<property name="arrayData">
			<array>
				<value>DS</value>
				<value>DZD</value>
			</array>
		</property>
		
		<!-- 列表 -->
		<property name="listData">
			<list>
				<value>LB</value>
				<value>LB2</value>
			</list>
		</property>

		<!-- 集合 -->
		<property name="setData">
			<set>
				<value>JH</value>
				<value>JH2</value>
			</set>
		</property>
		
		<!-- Map 鍵值對-->
		<property name="mapData">
			<map>
				<entry key="jack" value="傑克"></entry>
				<entry>
					<key><value>mark</value></key>
					<value>麥克</value>
				</entry>
			</map>
		</property>
		
		<!-- property -->
		<property name="prosData">
			<props>
				<prop key="PRO1">pro1</prop>
				<prop key="PRO2">pro2</prop>
			</props>
		</property>		
	</bean>
	
</beans>

測試類
在這裏插入圖片描述

7、裝配Bean 基於註解(重點)

註解:就是一個類,使用@註解名稱
開發中:使用註解 取代 xml配置文件

在這裏插入圖片描述

註解使用前提,添加命名空間,讓spring掃描含有註解類
在這裏插入圖片描述
bean.xml(下面兩個案例都是這個.xml)
在這裏插入圖片描述
離線文檔:
spring-framework-4.3.9.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

在這裏插入圖片描述
整個代碼覆蓋獲者將黑色部分黏貼在bean.xml頭部
在這裏插入圖片描述

案例一
UserService.java
在這裏插入圖片描述UserServiceImpl.java

在這裏插入圖片描述測試類
在這裏插入圖片描述

案例二
StudentAction.java
在這裏插入圖片描述StudentDao.java
在這裏插入圖片描述StudentDaoImpl.java

在這裏插入圖片描述StudentService.java
在這裏插入圖片描述StudentServiceImpl.java

package com.itheima.g_annotation.b_web;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("studentServiceId")
//@Scope("prototype")
public class StudentServiceImpl implements StudentService {

	private StudentDao studentDao;

	@Autowired
	@Qualifier("studentDaoId")
	public void setStudentDao(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
	
	@Override
	public void addStudent() {
		// TODO Auto-generated method stub
		System.out.println("service");
	}
	
	@PostConstruct
	public void myInit() {
		// TODO Auto-generated method stub
		System.out.println("初始化");
	}
	
	@PreDestroy
	public void myDestroy() {
		// TODO Auto-generated method stub
		System.out.println("銷燬");
	}

}

測試類
在這裏插入圖片描述

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