歷史回顧
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層: struts, spring-MVC
service層: spring
dao層: hibernate, mybatis ,
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("銷燬");
}
}
測試類