Springの一番基本になるのが、Springコンテナ。

概要

Springの一番基本になるのが、Springコンテナ。

Springコンテナを利用してオブジェクトを生成することで、
次のようなメリットを利用できる。

  • DIできる。
  • AOPできる。
  • Webコンテナにもなる。
  • データソースの管理ができる。
  • …などなど色々。

逆にいうと、
Springの機能やモジュールを利用する場合は、
Springコンテナを利用しなくてはいけない。

Springコンテナのことを「DIコンテナ」「Iocコンテナ」など
いろいろな呼び方をする場合がある。

また、「Springコンテナ」というクラスがあるわけではなく、
具体的なクラスとしては「ApplicationContext」クラスが
Springコンテナに相当する。
(Webでは「WebApplicationContext」)

Mavenの設定

とりあえずSpringコンテナ(DI)だけ利用したい場合は、
spring-contextだけでいい。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
</dependencies>

基本

component scanして、autowireさせる

DIを使う方法で、基本的で一番シンプルな方法はこれ。

もっと正確にいうと、

  1. @componentを指定したクラスを作成。
  2. そのクラスをcomponent scanして、ApplicationContextに登録。
  3. そのクラスを利用する場合は、@autowiredで自動的にインジェクション(DI)するようにする。

具体例

@componentを指定したクラスを作成。

@Component
public class SayHelloWorldLogic {
    public void doSay(){
        System.out.println("Hello World");
    }
}

そのクラスをcomponent scanして、
ApplicationContextに登録。

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
 
  <context:component-scan base-package="jp.doorblog.javazuki"/>
 
</beans>

そのクラスを利用する場合は、
@autowiredで自動的にインジェクション(DI)するようにする。

@Component
public class HelloWroldService {   
    @Autowired private SayHelloWorldLogic sayHelloWorldLogic;
     
    public void sayHelloWorld(){
        sayHelloWorldLogic.doSay();
    }
}
public class SampleApplication {
    public static void main(String[] args) {
        String path = "classpath:META-INF/beans.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
        HelloWroldService helloWroldService = applicationContext.getBean(HelloWroldService.class);
        helloWroldService.sayHelloWorld();
    }
}

シングルトンにしない場合は@scope("prototype")を指定する

Springコンテナからオブジェクトを生成する場合、
シングルトンで作るかインスタンスごとに作るかを設定する。

先ほどの例などでは特に指定していないが、
デフォルトの設定が適用されるのでsingletonになっている。
よってsingletonではない場合は、prototypeを指定しなくてはいけない。

同じクラスのオブジェクトが複数登録されている場合は、@Qualifierで指定する

@autowiredで特にしていなく利用できるのは、
そのクラスの登録されたオブジェクトが一種類のときではないといけない。

同じクラスのオブジェクトが複数登録されるときは、
@autowiredと共に@Qualifierでidを指定しなくてはいけない。