Java Spring Framework - The first sight

Intro

Spring Framework是給程式開發者開發應用程式的基礎框架,前導概念,What is Java Bean? 跟POJO的差別是什麼?POJO就是最單純的Java Object,是Plain Old Java Object的縮寫。Beans 是 POJO的其中一個特別型態。Bean 可序列化(必須要implement serialization interface)、欄位皆為private並提供getter and setter、必存在無參數的建構子、欄位只能藉由建構子或getter and setter進行修改。

 IoC

 IoC (inversion on Control) 反轉控制是物件導向設計的一種原則,降低程式碼之間的耦合度,最常見的方法較依賴注入 DI (Dependency Injection),還有其他方法叫依賴尋找 DL (Dependency Lookup)。而Spring Framework實作了這個方法。
在Spring裡看到以@Component(以及他的好夥伴@service, @Repository)的annotation,是來定義可以被Spring IoC engine 實例化的class。

Spring Core Annotations

藉由org.springframework.beans.factory.annotation 與org.springframework.context.annotation packages 來發揮 dependency injection 最大效益
DI-related annotations
  1. @Autowired - 去標記Spring 要去解析、注入的物件。找到對應的Bean內容注入、並生成物件的方法。
  2. @Bean - 標示為Spring Bean實例化的factory method,當需要新實例 return type ,Spring 會call 此method
  3. @Qualifier
  4. @Required
  5. @Value
  6. ... 等
Context configuration annotations - 用annotation描述 application context
  1. @Profile
  2. @import
  3. ...等

Spring Web Annotations

這是關於org.springframework.web.bind.annotation package的內容,在@controller中可設置的request種類
  1. @RequestMapping - http request handler
  2. @RequestBody
  3. @PathVariable
  4. @RequestParam
response 種類
  1. @ResponseBody
  2. @ExceptionHandler
  3. @ResponseStatus
Other web annotation
  1. @Controller - MVC 架構不可缺少的控制器,在Spring Bean Annotation
  2. @RestController - 結合@Controller and @ResponseBody
  3. @ModelAttribute - 可以讀取已存在@Controller MVC架構中的元素
  4. @CrossOrigin

Spring Boot Annotations

讓管理Spring更加方便 by auto-configuration, 屬於 org.springframework.boot.autoconfigure 與 org.springframework.boot.autoconfigure.condition packages
@SpringBootApplication - mark the main class of a Spring Boot application * 他封裝了@Configuration , @EnableAutoConfiguration and @ComponentScan annotation with 預設值
@EnableAutoConfiguration - Spring Boot 去偵測路徑中auto-configuration beans並自動應用他(需搭配@Configuration)
Auto configuration
  1. @ConditionalOnClass and @ConditionalOnMissingClass
  2. @ConditionalOnBean and @ConditionalOnMissingBean
  3. @ConditionalOnProperty
  4. ...等

Spring Scheduling Annotations

當single-threaded 應用程式無法滿足需求,可以用scheduling.annotation package
@EnableAsync - 啟用非同步功能於Spring, 需要伴隨著 @Configuration. 接著就可以在定義的method上加入@Async
@EnableScheduling - 啟用此configuration,就能夠定時去跑有@Scheduled的methods
@Async - 定義執行在不同thread的method,以打到異步。注意必須搭配先前的EnableAsync
@Scheduled - 定期執行可以加入此annotation,可給予固定時間區間,或是cronjob形式的定時執行。更可以用Java 8的repeating annotations feature去針對某一個method定義多種schedule。Method必須為void。
@Schedules - 用來用來指定多個@Scheduled,也就是把上面的多項放在同一個section容易閱讀

Spring Data Annotations

Spring Data提供抽象的data storage technology,讓商業邏輯能夠與持久層獨立開發,並且也簡化對Data storage的dependency
Common Spring Data Annotations
  1. @Transactional - 設定有 transactional 行為的method,資料存入Data Storage。
  2. @NoRepositoryBean - 有時我們希望建立repository interface的目的是要提供子repository有共同的方法,但並不想要建立這些父類別的Bean。用code解釋

@NoRepositoryBean
interface MyUtilityRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Optional<T> findById(ID id);
}

@Repository
interface PersonRepository extends MyUtilityRepository<Person, Long> {}
  1. @Param - pass named parameters
  2. @Id - primary key
  3. @Transient - data storage engine 不會讀寫該變數
  4. @CreatedBy, @LastModifiedBy, @CreatedDate, @LastModifiedDate - 可作audit
Spring Data JPA Annotations
  1. @Query - 顧名思義可以用JPQL語法去操作DB
  2. @Procedure - call stored procedures
  3. @Lock - 在執行資料存取時上鎖,鎖的總類如:READ, WRITE, OPTIMISTIC, OPTIMISTIC_FORCE_INCREAMENT, PESSIMISTIC_READ, NONE, etc
  4. @Modifying
  5. @EnableJpaRepositories - 若是用JPA則需要讓Spring知道
Spring Data Mongo Annotations - 方便操作MongoDB
  1. @Document - 如同JPA版本的@Entity
  2. @Field - 如同 JPA的@Column
  3. @Query
  4. @EnableMongoRepositories

Spring Bean annotations

除了上述那幾個設定beans的core annotation,更可以用org.springframework.stereotype package 註記讓其餘部分留給component 掃描
@ComponentScan - Component Scanning, 指定掃描含有annotation configuration的package。
@Component - 是class level annotation, 在component scan時,Spring Framework 自動偵測含有@Component的class。預設bean instance會與class同名。由於@Repository, @Service, @Configuration and @Controller都是@Component的meta-annotation (元註解,annotation 的annotation),因此共享相同命名行為。
@Repository - 透過此annotation讓DAO 或Repository classes用來表達access layer
@Service - 撰寫application business logic所屬的service layer
@Controller - class level annotation, 讓Spring Framework這class在MVC中最為controller
@Configuration - 設定包含bean definition method的 Bean class

 Stereotype Annotation and AOP(Aspect Oriented Programming) - 當使用Stereotype annotation時,很容易針對該stereotype target建立切入點。以下面範例為例,當切入點(pointcut)matches所有用到annotation with @Repository,並用@Around 去加裝在target method外面,就可以計算該method執行時間。


@Aspect
@Component
public class PerformanceAspect {
    @Pointcut("within(@org.springframework.stereotype.Repository *)")
    public void repositoryClassMethods() {};

    @Around("repositoryClassMethods()")
    public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint)
        throws Throwable {
            long start = System.nanoTime();
            Object returnValue = joinPoint.proceed();
            long end = System.nanoTime();
            String methodName = joinPoint.getSignature().getName();
            System.out.println(
                "Execution of " + methodName + " took " +
                TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
            return returnValue;
    }
}


references:

留言

這個網誌中的熱門文章

[專案] 銀行端末系統

如何在MacOS 中自由切換不同Python版本 - pyenv + virtualenv

用 C# 控制 Win7 輸入法