簡単な紹介
私たちの書き込みプログラムは、手動でに再割り当てする必要のインスタンスのクラスに依存し、依存さまざまなカテゴリーの間です。我々は自動的にの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
プロファイル、アプリケーション・コンテキストを取得して使用される場合、主に、このような完全開放構成が設けられ。そのクラスには任意の名前を付けます。ここで、主成分のスキャンが同じ名前でデフォルトのパッケージを開いている@Component
Beanとして登録などの注釈。
伝統的に、我々は、このような初期値を設定、またはどのように組み立てることとして、ここではいくつかの設定作業を行うことができます。便宜上、以前に使用された初期値
@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 boot
Webアプリケーションは、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
、使用default
OK。あなたが設定しなかった場合は、それだけで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;
}