--- tags: java, spring, framework --- # Spring 5 Framework (尚硅谷) ## Episode 1: 大綱 - Spring框架概述 - IoC container - AOP - JDBC template - 事務管理 - Spring 5新特性 ## Episode 2: Spring的優點 - 高凝聚低耦合 - AOP - Unit test - 和其他框架整合 - 方便事務操作 - 降低API開發 - 經典學習典範 (大量採取正規的設計模式) ## Episode 3 - https://spring.io/projects/spring-framework - https://repo.spring.io/webapp/#/home - https://repo.spring.io/release/org/springframework/spring/ ![](https://i.imgur.com/V0GPVQZ.png) - https://www.jetbrains.com/idea/ ![](https://i.imgur.com/wJvyFfu.png) ![](https://i.imgur.com/ixQuxDZ.png) - Spring框架鳥瞰圖 ![](https://i.imgur.com/wfmmPX8.png) ![](https://i.imgur.com/RaBCoeI.png) ==去掉aop改加context才對== ==甚麼是expression?== - These 4 jar files depends on the logging utility: https://commons.apache.org/proper/commons-logging/ - 把五個基本的jar file引至專案內 - 定義一個新的類別,透過配置文件與ApplicationContext等Spring IoC容器進行測試。 ## Episode 4 and 5: IoC - 利用Dependency Injection (DI)實現。 - 技術基礎:XML解析、工廠模式、反射 (reflection) - XML文件配置 - 定義工廠類別 - 透過Class.forName()取得該字串對應的類別,最後newInstance()。 - IoC容器 = 工廠 - **BeanFactory**: for internal usage - **ApplicationContext**: for application developers - ClassPathXmlApplicationContext - FileSystemXmlApplicationContext ## Episode 6--10: Bean Management - XML - Common attributes - id: alias - class: classpath.classname ```xml <bean id = "id_name" class = "com.spring5.demo"></bean> ``` - Note that no-arg constructors will be invoked. - 屬性注入 by xml - 方法 ```xml <property name = "name" value = "val"></property> <property name = "another name" ref = "reference class"></property> ``` - 建構子 ```xml <property name = "name" value = "val"></property> ``` - 屬性特殊值 - null ```xml <null/> ``` ## Episode 11: DAO - Data access object: a pattern that provides an abstract interface to some type of database or other persistence mechanism. - By mapping application calls to the persistence layer, the DAO provides some specific data operations without exposing details of the database. - Reference https://en.wikipedia.org/wiki/Data_access_object ## Episode 12--14 - 注入Collection - 共用程式碼提取 by xml ## Episode 15: Types of Beans - **Common beans** - **Factory beans**: return an object with the type different from the factory bean - Object getObject() - Class<?> getObjectType() - boolean isSignleton() - References - https://www.baeldung.com/spring-factorybean/ Current epsiode: https://www.bilibili.com/video/BV1Vf4y127N5?p=16 ## Episode 16 & 17 - Bean scope ```xml <property ... scope = "singleton"></property> ``` - 預設為單例 (singleton)! - 設定為prototype,則可切換成非單例。 - Deep copy? - 初始化: init-method - 銷毀: destory-method; invoked by context.close() - 後置處理器 BeanPostProcessor ## Episode 18--24 ```xml= <bean id = "id" class = "..." autowire = "byName"></bean> ``` - autowire - byName: id & class - byType: by id, 較寬鬆? - 外部文件 - 直接配置DB connection pool - Connection pool? - DruidDataSource - 外部配置文件:jdbc.properties - ${...} - 如何使用標注的方式進行bean管理 - 簡化XML配置方法。 - Spring的Bean管理標註 - @Component - @Service - @Controller - @Repository - 步驟 - 引入AOP - 掃描元件 ```xml= <context:component-scan base-package = "..."></context:component-scan> ``` - user-default-filters - include-filter - exclude-filter - 自動配置 - @AutoWired - @Qualifer - @Resource: removed after JDK11 - @Value - 完全註解開發:利用組態類別(SpringConfig)取代XML - @Configuration - @ComponentScan(basePackage = "...") ```java ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); ``` - SpringBoot: auto-config ## Episode 25--32: Aspect-Oriented Programming (AOP) - 精神:不改變原始程式碼的情況之下,新增/強化原始程式碼的功能。 - Example 1: 登入帳號 + 權限分級 - Example 2: 交易流程 + transaction logging - 有介面的情況:利用實現另外一個物件並參考原始物件來達成。 - 無介面的情況:利用繼承父類。 ==讀到這裡其實不就是inheritance和delegation選一個實現嗎?而且後者的耦合比較低== - JDK dynamic proxy - Reference https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Proxy.html ```java= import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxyDemo { public static void main(String[] args) { Class[] interfaces = {UserDao.class}; UserDao dao = (UserDao) Proxy.newProxyInstance(DynamicProxyDemo.class.getClassLoader(), interfaces, new UserDaoProxy(new UserDaoImpl())); int result = dao.add(1, 2); System.out.println("Answer = " + result); } } class UserDaoProxy implements InvocationHandler { private Object obj; UserDaoProxy(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before proxy..."); int result = (int) method.invoke(obj, args); System.out.println("After proxy..."); return result; } } interface UserDao { int add(int x, int y); } class UserDaoImpl implements UserDao { @Override public int add(int x, int y) { System.out.println("Adding " + x + " + " + y + "..."); return x + y; } } ``` - 專有名詞 - Aspect - Weaving - Joint point - Target object - Target method - Advice - Before - After - After throwing - Finally - Pointcut - Introduction - AOP proxy - Aspect早於Spring,我們利用已經存在的Aspect來實現AOP。 - 實現方式: __xml__ or __annotation__ ==後者為目前主流做法,以簡潔著稱== - 以xml的方式完成,詳見 https://www.bilibili.com/video/BV1Vf4y127N5?p=31 - 以annotation的方式完成,詳見 https://www.bilibili.com/video/BV1Vf4y127N5?p=32 - 需要的相依套件 ![](https://i.imgur.com/gddN8gY.png) ==可以用maven或gradle處理依賴套件?== ## Episode 33--39: JDBC Template ## Episode 40--49: Business logic - 事務==check英文==為資料庫操作的最基本單元,必須滿足**ACID**原則: > ACID是指資料庫管理系統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。 - Example: 轉帳 - build up a database, say MySQL. ## Episode 50--52: New features in Spring 5 ## Episode 53--61: WebFlux