天天看點

Spring學習筆記1.Spring 概述2.Spring與IOC3. Spring 與 AOP4. Spring 與 DAO5. Spring 與 Mybatis6. Spring 與 Web

文章目錄

  • 1.Spring 概述
    • 1.1.IOC
    • 1.2.AOP
  • 2.Spring與IOC
    • 2.1.分類
    • 2.2.Spring的第一個程式
      • 2.2.1 定義一個接口
      • 2.2.2 接口的實作類
      • 2.2.3 自己建立對象的測試
      • 2.2.4 建立對象交給Spring容器來做
        • 2.2.4.1 Spring XML檔案的配置
        • 2.2.4.2 Spring容器建立對象的測試
    • 2.3 Bean 的裝配
      • 2.3.2 動态工廠bean
      • 2.3.3 靜态工廠bean
      • 2.3.4 Bean的作用域
      • 2.3.5 Bean後處理器
      • 2.3.6 Bean的生命周期
    • 2.4 基于XML的依賴注入
      • 2.4.1 設定注入
      • 2.4.2 構造注入
      • 2.5 基于注解的依賴注入
  • 3. Spring 與 AOP
    • 3.1 AOP程式設計術語
    • 3.2 AOP 程式設計環境搭建
    • 3.3 通知Advice
    • 3.4 顧問Advisor
    • 3.5 自動代理生成器
    • 3.6 AspectJ對AOP的實作
      • 3.6.1Spring AspectJ Aop三者的關系:
      • 3.6.2 AspectJ的通知類型
      • 3.6.3 AspectJ的切入點表達式
      • 3.6.4 基于XML的AOP實作
  • 4. Spring 與 DAO
    • 4.1 Spring 與 JDBC模闆
    • 4.2 Spring的事務管理
  • 5. Spring 與 Mybatis
  • 6. Spring 與 Web

1.Spring 概述

Spring 的核心是控制反轉(IOC)和面向切面程式設計(AOP)。Spring的主要作用就是為代碼解耦,降低代碼的耦合度

Spring根據代碼的功能特點,将降低耦合度的方式分為兩類IOC和AOP。IOC使得主業務在互相調用的過程中,不用自己維護關系,即不用再自己建立要使用的對象了。而是由Spring統一管理,自動“注入”。AOP使得系統級服務得到最大的複用,且不在由程式員手工将系統級服務“混雜”到業務邏輯中了,而是由Spring容器統一管理

1.1.IOC

控制反轉,即建立被調用者的執行個體不是由調用者完成,而是由Spring容器完成,并且注入調用者。

A類要調用B類裡的方法,正常情況下需要在A類中建立B類的執行個體,IOC則是通過容器建立并且注入

1.2.AOP

面向切面程式設計,是一種程式設計思想,是面向對象程式設計OOP的補充。很多架構實作對AOP程式設計思想的實作。

2.Spring與IOC

2.1.分類

依賴注入和依賴查找

  • 依賴查找:容器提供回調接口和上下文環境給元件,程式代碼則需要提供具體的查找方式。
  • 依賴注入程式代碼不做定位查詢,這些工作量由容器自行完成。

2.2.Spring的第一個程式

2.2.1 定義一個接口

package com.guandong.service;

public interface ISomeService {
	void doSome();
}
           

2.2.2 接口的實作類

package com.guandong.service;

public class SomeServiceImpl implements ISomeService {

	@Override
	public void doSome() {
		System.out.println("執行doSome()方法!");

	}

}
           

2.2.3 自己建立對象的測試

@Test
	public void test01() {

		ISomeService service = new SomeServiceImpl();
		service.doSome();

	}
           

2.2.4 建立對象交給Spring容器來做

2.2.4.1 Spring XML檔案的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdd">
	
	<!-- 注冊Service -->
	<bean id="myService" class="com.guandong.service.SomeServiceImpl"/>
	

</beans>
           

2.2.4.2 Spring容器建立對象的測試

public void test02() {

		// 建立容器對象
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		ISomeService service= (ISomeService)ac.getBean("myService");
		service.doSome();

	}
           

注意:applicationContext.xml要在類路徑下

2.3 Bean 的裝配

定義:Bean的裝配即bean對象的建立。容器根據代碼要求建立Bean對象後再傳遞給代碼的過程

