[春]ゲーム

簡単な紹介

私たちの書き込みプログラムは、手動でに再割り当てする必要のインスタンスのクラスに依存し、依存さまざまなカテゴリーの間です。我々は自動的にのIoCコンテナBeanによって管理されているので、それぞれの使用はあまりにも面倒な依存関係を管理する必要があります。

だから、そこに設定ファイルを経由して自動的に依存Beanを注入します。

スプリング組立体3つxml装配の方法:java装配自动装配、。

比較するとxml装配、それが使用するお勧めしますjava装配

一般的に使用される自动装配コンフィギュレーション・ファイルを削減します。

自動組立

自動的に2つのスプリングアセンブリの観点から:

  • 组件扫描:春のBeanは自動的に作成されたアプリケーション・コンテキストを検索します。
  • 自动装配:春のアセンブリは、自動的にBeanを満たします。

プロジェクト構造

.
├── build.gradle
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── yww/
    │   │           ├── Main.java
    │   │           ├── Message.java
    │   │           ├── ReaderConfig.java
    │   │           └── Reader.java
    │   └── resources/
    │       └── beans.xml
    └── test/
        ├── java/
        │   └── com/
        │       └── yww/
        │           └── MainTest.java
        └── resources/

コード

build.gradleプロジェクトのビルド構成。

コメントの一部は、プラグインとの直接の使用であるgradle runプロジェクトを実行するためのコマンド。jar{}セクションの設定とパッケージングすることができるようjavaに実行するコマンドjarのパッケージを。(あなたは良いマスタークラスの完全な名前を指定する必要があることに注意してください)

plugins {
    id 'java'
    // id 'application'
}

// mainClassName = 'com.yww.Main'
group 'com.yww'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

ext{
    springVersion = '5.2.0.RELEASE'
}

dependencies {
    compile "org.springframework:spring-core:$springVersion"
    compile "org.springframework:spring-context:$springVersion"
    compile "org.springframework:spring-beans:$springVersion"
    compile "org.springframework:spring-expression:$springVersion"
    compile "org.springframework:spring-aop:$springVersion"
    compile "org.springframework:spring-aspects:$springVersion"

    testCompile "junit:junit:4.12"
    testCompile "org.springframework:spring-test:$springVersion"
}

jar {
    from {
        configurations.runtime.collect{zipTree(it)}
    }
    manifest {
        attributes 'Main-Class': 'com.yww.Main'
    }
}

Message.java使用して@Component注釈を、場合コンポーネントスキャン、登録ビーン。

@Value単純な割り当てを指摘しています。豆の設定はとても面倒なXML設定ファイルとは異なります。

package com.yww;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Message {
    @Value("---hello world---")
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = "this mssage is : " + msg;
    }

}

Reader.javaこれは、依存するMessage.javaの使用@Autowiredの注射Messageに豆Reader

ここですることができ@Autowired、また、コンストラクタで書くことができるメンバ変数に書かれた、二つのうちの一つができ選びます。(コンストラクタは自動的にのみ、いくつかの他の操作を行うことができます接続します)

package com.yww;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Reader {
//    @Autowired
    private Message msg;

    @Autowired
    public Reader(Message msg){
        this.msg = msg;
    }

    public void print(){
        System.out.println(msg.getMsg());
    }

}

ReaderConfig.javaプロファイル、アプリケーション・コンテキストを取得して使用される場合、主に、このような完全開放構成が設けられ。そのクラスには任意の名前を付けます。ここで、主成分のスキャンが同じ名前でデフォルトのパッケージを開いている@ComponentBeanとして登録などの注釈。

伝統的に、我々は、このような初期値を設定、またはどのように組み立てることとして、ここではいくつかの設定作業を行うことができます。便宜上、以前に使用された初期値@Valueのセット。

package com.yww;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class ReaderConfig {

    // 可以在配置文件中设置初始值
    // 为了方便直接,就在Message的成员上使用@Value设置了值。
//    @Bean
//    public Message message(){
//        Message message = new Message();
//        message.setMsg("---hi---");
//        return message;
//    }
}

Main.javaアプリケーションを起動するための主な機能、。私たちは、依存関係にあり、良い豆自動組立に合わせて取得する方法をここに示します。

