Java

Java コードリーディングのコツ

この記事は 品川 Advent Calendar 2019 の5日目です。 OB 枠での参加です。いったいどこの某弊社なんでしょうか… 。 本記事は Eclipse で Java ライブラリのコードリーディングを行うときのコツをまとめます。あくまでも「自分はこんな考え方やテクニックを…

Java オブジェクトの比較に関するひっかけ問題

検証環境 ]$ uname -a Linux localhost.localdomain 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux ]$ java -version openjdk version "11.0.1" 2018-10-16 LTS OpenJDK Runtime Environment 18.9 (build …

Spring なぜMyBatisの実行したSQLがSpringの管理しているトランザクションで実行できるのか?

なぜMyBatisの実行したSQLがSpringの管理しているトランザクションで実行できるのか、を調べる。そのために、 mybatis-spring の実装を追っていく。 対象バージョン java version "11.0.1" 2018-10-16 LTS Spring Boot 2.1.2.RELEASE mybatis-spring-boot-st…

Deep Dive into MyBatis

検証環境 java 11.0.1 2018-10-16 LTS MyBatis 3.4.6 サンプルコード 以下を実行しながら、処理の流れを追っていく。 複雑な箇所は適宜、シーケンス図を作成する。(メインの流れではないと判断したところは適宜省略して記載するので、正確さにはやや欠けます…

Java いまふたたびのJDBC

この記事は Java Advent Calendar 2018 の 9 日目のエントリーです。 流行をとらえた話題が多いなか、10~15年前感のあるコンテンツです。化石です。 しかし化石とはいえ、よく使う技術ではあります。 ということで、何気なく使ってたけど改めて勉強し直しま…

Micrometer Spring Boot アプリケーションのモニタリング

2018/10/31 の Spring Festで『Micrometer/Prometheusによる大規模システムモニタリング 〜ヤフーインターネット広告システムでの導入事例〜』というセッションを聴講し、興味を持ったので調べました。 Micrometerは、Spring Boot Actuatorが内部で利用して…

Spring MultipartFile アップロードが完了しないとControllerのメソッドは呼ばれないぞ!

MuitipartFileとは? MultipartFileとは、ファイルのアップロード機能をアプリケーションコード内で透過的に扱うためのクラスです。アップロード機能の実装は、Servlet 3.0のファイルアップロードか、Apache Commons Fileuploadから選ぶことができます。 具体…

BLOBをデータベースで管理する

はじめに 突然ですが、皆さんはアプリケーションで扱うBLOBデータをどこに保存しているでしょうか?大きく分けると、以下のいずれかになると思います。 ファイルストレージ データベース オブジェクトストレージ いずれも一長一短ありますが『SQLアンチパタ…

Rxjava ConnectableFlowable(Hotストリーム)のオペレータ

以下のバージョンで検証しました。 pom.xml <dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.14</version> </dependency> ConnectableFlowable ConnectableFlowableはHotなストリームで、複数のSubscriberに同じストリームを購読させるときに利用するクラス。 参考 ConnectableFlowable Javadoc p…

Rxjava onBackpressureBufferはいつ溢れるか?

前提知識 RxJavaにはバックプレッシャと呼ばれる、流量制御の仕組みがある。 参考 詳解RxJava2:Backpressureで流速制御 onBackpressureBuffer PublisherがSubscriberの消費スピードよりも早くデータを作った場合、バッファに生成されたデータを溜めておきた…

RXJava 無限ストリームでdistinct使ったらどうなる?

検証バージョン Java 1.8.0_25 RxJava 2.1.14 distinct distinct はフィルタ系操作の一つで、重複要素を取り除くためのメソッドです。 重複要素を取り除くためにはどこかに比較対象が存在しないといけないわけで、じゃあ無限ストリームとかどうやって対応す…

MyBatis 利用時に SQL で FULL OUTER JOIN するときの注意点

検証環境 mybatis 3.4.5 java 1.8.0.25 ハマったこと DBに以下のようなデータが入っているときに SQL で FULL OUTER JOIN すると、以下のようになる。 これに対応するJavaのBeanを用意して、 @Data public class Shelf { private Long id; private String na…

Tomcat リソース設定(maxThreads,maxConnections,acceptCount)のちがい

maxThreads リクエストを処理するスレッド数(workerスレッド)の上限 1リクエストを処理するために1workerスレッドを消費する コネクタ(HTTP1.1, AJPなど)ごとの上限 ただしスレッドプールをexecutorプロパティで指定した場合、この上限は無視される maxConne…

Spring Securityで特定ヘッダーがついてるときだけ認証をパスさせる方法

以下、Basic認証を例に取り上げる。 何をしたいか? アプリケーションに認証をかける。 $ curl -i -u 'user:pass' localhost:8080/api/sample HTTP/1.1 200 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Cache-Control: no-cache, no-s…

Javaアプリケーション ログ出力パターン

はじめに アプリケーションレベルのログ 実現方法 注意点 ミドルウェアレベルのログ 起動スクリプトや終了スクリプトのログ 最近の流行り はじめに Javaでアプリケーションを構築する時に考慮すべきログは、3つに分類できると考えている。 アプリケーション…

Javaのビルドの基礎知識

Javaのビルド関連の知識については、Java学習初期にこんなコード書いて終わり、あとは便利なビルドツール(mavenやらgradle)に任せようって感じで知識が薄かった。 $ cat Sample.java public class Sample { public static void main(String[] args) { System…

Spring 非同期タスクの同時実行数を制限する

課題 Springには、非同期に処理を実行するための@Asyncアノテーションがある。 参考 7. Task Execution and Scheduling www.kimullaa.com デフォルトだとスレッド管理(TaskExecutor)にSimpleAsyncTaskExecutorが使われる。 このクラスは@Asyncの呼び出しごと…

Maven 「mvn checkstyle:checkstyle」みたいなコマンドと「mvn test」みたいなコマンドのちがい

疑問点 「:」でつないで実行するコマンドと、 $ mvn checkstyle:checkstyle 「:」なしで実行できるコマンドがある。 $ mvn test この差は何か? 結論 「mvn checkstyle:checkstyle」は「ゴール」 「mvn test」は「フェーズ」 ゴールとは? mavenのpluginそ…

SpringのContextHolderいろいろ

Springには、…ContextHolderというクラスがある。スレッドローカルに値を保存しておくことで、情報をいろんなところから参照できるようにする。スレッドローカルは…まあスレッド固有の値ですよね。(あたりまえ)TomcatなどのAPサーバはリクエストごとにwork…

Java ブロッキングとかノンブロッキングを理解したい

この記事はブロッキングやノンブロッキンクとは何か、Servlet3.0の Async Servletや Servlet3.1の NonblockingI/Oとは何か、を理解することが目的です。 検証バージョン ブロッキングI/O コード例(シングルスレッド) 実行例 コード例(マルチスレッド) 実行例…

Spring @RequestScopeや@SessionScopeはどこに保存されるのか?我々は真相に迫った

ある日の出来事 SpringのBeanのスコープ、便利ですよね。ライフサイクル管理を任せられるのはDIコンテナを利用するメリットの大きなところだと思います。 いつも私は、何も考えずに以下のようにコーディングして、Springコンテナにスコープ管理を任せていま…

Spring @Asyncで非同期処理をするときの注意点

@Asyncアノテーションとは 非同期に処理を実行できるようにする仕組み。 参考 7. Task Execution and Scheduling 参考 Spring MVC(+Spring Boot)上での非同期リクエストを理解する -前編- 簡単なサンプル pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta</artifactid></parent>…

Spring Framework で同一アプリ内でのイベントを扱う(ApplicationEvent、EventPublisher)

なぜイベントを使うのか デフォルトで提供されているイベント Listenerの実装方法 ApplicationListenerを実装する方法(~spring4.1) @Eventlistenerアノテーションを使う方法(spring4.2~) カスタムイベントの実装方法 サンプルアプリの題材説明 Application…

Spring管理外のクラスでSpringのBeanを使う

Spring管理外のクラスでSpringのBeanを使う Spring管理外のクラスでSpringのBeanを使いたい場面がある。 そもそも自分でnewすればいいだけでは?という場面もあるけど、@ProfileでどんなBeanが来るのか実行時までわからない、とか複雑な初期化あるとかいう前…

Spring REST Docs でAPIドキュメントを作成する

この記事の内容 Spring REST Docsを利用すれば、テストコードから以下のようなAPIドキュメントを作成できるようになる。 この記事の内容 Spring REST Docs とは サンプル 使い方 mavenのpom.xmlにversionを指定する Asciidoctorでasciidocからhtmlを生成する…

SpringBoot @Valueで任意の型にセットする CustomPropertyEditorの作成

はじめに Springには外部定義から値を読み込んで、Javaのフィールドにセットする機能がある。application.propertiesにメッセージを記述し、 message=helloJavaクラスで利用すると、 @Service public MessageServiceImpl implements MessageService { @Value…

SpringMVC 複数のフォームオブジェクトにバインドする方法

よくやり方忘れるのでメモ。 こんな画面をSpringMVCで作りたい familyNameとgivenNameが1つのFormで、それを複数繰り返す。 実装方法(サーバ側) Controllerクラスの引数に受け取るFormを用意する 本筋と外れるけど、入力値チェックも設定する。 @Data @AllAr…

SpringSecurity 権限に基づいた認可をする

課題 SpringSecurityのサンプルでは、以下のようにROLEに基づいて認可していることが多い。 @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMI…

SpringのAOP @Pointcutの使いどころ

SpringのAOP @Pointcutの使いどころ SpringのAOPのアノテーションで、@Pointcutだけ使い方がよくわからなかったのでメモ。 SpringのAOPってなに? 具体的な処理と関係のない処理(ロギングとか)が混じっていると、煩雑になって保守性が下がる。なので、具体的…

SpringSecurityでEL式を拡張してカスタムルールを作るときのメモ

SpringSecurityでカスタムルールを作る SpringSecurityで提供されているEL式(hasRole()とか)で足りなくなった場合に、独自のEL式を作成する方法のメモ。前の記事で作成してたプロジェクトからちょっとカスタマイズして作成。 SpringSecurityでFORM認証 - SIe…