2.3.2 動态工廠bean

在配置檔案中首先建立工廠bean,然後在建立執行個體的時候通過

factory-bean以及factory-method屬性設定

2.3.3 靜态工廠bean

2.3.4 Bean的作用域

  1. 在Spring裡面,設定建立bean執行個體是單執行個體還是多執行個體
  2. 在Spring裡面,預設情況是單執行個體

bean中有屬性,scope。進行配置

  • singleton 單例模式,Spring容器初始化時建立執行個體
  • prototype 原型模式,其對象的建立時期不是在Spring容器初始化時建立,而是在代碼正真通路的時候建立
  • request 對于每一次HTTP請求,都會将産生一個不同的Bean執行個體
  • session 對于每一個不同的HTTP,Session都将産生一個不同的Bean執行個體

2.3.5 Bean後處理器

在其他Bean初始化前調用 或者在其他Bean初始化後調用

需要在Bean後處理器類中實作BeanPostProcessor接口,重寫

postProcessorBeforeInitialzation

以及

postProcessorAfterInitialzation

方法

傳回bean對象

bean的後置處理器,bean的生命周期有七步操作

  1. 1、通過構造器建立bean執行個體(無參數構造)
  2. 為bean的屬性值和對其他bean引用(調用set方法)

    3. 把bean執行個體床底給後置處理器的方法

    postProcessBeforeInitialization(Object bean, String beanName)

  3. 調用bean的初始化方法(需要進行配置)

    4. 把bean執行個體床底給後置處理器的方法

    postProcessAfterInitialization(Object bean, String beanName)

  4. bean可以使用了(對象擷取到了)
  5. 當容器關閉時候,調用bean的銷毀方法(需要進行配置銷毀方法)

2.3.6 Bean的生命周期

  1. 從對象的建立到銷毀的過程
  2. bean的生命周期
    1. 通過構造器建立bean執行個體(無參數構造)
    2. 為bean的屬性值和對其他bean引用(調用set方法)
    3. 調用bean的初始化方法(需要進行配置)
    4. bean可以使用了(對象擷取到了)
    5. 當容器關閉時候,調用bean的銷毀方法(需要進行配置銷毀方法)
package test;

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

import bean.Orders;

public class test01 {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		Orders orders = ac.getBean("orders",Orders.class);
		System.out.println("第四步 擷取對象");
		System.out.println(orders);
		
		((ClassPathXmlApplicationContext)ac).close();
	}
}



package bean;

public class Orders {
	private String oname;

	
	public Orders() {
		System.out.println("第一步 無參數構造建立bean執行個體");
	}


	public void setOname(String oname) {
		System.out.println("第二步 調用set方法設定屬性值");
		this.oname = oname;
	}
	
	//建立執行初始化的方法
	public void initMethod() {
		System.out.println("第三步 執行初始化方法");
	}
	
	//建立執行的銷毀方法
	public void destoryMethod() {
		System.out.println("第五步 執行銷毀的方法");
	}
}


<?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="orders" class="bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
		<property name="oname" value="shouji"></property>
	
	</bean>
</beans>




第一步 無參數構造建立bean執行個體
第二步 調用set方法設定屬性值
第三步 執行初始化方法
第四步 擷取對象
bean.Orders@14bf9759
第五步 執行銷毀的方法

           

2.4 基于XML的依賴注入

2.4.1 設定注入

使用set方法進行注入

<bean id="xxx" class="xxx.xxx" >
	<property name="屬性名" value="值"></property>
</bean>
           

對象屬性的時候

<bean id="userdaoimpl" class = "dao.UserDaoImpl"></bean>
 	
<bean id="userservice" class="service.UserService">
 	<property name="userdao" ref = "userdaoimpl"></property>
</bean>
           

2.4.2 構造注入

通過有參數構造

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-pGUpV9R5-1625550599018)(7501F23400BC4F78AE90F65966148B67)]

2.5 基于注解的依賴注入

  • @Component //表示目前類被Spring管理
  • 屬性注入
    • @Value //注入值
    • @Autowired //byType方式的注解式注入
    • @Qualifier根據屬性名稱進行注入 //byName方式,要求@Autowired和@Qualifier聯合使用
    • @Resource(name="")//byType方式
    • @Resource//byName方式
  • @Scope() //指定作用域