Webアプリケーションとは異なり、アプリがアプリケーションを起動するための主要な機能を持っている必要があり、戦争にパッケージ化され、従来のWebアプリケーションは、Tomcatにロードされますが、spring bootWebアプリケーションは、Webアプリケーションを起動するための主な機能を持たせることができます。

コードのコメントセクションを使用することでxml配置、Beanを取得する方法を示します。

package com.yww;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args){
        // xml配置(beans.xml)
//        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        Message msg = (Message) context.getBean("msg1");
//        System.out.println(msg.getMsg());

        // java配置(ReaderConfig.java) + 获取组件扫描到的bean
        // 测试文件AppTest.java中,可以通过注解@ContextConfiguration加载配置文件上下文,方便使用@Autowired注解获取Bean。
        ApplicationContext context = new AnnotationConfigApplicationContext(com.yww.ReaderConfig.class);
        Reader reader = (Reader) context.getBean(Reader.class);
        reader.print();
    }
}

最後に残ったテストファイルはMainTest.java、あまりありませんが、ここで言う、しかし、あなたは使用することができ@ContextConfiguration、注釈は、Beanの使用状況を取得@Autowired自動注入豆、便利なテストを。

ラン

簡単のためなので、このプロジェクトは、非Webプロジェクト、このパッケージを説明し、実行するためのいくつかの記事です。(追加することによって容易にWebプロジェクトwarプラグインとgradle buildパッケージ)

いくつかを試してみる操作方法:

  • 方法1:使用のアイデアを実行に直接mainクラスには、テストクラスを実行することができますMainTest.java

  • 方法2:使用のGradleは、する必要がありbuild.gradle、ファイルのプラグインを追加applicationし、主な機能の良い名前を設定しますmainClassName最後に、プロジェクトのルートディレクトリ(build.gradleコマンドを同じディレクトリに実行):
gradle run

問題

では非webアプリケーション、あなたがいないことで、問題を見つけるだろう@Autowired介してのみ対処するための適切な注釈提供されていませんでした、豆を知っていない非Webアプリケーションによるものである豆、取得ApplicationContextコンテキスト取得豆のアプリケーションを。そして、豆の間を介して達成することができる@Autowired取得しました。

Javaのアセンブリ

多くの場合、自動化されたコンフィギュレーションは、コンポーネントと自動組立をスキャンするための推奨方法です。しかし、あなたが自分のアプリケーションを組み立てるために、サードパーティのライブラリをしたい場合に使用することはできません@Componentアセンブリを自動化する注釈を。

明示的にBeanを構成しするには、構成ファイルで使用することができます@Bean得ること。

// src/main/java/com/yww/ReaderConfig.java
// ...
@Bean
public Message message(){
    Message message = new Message();
    message.setMsg("---hi---");
    return message;
}
// ...

自動アセンブリの使用は、同じことが豆の複数のタイプを作成することはできません。

豆は、名前を変更しました

デフォルトのBeanのIDと@Bean同じ注釈メソッド名。

利用可能なnameパラメータ設定の他の名前。

@Bean(name="msgX")

スキャンアセンブリ構成を使用せず

あなたがスキャンしたコンポーネントを使用しない場合、どのように別の構成、またはBeanの設定を見つけるには?

この時点で、あなたは使用することができる@Import、そのクラスをインポートします。

package com.yww;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({MessageConfig.class})
public class ReaderConfig {

    // 可以在配置文件中设置初始值
    // 为了方便直接,就在Message的成员上使用@Value设置了值。
//    @Bean
//    @Bean(name="msgX")
//    public Message message(){
//        Message message = new Message();
//        message.setMsg("---hi---");
//        return message;
//    }

    // 这个bean传入的名称可以任意.
    // 但如果在同一个类里声明了名称,像上面那样指定了名词,这里的参数名也必须相同。
    @Bean
    public Reader reader(Message msg){
        System.out.println(msg.getMsg());
        msg.setMsg("---hello---");
        return new Reader(msg);
    }

}

ここで、別のBeanは、インポートされたjava配置ファイルを次のように。

// src/main/java/com/yww/MessageConfig.java
package com.yww;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MessageConfig {

    @Bean
    public Message message(){
        return new Message();
    }
}

