liguofeng29’s blog

個人勉強用ブログだっす。

Spring4 - 零配置ファイル - Annotation利用

Springは「配置より規約」を採用してなく、Annotationを利用してどれをBeanとして扱うを決める。

SpringのBean定義用Annotaion

  • @Component
  • @Controller
  • @Service
  • @Repository

ライフサイクルAnnotation

  • @PostConstruct
  • @PreDestory

Spring3.0追加

  • @DependsOn : 他のbean強制初期化
  • @Lazy : 前もって初期化するか

Spring4.0

  • @Autowired

    • setter,通常メソッド、変数、コンストラクター修飾可能
    • setter修飾の場合、byTypeでDIする
    • @Autowired public void prepare(ClassA a, ClassB b)
    • byTypeの場合、複数見つかったらBeanCreateExceptionが発生する
    • private ClassA[] a; // ClassAのすべてのBeanをDI
  • @Qualifier

    • @Autowired @Qualifier("beanName") private ClassA classA; // ClassAのbeanNameのbean
    • public void setA(@Qualifier("beanName") ClassA classA) // 引数にも指定可能

サンプル

package app.annotationTest;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
public class Japanese{

    private int age; // 年齢
    private String name; // 名前

    @Autowired
    @Qualifier("pen")
    private Pen pen;

    public Pen getPen() {
        return pen;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void info() {
        System.out.println("名前 : " + this.name);
        System.out.println("年齢 : " + this.age);
    }

    // 生成後
    @PostConstruct
    public void init() {
        System.out.println("初期化処理");
    }

    // 破棄前
    @PreDestroy
    public void destory() {
        System.out.println("破棄する前の処理");
    }
}
package app.annotationTest;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
public class Pen {
    public void write() {
        System.out.println("文字を書きました");
    }
}
package app.annotationTest;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestComponent {
    public static void main(String[] args) {
        // ApplicationContext context = new ClassPathXmlApplicationContext("component-beans.xml");

        // Springコンテナー生成
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("component-beans.xml");

        // JVM終了時にコンテナーを破棄する
        context.registerShutdownHook();

        Japanese j = context.getBean(Japanese.class);
        j.info();
        j.getPen().write();
    }
}
<?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-4.0.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 指定パッケージ配下のbeanを検索する -->
    <context:component-scan
        base-package="app.annotationTest"/>
</beans>
初期化処理
名前 : null
年齢 : 0
文字を書きました
破棄する前の処理