基于注解的依賴注入步驟:

  1. 引入依賴

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-nMIZ6MRB-1625550599020)(E9C60968084040089C8B9A6E85AECE0E)]

  2. 開啟元件掃描

    在配置檔案中要添加元件掃描器

  1. 在類上加注解
  • @Component 表示普通注解
  • @Service 一般用在業務邏輯層
  • @Controller 一般用在SpringMVC的處理器上層
  • @Repository 一般用在DAO層

3. Spring 與 AOP

AOP的底層就是采用動态代理模式實作的,采用了兩種代理:JDK的動态代理與CGLIB的動态代理

面向切面程式設計,就是将交叉業務邏輯封裝成切面,利用AOP容器的功能将切面織入到主業務邏輯中。例如轉賬,正在轉賬業務邏輯前後,需要權限控制、日志記錄、加載事務、結束事務。

3.1 AOP程式設計術語

1. 切面
    切面泛指交叉業務邏輯
2. 織入
    織入是指将切面代碼插入到目标對象的過程
3. 連接配接點
    連接配接點是指被切面織入的方法。通常業務邏輯中的方法均為連接配接點
4. 切入點
    切入點指切面具體切入的方法
5. 目标對象
    目标對象指要增強的對象,即包含主業務邏輯的類的對象
6. 通知
    通知定義了增強代碼切入到目标代碼的時間點
7. 顧問,指定切入點
           

3.2 AOP 程式設計環境搭建

在核心 JAR 包的基礎上,再向 springDemo03 項目的 lib 目錄中導入 AOP 的 JAR 包,

 具體如下:

  • spring-aop-3.2.13.RELEASE.jar:是 Spring 為 AOP 提供的實作,在 Spring 的包中已經提供。
  • com.springsource.org.aopalliance-1.0.0.jar:是 AOP 提供的規範,可以在 Spring 的官網網址 https://repo.spring.io/webapp/#/search/quick/ 中進行搜尋并下載下傳。

3.3 通知Advice

  1. 前置通知,需要實作MethodBeforeAdvice接口,接口中有一個方法before()會在目标方法執行前執行。
    1. 前置通知的特點:
      • 在目标方法執行之前先執行
      • 不改變目标方法的執行流程,前置通知代碼不能阻止目标方法執行
      • 不改變目标方法執行的結果
  2. 後置通知,需要實作AfterReturningAdvice接口,接口中有一個afterReturning()方法會在目标方法執行之後執行。
    1. 後置通知的特點:
      • 後置通知可以擷取目标方法的傳回結果,但是無法改變目标方法傳回值
      • 在目标方法執行之後先執行
  3. 環繞通知,需要實作MethodInterceptor接口,接口中有一個invoke()方法會在目标方法執行前後執行增強代碼。
    1. 環繞通知的特點
      • 可以修改目标方法的結果
      • 在 invcation.proceed();方法前後執行目标增強代碼。
  4. 異常通知,需要實作ThrowsAdvice接口。

3.4 顧問Advisor

3.5 自動代理生成器

3.6 AspectJ對AOP的實作

3.6.1Spring AspectJ Aop三者的關系:

  • Spring AspectJ兩者沒有關系
  • Spring AspectJ 都是對AOP的實作
  • 在Spring環境下使用AspectJ對AOP進行程式設計

3.6.2 AspectJ的通知類型

  1. 前置通知 @Before
  2. 後置通知 @AfterReturning
  3. 環繞通知 @Around 方法要有參數,參數類型ProceedingJoinPoint
  4. 異常通知 @AfterThrowing
  5. 最終通知 @After

    其中最終通知是指,無論程式執行是否正常,該通知都會執行。類似于tyr…catch中的finally代碼塊。

3.6.3 AspectJ的切入點表達式

execution([modifiers-pattern] 通路權限類型

     [ret-type-pattern] 傳回值類型

     [delaring-type-pattern] 全限定性類名

                  方法名

     [throws-pattern] 抛出異常類型

)

3.6.4 基于XML的AOP實作

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-RRy9t7oJ-1625550599022)(13518395F48E4030815DC7C1161983AE)]

4. Spring 與 DAO

4.1 Spring 與 JDBC模闆

4.2 Spring的事務管理

5. Spring 與 Mybatis

6. Spring 與 Web