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
- @Autowired - 去標記Spring 要去解析、注入的物件。找到對應的Bean內容注入、並生成物件的方法。
- @Bean - 標示為Spring Bean實例化的factory method,當需要新實例 return type ,Spring 會call 此method
- @Qualifier
- @Required
- @Value
- ... 等
Context configuration annotations - 用annotation描述 application context
- @Profile
- @import
- ...等
Spring Web Annotations
這是關於org.springframework.web.bind.annotation package的內容,在@controller中可設置的request種類
- @RequestMapping - http request handler
- @RequestBody
- @PathVariable
- @RequestParam
response 種類
- @ResponseBody
- @ExceptionHandler
- @ResponseStatus
Other web annotation
- @Controller - MVC 架構不可缺少的控制器,在Spring Bean Annotation
- @RestController - 結合@Controller and @ResponseBody
- @ModelAttribute - 可以讀取已存在@Controller MVC架構中的元素
- @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
- @ConditionalOnClass and @ConditionalOnMissingClass
- @ConditionalOnBean and @ConditionalOnMissingBean
- @ConditionalOnProperty
- ...等
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
- @Transactional - 設定有 transactional 行為的method,資料存入Data Storage。
- @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> {}
- @Param - pass named parameters
- @Id - primary key
- @Transient - data storage engine 不會讀寫該變數
- @CreatedBy, @LastModifiedBy, @CreatedDate, @LastModifiedDate - 可作audit
Spring Data JPA Annotations
- @Query - 顧名思義可以用JPQL語法去操作DB
- @Procedure - call stored procedures
- @Lock - 在執行資料存取時上鎖,鎖的總類如:READ, WRITE, OPTIMISTIC, OPTIMISTIC_FORCE_INCREAMENT, PESSIMISTIC_READ, NONE, etc
- @Modifying
- @EnableJpaRepositories - 若是用JPA則需要讓Spring知道
Spring Data Mongo Annotations - 方便操作MongoDB
- @Document - 如同JPA版本的@Entity
- @Field - 如同 JPA的@Column
- @Query
- @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:
留言
張貼留言