Spring開発テクニックガイド、Springの世界に連れて行く(コレクションを強くお勧め)


Spring開発ガイドはSpringが公式に提供したSpring技術の入門レベルの学習ガイドであり、内容のテーマはSpring技術スタックを全面的にカバーしており、各ガイドは標準化された学習プロセスに従い、初心者から特別テーマの紹介まで、基礎概念の紹介からコード実戦まで、つまりあなたは何もできなくても、ゼロからドキュメントについて一歩一歩コードを完成することができます.最終的に学習を完了するのは難しいことではありません.各ガイドでは、さまざまな主流構築方式(Maven、Gradle、IDE)が同時に提供されています.プロジェクトの完全なソースコードはGithubでダウンロードできます.コンテンツは最新バージョンと同期して更新され、学習の参考と指導性があり、初心者の技術入門と新しい技術の理解には良い選択です.
どんな資料をお勧めするかと聞かれたら、まず公式の開発ガイドをお勧めし、各フレームワークに合わせてドキュメントを参考にして、入門学習として十分です.しかし、多くの人を退却させたのは「大きな英語を見ていると頭が痛くなる」という問題で、これは確かに問題であり、コードを書きながらオンラインで資料を翻訳しなければならない.プロのソフトウェア開発者として、これは必ず通らなければならない道のようです.いくら歩いても最初の場所に戻らなければなりません.ソースコードと参考ドキュメントはその「最初の場所」です.もちろん、私も理解できます.英語を勉強するのも「一朝一夕のこと」ではありません.
Spring開発ガイドについて
Spring開発ガイドは3つのタイプに分かれています.
クイックスタート(Getting Started Guides)は、初心者向けに一般的にSpringテクノロジーを使用して「Hello World」などの簡単な例を構築し、15~30分の時間で特別ガイドを学習します.(Topical Guides)は、初心者よりも入門内容が広く、独特の観点を持つ技術説明であり、技術とフレームワークを全面的に理解するアーキテクチャ設計に適しており、学習時間は1時間程度でチュートリアル(Tutorials)を学び、より深くテーマの企業レベルの応用開発を行い、現実世界の複雑な問題の解決策を提供し、学習時間は2~3時間である.
初心者の入門段階では、学習内容を理解し、学習任務を順調に完成するのに役立つ基礎知識と概念を事前に理解する必要があります.例えば、JSON、REST、POJO、JavaScript、Tomcatなど、その他にもJava SDK、Git、STSなど、よく使われるJava関連の開発ツールをインストールする必要があります.
現在提供されているクイックエントリーは69編発表されています.トピックは、フロントエンド(jQuery、AngularJS、Vaadin)、ツール(Maven、Gradle、STS、IntelliJ IDEA.)、データ(MySQL、JPA、Redis、MongoDB、Neo 4 j)、メッセージとサービス(JMS、Web Service)、クラウド(Google Cloud、Cloud Foundry、ゲートウェイ、構成管理)、テスト、セキュリティなど、すでにかなり全面的になっています.テーマはSpring Securityに関するものしかありません.これは現在いくつかの関連記事を書いています.チュートリアルには現在も5編ありますが、まだもっと完璧な内容があります.特にSpring Cloudについては不足しています.
Spring日常開発テクニック
汎用注記
@Component

@Configuration

dao層
@Repository

サービス層
@Service


コントロールクラス:
1. @Controller 
2. @RestController  = @Controller +  @ResponseBody

3.    ,    ,     @RequestMapping        ,
@ControllerAdvice(assignableTypes = {
     MyController.class}) 
          
3.1  @ExceptionHandler({
     Throwable.class}) 
  @ExceptionHandler({
     Throwable.class})
    public ResponseEntity<String> res(Throwable throwable){
     
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(throwable.getMessage());
    }        
        
        
3.2  @ModelAttribute("acceptLanguage") 
     @ModelAttribute
     public void addAttribute(Model model) {
     
        model.addAttribute("attribute",  "The Attribute");
    }
        
3.3 @CookieValue
3.4 @InitBinder  :      @RequestMapping    ,               ,  :
	 @InitBinder
     public void initBinder(WebDataBinder binder) {
     
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
        
    }
   
3.5 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)     
		
     
4. @RequestMapping 
 
    
5. ResponseEntity    

注入プロパティ
@Data
@ConfigurationProperties(prefix = "anthony")
public class MyProperties {
     

	@value(${
     "anthony.name"})
    String name;

    String age;

    String info;

    
    //                     
    @PostConstruct
    public void doFirst() {
     
        System.out.println("name = " + name);

        System.out.println("age = " + age);

        System.out.println("info = " + info);

        this.info = "modify";
    }

}

//     EnableConfigurationProperties    MyProperties    @Configuration  
@EnableConfigurationProperties(MyProperties.class) 
@RestController
public class MyController {
     

    @Autowired
    MyProperties properties;
}    

ユニットテストクラス
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringValidatorApplicationTests {
     

    @Test
    @After
    @Before
    public void test(){
     
        
    }

}

validateデータチェック
@Data
public class MYData {
     


    @NotNull(message = "      ")
    @Min(value = 18,groups = Adult.class)
    @PositiveOrZero(message = "    0")
    private Integer age;

    public interface Adult{
     }

