Sping和一個開源框架,能夠和其餘框架一塊兒使用,解決對象建立以及對象之間依賴關係的一種框架;spring
Spring有7大模塊express
1:SpringCore編程
2:SpringDao安全
3:SrpingROM框架
4:SpringWebdom
5:Springcontext函數
6:SpringAOP性能
7:SpringWebMvcspa
Spring默認是單例的代理
SpringIOC
SpringIOC容器是Spring的核心內容
做用:建立對象、處理對象的依賴關係
SpringIOC的原理:dom4j解析+反射機制
建立對象, 有幾種方式:
1) 調用無參數構造器
2) 帶參數構造器
3) 工廠建立對象
工廠類,靜態方法建立對象
工廠類,非靜態方法建立對象
DL(依賴注入)的方式:
1: 經過構造函數
2:經過set方法給屬性注入值
3:p名稱空間
4:註解
SpringAOP
面向切面編程
SpringAOP實現原理:代理模式
要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。
注意:AOP不是一種技術,其實是編程思想。凡是符合AOP思想的技術,均可以當作是AOP的實現。
Aop, aspect object programming 面向切面編程 功能: 讓關注點代碼與業務代碼分離! 關注點, 重複代碼就叫作關注點; 切面, 關注點造成的類,就叫切面(類)! 面向切面編程,就是指 對不少功能都有的重複的代碼抽取,再在運行的時候網業務方法上動態植入「切面類代碼」。 切入點, 執行目標對象方法,動態植入切面代碼。 能夠經過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。
實現方式:
1:註解
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> 開啓事物註解權限 4) 使用註解 @Aspect 指定一個類爲切面類 @Pointcut("execution(* com.itmayiedu.service.UserService.add(..))") 指定切入點表達式 @Before("pointCut_()") 前置通知: 目標方法以前執行 @After("pointCut_()") 後置通知:目標方法以後執行(始終執行) @AfterReturning("pointCut_()") 返回後通知: 執行方法結束前執行(異常不執行) @AfterThrowing("pointCut_()") 異常通知: 出現異常時候執行 @Around("pointCut_()") 環繞通知: 環繞目標方法執行
@Component @Aspect public class Aop { @Before("execution(* com.itmayiedu.service.UserService.add(..))") public void begin() { System.out.println("前置通知"); } @After("execution(* com.itmayiedu.service.UserService.add(..))") public void commit() { System.out.println("後置通知"); } @AfterReturning("execution(* com.itmayiedu.service.UserService.add(..))") public void afterReturning() { System.out.println("運行通知"); } @AfterThrowing("execution(* com.itmayiedu.service.UserService.add(..))") public void afterThrowing() { System.out.println("異常通知"); } @Around("execution(* com.itmayiedu.service.UserService.add(..))") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("我是環繞通知-前"); proceedingJoinPoint.proceed(); System.out.println("我是環繞通知-後"); } }
2:XML
XML方式實現AOP編程 Xml實現aop編程: 1) 引入jar文件 【aop 相關jar, 4個】 2) 引入aop名稱空間 3)aop 配置 * 配置切面類 (重複執行代碼造成的類) * aop配置 攔截哪些方法 / 攔截到方法後應用通知代碼
<?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" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- dao 實例 --> <bean id="userDao" class="com.itmayiedu.UserDao"></bean> <bean id="orderDao" class="com.itmayiedu.OrderDao"></bean> <!-- 切面類 --> <bean id="aop" class="com.itmayiedu.Aop"></bean> <!-- Aop配置 --> <aop:config> <!-- 定義一個切入點表達式: 攔截哪些方法 --> <aop:pointcut expression="execution(* com.itmayiedu.*.*(..))" id="pt"/> <!-- 切面 --> <aop:aspect ref="aop"> <!-- 環繞通知 --> <aop:around method="around" pointcut-ref="pt"/> <!-- 前置通知: 在目標方法調用前執行 --> <aop:before method="begin" pointcut-ref="pt"/> <!-- 後置通知: --> <aop:after method="after" pointcut-ref="pt"/> <!-- 返回後通知 --> <aop:after-returning method="afterReturning" pointcut-ref="pt"/> <!-- 異常通知 --> <aop:after-throwing method="afterThrowing" pointcut-ref="pt"/> </aop:aspect> </aop:config> </beans>