XMLアセンブリ

  • Gradleではアプリがされてxml配置置かれsrc/main/resources/たディレクトリに。
  • ウェブxml配置上のweb/WEB-INF/ディレクトリは、あなたが必要とするweb.xml設定を<context-param>

次のような形状の構成。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/

    <bean id="msg1" class="com.yww.Message">
        <property name="msg" value="hello world"/>
    </bean>

</beans>

与えられていない場合はid、完全修飾クラス名によって命名され、Beanはここという名前になりますcom.yww.Message#0#0それは他のBeanの同じ種類の数です。

その他の設定

推奨されませんのでxml配置、それはこののではノートだけのシンプルな構成です。

コンフィギュレーションがたくさんありc-命名空间p-命名空间複雑なラベルを交換します。

  • 注入されたBean参照構成、射出文字列、数値、リスト。(<コンストラクタ、引数>)
  • <豆> JavaConfigのインポート構成を使用してXML構成。
  • <beans>profileプロパティ。
  • <jdbc><jee:jndi-lookup>
  • <beans>ネスティング<beans>

高度なアセンブリ

その他の構成では、より多くの制御アセンブリを実現しています。

プロフィール

組み込みデータベース使用してテスト環境:通常、私たちは、次のような異なる環境を、設定する必要がありh2、使用して本番環境jndi取得データベースを。

(spring4から開始)@Profileにも基づいている@Conditional実装。

構成設定

あなたは使用することができます@Profileに注釈を方法豆を生成するために、上。(本明細書で使用される場合、JavaConfig構成も使用することができるxml設定します)

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
@PropertySource("application.properties")
public class ReaderConfig {

    @Bean
    @Profile("dev")
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    @Profile("prod")
    public Message message2(){
        Message message = new Message();
        message.setMsg("---hi---2");
        return message;
    }
}

@PropertySource設定ファイルをインポートします。

アクティブなコンフィギュレーション

二つの特性によって活性化されたプロファイルを決定spring.profiles.activeし、spring.profiles.default

あなたが設定した場合active、活性化されているプロファイルを決定するために、この値を使用します。設定されていない場合はactive、使用defaultOK。あなたが設定しなかった場合は、それだけでBeanを定義していないプロファイルを作成します。

#src/main/resources/application.properties
spring.profiles.default=dev
spring.profiles.active=prod

テストクラスでは、あなたが使用することができ@ActiveProfiles("dev")、便利有効に設定を。

その他

プロパティを設定するには多くの方法があります。

  • DispatcherServletの初期化パラメータ。
  • Webアプリケーションのコンテキストパラメータ。
  • JNDIエントリ。
  • 環境変数。
  • JVMシステム・プロパティ。
  • @ActiveProfiles注釈の設定を使用して統合テストクラス、。

実施形態では、web.xmlコンフィギュレーション。

    <!-- ... -->
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>dev</param-value>
    </context-param>
    <!-- ... -->

付録:設定ファイルがどのように関連するのですか?

プログラムを見つける方法.propertiesファイルを?

アプリのプロジェクトでは、渡された@PropertySource、JavaConfigクラスにメモを設定する.properties設定ファイルのパスを。

Gradleのプロジェクトでは、中の構成ファイルsrc/main/resources/のパスは、また、ディレクトリのフォルダにこのファイルに配置することができます。以下のような:src/main/resources/demo/app.properties設定@PropertySource("demo/app.properties")

Webプロジェクトでは、春のウェブは、設定プロファイル、なしている@PropertySourceコンフィギュレーションを。

エアコンビーン

あなたが達成したい場合は、Beanがアプリケーションのクラスパスに特定のライブラリを作成、またはしたい場合は、Beanが次々場合にのみ、特定のBean宣言を作成し、または特定の環境変数を設定する場合にのみ含まれていた後に作成されます豆。

@Conditional一緒に使用することができる注釈、@Bean注釈の方法。条件がBeanが真で作成された場合、それ以外のBeanは無視されます。

エアコンBeanがあるspring boot自動組立の原則を達成するために。

設定ファイルは、「リーダー」の値が含まれている場合、Beanを作成します。

ディレクトリ構造