    public interface Minor{
     }
    
}

    @RequestMapping("/live")
    public String live(@Validated({
     MYData.Adult.class}) MYData foo, BindingResult bindingResult) {
     
        if(bindingResult.hasErrors()){
     
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
     
                //...
            }
            return "fail";
        }
        return "success";
    }

    @NotBlank
    @NotEmpty
    @NotNull(message = "      ")
    @Min(value = 18,message = "  ")
    @PositiveOrZero(message = "    0")


@Validated({
     MYData.Adult.class})     groups              ,         
@Valid          
BindingResult         

aop
1.    log  
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
     
    String value() default "";
}

2.     log aop  

@Aspect
@Component
public class LogAspect {
     


    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    //        @log          
    @Pointcut("@annotation(com.spring.springvalidator.aop.Log)")
    public void logPointCut() {
     
    }


    //    
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
     
        Object result =null;
        try {
     
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();

            //        
            logger.info("doBefore :      : " + request.getRequestURL().toString());
            logger.info("doBefore :  HTTP METHOD : " + request.getMethod());
            logger.info("doBefore :  CLASS_METHOD : " + point.getSignature().getDeclaringTypeName() + "."
                    + point.getSignature().getName());
            //     
            result = point.proceed();

            logger.info("doBefore  :       : " + Arrays.toString(point.getArgs()));

            logger.info("doBefore :        : " + result);

            logger.info("doAfterReturning");
            return result;

        } catch (Exception e) {
     

            logger.error("doAfterThrowing :  {} ", e.getMessage());
            throw new RuntimeException("runtime  exception");
        } finally {
     
            logger.info("doAfter");
        }
        
    }

@Aspect
@Component
public class WebLogAspect2 {
     

    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect2.class);

    //  
    //  ..       ,        ..      
    @Pointcut("execution( * com.spring.springvalidator.web.*.*(..))")
    public void logPointCut() {
     
    }

    //     
    @Before("logPointCut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
     
        logger.info("doBefore");

    }
    
    //     
    @AfterReturning("logPointCut()")
    public void doAfterReturning(JoinPoint joinPoint){
     
        logger.info("doAfterReturning");
    }
    //     
    @AfterThrowing("logPointCut()")
    public void doAfterThrowing(JoinPoint joinPoint){
     
        logger.info("doAfterThrowing");
    }

	//    	
    @After("logPointCut()")
    public void doAfter(JoinPoint joinPoint){
     
        logger.info("doAfter");
    }
}


         :
doBefore  do(controller)  doAfter  doAfterReturning\doAfterThrowing



       , 

    @Around("logPointCut()")
    public Object aroundLog(ProceedingJoinPoint pjp) {
     
        Object reValue = null;
        try {
     
            //      : 
            Object[] args = pjp.getArgs();
            logger.info("doBefore");

            reValue = pjp.proceed(args);

            logger.info("      : {} ", reValue);
            logger.info("doAfterReturning");
            return reValue;
        } catch (Throwable throwable) {
     
            logger.info("doAfterThrowing");
            throw new RuntimeException(throwable);
        } finally {
     
            logger.info("doAfter");
        }
    }

  doBefore  doAfterReturning/doAfterThrowing   doAfter

ブロッキング
@Configuration
public class WebConfig implements WebMvcConfigurer {
     

    /**
     *      
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
     
        registry.addInterceptor(new HandlerInterceptor() {
     

            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     
                //   
                System.out.println("    1");
                return true;
            }
        });

        registry.addInterceptor(new HandlerInterceptor() {
     

            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     
                //   

                System.out.println(handler);

                System.out.println("    2");
                response.setStatus(400);
                return false;
            }
        });
    }

}

学習アドバイス
Springテクノロジーに触れたばかりの場合は、初心者から始め、サンプルに従ってコードを一歩一歩完成させることをお勧めします.これにより、Springフレームワークに対応する参照ドキュメントを検索することができる基本的な認識が得られます.現在のほとんどの例はSpring Bootを直接使用して開発されていますが、最初は簡単で迅速で、少量のコードと少量の構成ですぐに実行できると思っていました.これは初心者にとっては誘惑で、長い間錯覚していました.簡単だと思っているのは当然です.そう考えると、後ろは必ず損をして穴を踏んで心理的に挫折する.
Springのプロジェクトはますます多くなり、各フレームワーク間の統合と依存もますます密接になっています.自動アセンブリは構成を減らし、しかし、構成がどこにもないようにします.(条件とルールはコードに隠されているだけ)エラー後の位置決めと解決の難しさが増しています.様々なstartersはサードパーティのプロジェクトの直接的な依存を遮断しているだけですが、このような依存は依然として存在し、依存が何なのかを知る必要があります.だから、学習の過程で、他のフレームワークとライブラリを学ぶ必要があります.それらを理解する必要があります.
Java EEのいくつかの仕様、Spring Frameworkなど、最も基礎的な技術は、Spring Boot、Spring CloudがSpring Frameworkを学ぶ必要がないと考えている人もいますが、これはもちろん間違っています.門を案内した後、残りは時間がかかり、絶え間ないプロジェクトの実戦と学習模索の中で「The Spring Way」を悟る!
ドキュメントとコードのダウンロード
現在、公式の開発マニュアルのドキュメントとコードはGithubに管理されており、すべてのコードはASLv 2を遵守しているが、すべてのドキュメントはAttribution、NoDerivatives creative commons licenseを遵守しており、誰もが読むことができ、ダウンロードすることができ、配布を含むが、演繹を禁止し、修正と翻訳を許さない.
本文があなたに役に立つと思ったら、フォローアップサポートを転送してもいいです.