🌐

Spring Freamworkをなんで使っているか

2022/10/22に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 私が勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 私が間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

私はJavaエンジニアとしてSpring Freamworkを使っています。
SpringはJavaエンジニアなら知っておくべきだと思っています。
また、Springの誕生背景などの歴史も知っておくと、技術を使う際に正確な目的を持って使えると思います。

Spring

Spring以前Struts、J2EE EJBなど様々なフレームワークがありましたが、
現在、JavaFreamworkではSpringのみ存在していると言っても過言ではありません。
その理由を勉強してみましょう。

J2EE EJBからSpring

多くのエンジニアがSpringを使っている理由を知るためには、EJBを知っておくと役立ちます。
EJBはEnterprise JavaBeansの略です。ここでJavaBeansとは、Javaオブジェクトを再利用できるようにコード作成方針を定義したものです。エンジニアはコードを作成していると、多くのJavaオブジェクトを作成します。EJBは作られた多くのJavaオブジェクトを管理するEJB Containerを作ります。必要な時にEJB Containerからオブジェクトを受け取ると効率的な開発ができるという趣旨で作られました。
しかし、EJB Container使うためにはContainerと繋げる多くのコードを作成しなければいけません。まさにこのコードの量はビジネスロジックより長いです。また、vendor社によってEJB Containerを具現した内容が異なるので、他のvendor社のEJB Containerに変えることが難しいです。したがって、プロジェクトが特定のテクノロジーに従属する問題が生じます。Javaの長所であるオブジェクト指向ができません。
Springはこのような問題解決とエンジニアに便利さを与えます。Springは既存のEJBの機能を維持しながらContainerと繋げるため作成したコードをもう作成しなくても使えるようにします。また、複数のオブジェクトの依存性(DI)および制御(IoC)を代わりにすることで開発者がビジネスロジックに集中できるしてくれます。

Dependency Injection(DI)とInversion of Control(Ioc)

ファイル名
private SushiRecipe sushiRecipe;

    public Chef() {
        sushiRecipe = new SushiRecipe();
    }

シェフは、使えるレシピの種類によって作れる料理が変わると仮定します。この時、シェフはSushiRecipeに従属すると言います。なぜなら、レシピが変わるたびにシェフが作れる寿司の種類にも影響が出るからです。

ファイル名
public class Chef {

    private Recipe recipe;

    public SushiChef() {
        recipe = new SushiRecipe();
        //recipe = new SpaghettiRecipe();
        //recipe = new PizzaRecipe();
    }

    interface Recipe {
        newRecipe();
    }

    class SushiRecipe implements Recipe {
        public Cook newRecipe() {
            return new Sushi();
        }
}

より多様なRecipeに依存してもらえるようにinterfaceにします。これで、より多くの料理を作ることができるシェフになりました。このようにinterfaceにすると、様々な依存関係を結ぶことができます。また、役割と実装を分離できるようになります。
Springが代わりにオブジェクトを制御することで(Ioc)可読性、再利用性が良くなります。
役割と実装が分離されたため依存性も低くなります。

DI実装方法

ファイル名
class Chef {
    private Recipe recipe;

    public Chef(Recipe recipe) {
        this.recipe = recipe;
    }
}

class SpringRecipe {
    private Chef chef = new Chef(new SushiRecipe());

    public void changeMenu() {
        chef = new Chef(new SpaghettiRecipe());
    }
}

constructorでSpringからDIをもらいます。

@Bean, @Autowired

@Beanを使って当該オブジェクトをContainerに登録し、@Autowiredを使って必要なオブジェクトを注入します。


写真のように@Beanと@Autowired使うとSpringに任せようになります。

まとめ

  • Springに提供するDI、IoCを利用するとエンジニアはビジネスロジックに集中できる。
  • @Bean、@AutowiredでIoC、DIを設定できる

Discussion