.
├── build.gradle
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── yww/
    │   │           ├── Main.java
    │   │           ├── Message.java
    │   │           ├── ReaderConfig.java
    │   │           ├── ReaderExistsCondition.java
    │   │           └── Reader.java
    │   └── resources/
    │       ├── application.properties
    └── test/
        ├── java/
        │   └── com/
        │       └── yww/
        │           └── MainTest.java
        └── resources/

キーコード

キャンセルReader.javaクラス@Component豆のリーダモードの使用条件を作成するためにここに便利な、ノートを。

設定された条件ReaderExistsCondition.javaこのクラスはインターフェースを継承しますCondition

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
@PropertySource("application.properties")
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---");
        return message;
    }

    @Bean
    @Conditional(ReaderExistsCondition.class)
    public Reader reader(Message message){
        return new Reader(message);
    }
}

設定された条件は、コンフィギュレーション・ファイルからが命名されているかどうかを調べるにはreader方法があれば、構成プロパティmatches豆の条件を作成するように設定される、trueを返します。

package com.yww;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class ReaderExistsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        return env.containsProperty("reader");
    }

}

付録:インターフェイスのコンディション

Condition以下インターフェースのソースコードは、一つだけ含まれているmatchesメソッドが戻る場合、方法true豆、作成条件満足するfalse作成されていません。

@FunctionalInterface
public interface Condition {

    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

ConditionContextあなたは、インターフェイスビーン、環境変数、リソースとクラスを確認することができます。

AnnotatedTypeMetadataインターフェイスはで確認することができ@Bean、他のどのようなノート注釈が付け方法。

曖昧自動組立工程

同じタイプのビーンが複数作成されると、コンポーネントは、走査アセンブリによって選択することができません。

春がスローされますNoUniqueBeanDefinitionException

ソリューション

二つの処理方法があります。

  • @Componentまたは@Bean使用に関する@Primary注釈、曖昧さの面で、好ましいビーンを選択。
  • @Autowiredまたは@Injectの使用に@Qualifier注入されるBeanを定義しますID注記とき@Component、または@Beanときには、それはあなた自身の修飾子を作成することである(同様のは、BeanのIDと改名します)。

@Qualifier豆に似た名前のタグの定義、ばね荷重は、Beanタグを満たしています。

複数のタグを設定するには、独自の注釈付き定義することができます@Qualifierカスタムラベル注釈が定義されていると同じように、インターフェイスを。(Javaの8は定義が注釈を追加することができます@Repeatableコメントを繰り返し達成するために、しかし、春がされ@Qualifier、この繰り返しの注釈に追加されません。)

附属書:BYNAMEとbyType

一般的に、豆及び注入パラメータがない同じ(ここでBean名作成されたmessage1、パラメータ名message)が、ばねとなりbyType、組み立て豆の同じタイプを見つける方法。

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    public Reader reader(Message message){
        return new Reader(message);
    }
}

Beanの複数の異なったタイプがある場合でも、あなたはに頼ることはできませんbyTypeパラメータ渡される名前(ここではパラメータ名を使用して変更することで、対応するBeanを見つけるためにmessage2)、の使用byName指定されたBeanを。

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    public Message message2(){
        Message message = new Message();
        message.setMsg("---hi---2");
        return message;
    }

    @Bean
    public Reader reader(Message message2){
        return new Reader(message2);
    }
}

外部値注射

環境値は、次の3つの方法で得ることができます。

  • 使用して注入Environment
  • プレースホルダプロパティ(プロパティプレースホルダ)。
  • 春の表現言語SpEL
#src/main/resources/application.properties
info.message=this is a message.
info.counter=10

環境:

import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;

@Component
@PropertySource("application.properties")
public class Message {

    @Autowired
    Environment env;

    public void print(){
        String msgStr = env.getProperty("info.message", "this is a msg");
        int msgInt = env.getProperty("info.counter", Integer.class, 30);
    }

}

プロパティのプレースホルダ:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("application.properties")
public class Message {
    @Value("${info.message}")
    private String msg;
}

春EL:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("application.properties")
public class Message {
    @Value("#{systemProperties['info.message']}")
    private String msg;
}

おすすめ

転載: www.cnblogs.com/maplesnow/p/11628735.html