spring超全面详解
spring概述
Spring 是于2003年興起的一款輕量級的,非侵入式的IOC和AOP的一站式的java開發框架? 為簡化企業級應用開發而生. 1.輕量級:? ?就是指spring核心功能的jar包不大 2.非侵入式:??我們的業務代碼不需要繼承或實現spring中任何的類或接口 3.IOC:? ?控制反轉? ? 就是把創建對象的權利反轉給spring框架 4.AOP:? 面向切面編程? ? 它是一種編程思想,是面向對象編程(OOP) 的一種補充。面向對象編程將程序抽象成各個層次的對象,而面向切面編程是將程序抽象成各個切面 5.一站式框架:? ?Spring 本身也提供了數據訪問功能和 web 功能,以及可以很好的管理其他框架
Spring 體系結構
Core Container(核心容器): Beans:? ? ?管理 Beans Core:? ? ? ?Spring 的核心,提供IOC容器的對象的創建并處理依賴對象關系 Context:? 配置文件? 就是Bean的關系的集合,也叫做IOC容器,調用了大部分spring-core中的方法 ExpressionLanguage: SpEL 表達式 AOP:? ? 切面編程? ?使?Spring框架管理對象支持AOP,同時這個模塊也提供了事務管理 ORM:? ?提供了對現有的ORM框架的支持,例如Hibernate,JDO,Mybatis等。 DAO:? ? 提供了對數據訪問對象(Data Access Object,DAO)模式和JDBC的支持,把實現業務邏輯和數據庫訪問的代碼實現分離等。 Data Access(數據庫整合): JDBC, ORM, OXM, JMS, Transaction springWeb(MVC Web 開發):??是 spring 框架的一個模塊,springWeb 和 spring 無需通過中間整合層進行整合,? ?是一個基于 mvc 的 web 框架,方便前后端數據的傳輸,? ??擁有控制器,接收外部求,解析參數傳給服務層spring搭建和測試
spring項目的搭建就是在Maven項目的基礎上添加一些依賴并且進行一些配置
1.Maven 導入 spring 核心基礎 jar
<!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency> 2.編寫 spring 配置文件 <?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="admin" class="com.ffyc.spring.bean.Admin"> </bean> </beans> 3.編寫一個 Admin 實體類 public class Admin {private int id;private String account;public Admin() {System.out.println("無參構造方法");}public Admin(int id, String account) {this.id = id;this.account = account;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", account='" + account + '\'' +'}';} }4.測試
//讀取spring配置文件,并對文件中配置的對象進行創建ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");Admin admin = app.getBean("admin", Admin.class);System.out.println(admin);IOC(控制反轉)
概述:? 它是一種設計思想,就是將原本在程序中手動創建對象的控制權,交由 Spring 框架來 管理。 IOC 容器是具有依賴注入功能的容器,負責對象的實例化、對象的初始化,對象和對象之間依賴關系配置、對象的銷毀、對外提供對象的查找等操作,對象的整個生命周期都是由容器來控制。我們需要使用的對象都由 ioc 容器進行管 理,不需要我們再去手動通過 new 的方式去創建對象,由 ioc 容器直接幫我們組裝好,當我們需要使用的時候直接從 ioc 容器中直接獲取就可以了。 正控:若要使用某個對象,需要自己去負責對象的創建 反控:若要使用某個對象,只需要從 Spring 容器中獲取需要使用的對象,不關心對象的創建過程,也就是把創建對象的控制權反轉給了 Spring 框架. 底層實現方式: 解析 xml/掃描注解標簽 + 工廠模式 + 反射機制spring中bean的管理
1.基于 xml 配置方式依賴注入
在spring創建對象(控制反轉)時,還需要為我們的對象屬性進行初始化賦值,這個過程稱為依賴注入
(1)get,? set? 方式注入
<bean id="admin" name="admin2" class="com.ffyc.ssm.model.Admin" scope="prototype"><property name="id" value="10"></property><property name="account" value="admin"></property></bean>(2)構造方法注入
<bean id="admin" name="admin1" class="com.ffyc.ssm.model.Admin" scope="prototype"><constructor-arg name="id" value="100"></constructor-arg><constructor-arg name="account" value="admins"></constructor-arg></bean> bean 配置需要 spring 管理的類,也叫做spring管理的類叫做bean對象 id 生成的對象名 class 全類名 name 對象別名,可以為多個 scope(bean的作用域): singleton(默認值):在 Spring 中只存在一個 bean 實例, 單例模式.? 在spring啟動時就會創建 prototype:原型 getBean()的時候都會 new Bean() 2.注解方式實現依賴注入 (1)注解需要的 jar 包,? 注解功能封裝在 AOP 包中,導入 Spring aop jar 包即可 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version> </dependency>(2)在spring中開啟注解掃描
<context:component-scan base-package="包名"> </context:component-scan> (3)利用注解方式創建對象 @Component(value=“admin”)也就是相當于?<bean id=“admin” class=“”></bean> @Service @Repository 以上注解都可以實現創建對象功能,只是為了后續擴展功能,在不同的層使用不同的注解標記 @Scope(value=“prototype”) 原型? ? ? ? ?@Scope(value=“ singleton ”) 單例 3.注解方式注入屬性 (1)@Autowired @Autowired 是 Spring 提供的注解,有兩種方式進行注入 byType 自動注入 該注解默認使用按類型自動裝配 Bean 的方式。 byName 自動注入 如果我們想使用按照名稱(byName)來裝配,可以結合@Qualifier 注解一起使用。 需要在引用屬性上聯合使用注解@Autowired 與@Qualifier。@Qualifier 的value 屬性用于指定要匹配的 Bean 的 id 值。 @Autowired @Qualifier(value = "adminDao")AdminDao adminDao; (2)@Resource 自動注入 Spring 提供了對 jdk 中@Resource 注解的支持。 @Resource 注解既可以按名稱匹配 Bean,也可以按類型匹配 Bean。默認按照 ByType 自動注入 byName 注入引用類型屬性 @Resource 注解指定其 name 屬性,則 name 的值即為按照名稱進行匹配的 Bean 的 id。 @Resource(name = "adminDao")AdminDao adminDao;4.注解與 XML 的對比
注解優點: 方便,直觀,高效(代碼少,沒有配置文件的書寫那么復雜) 注解缺點:以硬編碼的方式寫入到 Java 代碼中,修改是需要重新編譯代碼的。 xml 優點是: 配置和代碼是分離的,在 xml 中做修改,無需編譯代碼,只需重啟服務器即可將新的配置加載。 xml 的缺點是:編寫麻煩,效率低,大型項目過于復雜。Spring JDBC
Spring 是個一站式框架:Spring 自身也提供了控制層的 SpringMVC 和 持久層的 Spring JdbcTemplate。 搭建步驟: 1.下載 Spring JdbcTemplate 的 jar 包 <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.2.RELEASE</version> </dependency> 2.導入阿里巴巴提供的數據源管理組件 ?druid(德魯伊) ? ? 常用的數據庫連接池組件:dbcp c3p0 數據源組件,封裝了連接數據庫,還有數據庫連接池功能 <!-- 阿里數據源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> 3.導入屬性文件(config.properties) classDriverName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai uname=root pwd=root <context:property-placeholder location="config.properties"/> 4.管理數據源對象 spring 管理與數據庫鏈接 (數據源) <bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"> <propertyname="driverClassName" value="${driverClassName}"></property> <property name="url" value="${url}"></property> <property name="username" value="${uname}"></property> <property name="password" value="${pwd}"></property> <property name="initialSize" value="10"></property> <property name="minIdle" value="5"></property> <property name="maxActive" value="20"></property> </bean> 5.創建spring封裝的jdbc <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!--注入數據源的對象--><property name="dataSource" ref="dataSource"></property></bean>6.在類中獲得 JdbcTemplate 對象,直接使用。
?
?
AOP(面向切面編程)
前言:? ???開發好一個版本后,后期如果需要添加新的功能,就需要修改原來的代碼,加入調用新功能的代碼.? 這樣開發就很麻煩,會存在大量的冗余代碼.
概述:??AOP為Aspect Oriented Programming的縮寫 面向切面編程,? 它是 OOP 的延續,可以對業務邏輯和非業務邏輯進行隔離,從而使得各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。 AOP、OOP 是面向不同領域的兩種設計思想。OOP (面向對象編程)針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。 而 AOP 則是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。
也就是將程序中的一些非業務代碼進行提取,在不需要修改原來代碼的情況下,為程序添加額外的功能.
非業務代碼:??(驗證權限,打印日志,提交事務,統一異常處理)
核心原理: 使用動態代理的方式在執行方法前后或者出現異常的時候做加入相關的邏輯.
使用案例: 事務處理:開啟事務,關閉事務,出現異常后回滾事務 ? ? ? ? ? ? ? ? 權限判斷:在執行方法前,判斷是否具有權限 ? ? ? ? ? ? ? ? 日志:在執行前進行日志處理?AOP 的基本概念
連接點(Joinpoint):類中可以被增強的方法,這個方法就被稱為連接點 切入點(pointcut):類中有很多方法可以被增強,但實際中只有 add 和 update被增強了,那么 add 和 update 方法就被稱為切入點(實際實現的連接點) 通知(Advice): 通知是指一個切面在特定的連接點要做的事情(增強的功能)。通知分為方法執行前通知,方法執行后通知,環繞通知等. 切面(Aspect):把通知添加到切入點的整個過程稱為切面. 目標(Target): 代理的目標對象(連接點,切入點所在類) 代理(Proxy): 向目標對象應用通知時創建的代理對象 springAOP 實現 AspectJ 是一個基于 Java 語言的 AOP 框架,它提供了強大的 AOP 功能,且其實現方式更為簡捷,使用更為方便, 而且還支持注解式開發。所以,Spring 又將 AspectJ 的對于 AOP 的實現也引入到了自己的框架中。 首先下載 AOP 相關 jar <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.2.RELEASE</version> </dependency> 1.基于 aspectj 的 xml 配置方式實現 AspectJ 中常用的通知有五種類型: 前置通知,后置通知,環繞通知,異常通知,最終通知 <bean id="aopdemo" class="com.ff.spring.aop.AopDemo"></bean> <aop:config> <!-- 配置切入點 --> <aop:pointcut expression="execution(*com.ff.spring.service.UserService.adduser(..))" id="adduser"/> <aop:pointcut expression="execution(*com.ff.spring.service.UserService.*(..))" id="allmethod"/> <!-- 配置通知和切入點 --> <aop:aspect ref="aopdemo"> <aop:before method="savelog" pointcut-ref="adduser"/> <aop:after method="savelog" pointcut-ref="adduser"/> <aop:around method="aroundAdvice" pointcut-ref="adduser"/> <aop:after-throwing method="exceptionAdvice" pointcut-ref="allmethod"?throwing="e" /> </aop:aspect> </aop:config>?
2.基于注解方式的實現 啟動 AspectJ 支持:<aop:aspectj-autoproxy /><!--自動代理-->?
環繞通知可以包括前面的所有與通知
Spring 事物管理
概述:??事物可以看做是由對數據庫若干操作組成的一個單元。 我們在開發企業應用時,對于業務人員的一個操作實際是對數據讀寫的多步操作的結合。由于數據操作在順序執行的過程中,任何一步操作都有可能發生異常, 異常會導致后續操作無法完成,此時由于業務邏輯并未正確的完成,之前成功操作數據的并不可靠,需要在這種情況下進行回退。 事務的作用就是為了保證用戶的每一個操作都是可靠的,事務中的每一步操作都必須成功執行,只要有發生異常就回退到事務開始未進行操作的狀態,這些操作要么都完成,要么都取消,從而保證數據滿足一致性的要求 Spring 中的事務管理分為兩種形式,一種是編程式事務,一種是聲明式事務. 編 程 式 事 務 在 項 目 中 很 少 使 用 , 這 種 方 式 需 要 注 入 一 個 事 務 管 理 對 TransactionTemplate ,然后在我們代碼中需要提交事務或回滾事務時自己寫代碼實現. 聲明式事務管理建立在 AOP 基礎上,本質是對方法前后進行攔截,所以聲明式事務是方法級別的。 Spring 聲明式事物管理方式有兩種: 基于 xml 配置 基于注解實現 基于注解實現 1.配置事物管理器 <!-- 配置 spring 事務管理類, 并注入數據源 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> 2.開啟注解事務管理? <tx:annotation-driven transaction-manager="transactionManager"/> 3.在 service 中控制事務 @Service(value="adminDao") @Transactional @Transactional的用法? ? ? ? 一般把?? ?@Transactional標簽添加在service中,
?? ??? ?@Transactional可以添加在service層中類上,類中所有的方法都會添加事務管理功
?? ??? ?@Transactional如果只添加在某個方法上,那么表示此方法在事務管理中進行
@Transactional在以下6種情況下會失效.
? ? ? ? ?1.修飾一個非public的方法,底層權限只針對public修飾的方法
? ? ? ? ?2.方法中的異常被catch捕獲處理了
? ? ? ? ?3.默認情況下出現編譯期異常,事務不生效
? ? ? ? ? ? 默認情況下只對運行期異常進行捕獲@Transactional(rollbackFor = RuntimeException.class)
? ? ? ? ? ? 我們可以把其修改為@Transactional(rollbackFor = Exception.class),這樣就可以處理任意的異常
? ? ? ? ?4.@Transactional事務傳播行為設置錯誤
? ? ? ? ?5.數據庫引擎不支持事務, 數據庫引擎是mysql底層具體的一種數據處理實現的機制
? ? ? ? ? ? ?常用的兩個引擎: innodb(支持事務功能),myisam(不支持事務)
? ? ? ? ?6.在一個非事務方法中使用this(原始的對象==自己new出來的對象)?? ??
Spring 事務傳播行為
概述: 既然是傳播,那么至少有兩個東西,才可以發生傳播。單體不存在傳播這個行為。 事務傳播行為(propagation behavior)指的就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行。事務傳播行為是 Spring 框架獨有的事務增強特性,他不屬于的事務實際提供方數據庫行為
Spring 定義了七種傳播行為: PROPAGATION_REQUIRED? ? ? ?如果當前沒有事務,就新建一個事務,如果已經存在一個事務中, 加入到這個事務中。這是最常見的選擇。 PROPAGATION_SUPPORTS? ? ? ?支持當前事務,如果當前沒有事務,就以非事務方式執行。 PROPAGATION_MANDATORY? ? ? 使用當前的事務,如果當前沒有事務,就拋出異常。 PROPAGATION_REQUIRES_NEW? ? ? ?新建事務,如果當前存在事務,把當前事務掛起。 PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 PROPAGATION_NEVER? ? ? ? 以非事務方式執行,如果當前存在事務,則拋出異常。 PROPAGATION_NESTED? ? ? ? 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務, 則執行與 PROPAGATION_REQUIRED 類似的操作。Spring 集成 Mybatis
Spring 集成 Mybatis 其核心是將 SqlSessionFactory 交由 Spring 管理,并由 Spring 管理對 dao 接口的代理實現 1.導入 mybatis jar 包 Spring 結合 mybatis 插件包 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> 2.配置 sqlSessionFactory <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="mybatis-config.xml"></property> <property name="mapperLocations" value="com/ff/*Mapper.xml"> </property> </bean> 3.指定生成接口代理 <bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ff.ssm.dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"> </property> </bean> 4.在 service 中注入 Dao 代理接口,此接口有 Spring 代理實現 @Resource LoginDao loginDao;總結
以上是生活随笔為你收集整理的spring超全面详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猿如意|初识CSDN的开发者工具合集
- 下一篇: 通信协议:CAN总线