Spring MVCは、Webアプリケーションの構築に使用されるJavaフレームワークです。 Model-View-Controllerの設計パターンに従います。SpringMVCは、DispatcherServletの助けを借りてSpringフレームワークでMVCを使用するエレガントなソリューションを提供します。
@Annotations
SpringはRailsアプリケーションのプリロダーです。アプリケーションをバックグラウンドで実行し続けることで開発をスピードアップするため、テスト、レーキタスク、または移行を実行するたびに起動する必要はありません。
rails new実行すると、デフォルトでスプリングがインストールされます) SpringはProcess.forkを広範囲に使用しているため、フォーク(Windows、Jruby)をサポートしないプラットフォームでスピードアップを提供できません。
gemfileにスプリングを追加します:
gem "spring" , group : :development (注: gem "spring", git: "..."機能せず、春の使用方法ではありません。)
bin/ディレクトリ内の実行可能ファイルを「Springify」することをお勧めします。
$ bundle install
$ bundle exec spring binstub --all
これにより、 bin/spring実行可能ファイルが生成され、関連する既存の実行可能ファイルにコードの小さなスニペットを挿入します。スニペットは次のようになります:
begin
load File . expand_path ( '../spring' , __FILE__ )
rescue LoadError
endSpringがインストールされ、サポートされているプラットフォームでは、このスニペットフックがコマンドの実行にスプリングします。それ以外の場合、スニペットは静かに無視され、後の線は通常どおり実行されます。
bin/で入力するすべてのコマンドをプレフィックスしたくない場合は、DiRENVを使用して、アプリケーションにcd使用するときにPATHに./bin自動的に追加できます。 RailsディレクトリにコマンドPATH_add binを使用して.envrcファイルを作成するだけです。
このウォークスルーのために、新しいRailsアプリケーションを生成し、 rails generate scaffold post name:stringを実行します。
テストを実行しましょう:
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 2734
Run options:
# Running tests:
.......
Finished tests in 0.127245s, 55.0121 tests/s, 78.5887 assertions/s.
7 tests, 10 assertions, 0 failures, 0 errors, 0 skips
real 0m2.165s
user 0m0.281s
sys 0m0.066s
それは最初の走行だったため、それは特に速くはなかったので、スプリングはアプリケーションを起動する必要がありました。それは今実行中です:
$ bin/spring status
Spring is running:
26150 spring server | spring-demo-app | started 3 secs ago
26155 spring app | spring-demo-app | started 3 secs ago | test mode
次の実行はより速いです:
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 8352
Run options:
If we edit any of the application files, or test files, the changes will
be picked up on the next run without the background process having to
restart. This works in exactly the same way as the code reloading
which allows you to refresh your browser and instantly see changes during
development.
But if we edit any of the files which were used to start the application
(configs, initializers, your gemfile), the application needs to be fully
restarted. This happens automatically.
Let's "edit" `config/application.rb`:
$ touch config/application.rb $ $ bin/springステータススプリングが実行されています:
26150スプリングサーバー| spring-demo-app | 36秒前に開始しました26556 Spring App | spring-demo-app | 1秒前に開始|テストモード
The application detected that `config/application.rb` changed and
automatically restarted itself.
If we run a command that uses a different environment, then that
environment gets booted up:
プロセス2363の投稿でスプリングプリロダーを介して実行される$ビン /レーキルートget /posts(.:format)投稿/Posts/:ID(.:Format)投稿#更新delete /posts/:Id(.:Format)投稿#Destroy
$ビン/スプリングステータススプリングが実行されています:
26150スプリングサーバー| spring-demo-app | 1分前に開始26556 Spring App | spring-demo-app | 42秒前に開始|テストモード26707スプリングアプリ| spring-demo-app | 2秒前に開始|開発モード
There's no need to "shut down" Spring. This will happen automatically
when you close your terminal. However if you do want to do a manual shut
down, use the `stop` command:
$ビン/スプリングストップスプリングが停止しました。
From within your code, you can check whether Spring is active with `if defined?(Spring)`.
### Removal
To remove Spring:
* 'Unspring' your bin/ executables: `bin/spring binstub --remove --all`
* Remove spring from your Gemfile
### Deployment
You must not install Spring on your production environment. To prevent it from
being installed, provide the `--without development test` argument to the
`bundle install` command which is used to install gems on your production
machines:
$バンドルインストール - 開発テストなし
## Commands
### `rake`
Runs a rake task. Rake tasks run in the `development` environment by
default. You can change this on the fly by using the `RAILS_ENV`
environment variable. The environment is also configurable with the
`Spring::Commands::Rake.environment_matchers` hash. This has sensible
defaults, but if you need to match a specific task to a specific
environment, you'd do it like this:
``` ruby
Spring::Commands::Rake.environment_matchers["perf_test"] = "test"
Spring::Commands::Rake.environment_matchers[/^perf/] = "test"
# To change the environment when you run `rake` with no arguments
Spring::Commands::Rake.environment_matchers[:default] = "development"
rails console 、 rails generate 、 rails runnerこれらは、あなたがすでに知っていて愛しているRailsコマンドを実行します。別のサブコマンド( rails serverなど)を実行すると、Springは自動的に基礎となるrails実行可能ファイル(スピードアップなし)に渡されます。
追加のコマンドについては、これらをGemfileに追加できます。
Test::Unit Rails 4のみを使用すると、 rake test path/to/testを使用して特定のテスト/ディレクトリを実行できます。Spring関連のコードをソースリポジトリにチェックしたくない場合は、Gemfileに追加せずにSpringを使用することができます。ただし、Gemfileにスプリングを追加せずにSpring Binstubsを使用することはサポートされていません。
このようなスプリングを使用するには、 gem install springを実行し、 springでプレフィックスコマンドを実行します。たとえば、 bin/rake -Tを実行するのではなく、 spring rake -T実行します。
Spring Binstubsを使用しているが、一時的にコマンドをSpringで実行したくない場合は、 DISABLE_SPRING環境変数を設定します。
Springは、Railsのクラスのリロードメカニズム( ActiveSupport::Dependencies )を使用して、テストの実行中にコードを最新に保ちます。これは、ページを更新するときに開発中に変更を確認できるのと同じメカニズムです。ただし、 test環境でこのメカニズムを以前に使用したことがなかった可能性があり、これは問題を引き起こす可能性があります。
コードのリロードは、ファイルが変更された後、アプリケーションの定数が異なるオブジェクトであることを意味することを認識することが重要です。
$ bin/rails runner 'puts User.object_id'
70127987886040
$ touch app/models/user.rb
$ bin/rails runner 'puts User.object_id'
70127976764620
イニシャルconfig/initializers/save_user_class.rbがあると仮定します。
USER_CLASS = Userこれにより、コードがリロードされた後User Userと同じオブジェクトではありません。
$ bin/rails runner 'puts User == USER_CLASS'
true
$ touch app/models/user.rb
$ bin/rails runner 'puts User == USER_CLASS'
false
したがって、この問題を回避するために、初期化コードのアプリケーション定数への参照を保存しないでください。
春1.7の時点で、これを行うためのサポートがあります。 Dockerで行う方法については、この例リポジトリを参照してください。
Springは~/.spring.rbおよびconfig/spring.rbカスタム設定で読み取ります。 ~/.spring.rbはバンドラーの前にロードされますが、 config/spring.rbはバンドラーの後にロードされます。したがって、プロジェクトのGemfileに追加することなく、すべてのプロジェクトで利用できるようにするspring-commands-* gemsがインストールされている場合は、 ~/.spring.rbでそれらを要求します。
config/spring_client.rbは、バンドラーの前にもロードされ、サーバープロセスが開始される前に、新しいトップレベルコマンドを追加するために使用できます。
春はあなたのRailsアプリケーションを見つける方法を知っている必要があります。通常のアプリをお持ちの場合は、すべてが箱から出して動作します。特別なセットアップ(たとえばエンジン)を備えたプロジェクトに取り組んでいる場合は、アプリがどこにあるかをSpringに伝える必要があります。
Spring . application_root = './test/dummy'Spring.before_forkコールバックはありません。フォークの前に何かを実行するには、 ~/.spring.rbまたはconfig/spring.rbに配置するか、 config/application.rb 、 config/environments/*.rbまたはconfig/initializers/*.rb 。
スプリングがプロセスからフォークされた後、実際のコマンドが実行される前にコードを実行することをお勧めします。外部サービスに接続する必要がある場合は、 after_forkコールバックを使用するか、一般的なクリーンアップを実行するか、動的構成をセットアップする必要がある場合があります。
Spring . after_fork do
# run arbitrary code
end複数のコールバックを登録する場合は、 Spring.after_fork異なるブロックで複数回呼び出すことができます。
Springは、サーバーが起動するときにロードされたファイルへのファイルの変更を自動的に検出します。変更により、影響を受ける環境が再起動されます。
アプリケーションの再起動をトリガーする追加ファイルまたはディレクトリがある場合、 Spring.watchで指定できます。
Spring . watch "config/some_config_file.yml"デフォルトでは、Springは、0.2秒ごとに1回変更されたファイルシステムを投票します。この方法にはゼロ構成が必要ですが、CPUが多すぎることがわかった場合は、Spring-Watcher-Listen Gemをインストールして、イベントベースのファイルシステムリスニングを使用できます。
コマンドが実行されるたびに表示される「Spring Preloader経由の実行」メッセージを無効にするには:
Spring . quiet = true次の環境変数は春までに使用されます。
DISABLE_SPRINGセットの場合、スプリングはバイパスされ、アプリケーションはフォアグラウンドプロセスで起動しますSPRING_LOGがログメッセージを書き込むファイルへのパス。SPRING_TMP_PATHスプリングが一時ファイル(ピドファイルとソケット)を書き込むディレクトリ。デフォルトでは、 XDG_RUNTIME_DIR Environment Variable、またはelsed Dir.tmpdirを使用してから、 spring-$UIDという名前のディレクトリを作成します。 Railsアプリケーションのtmp/ディレクトリは使用していません。これは、UNIXソケットをサポートしていないファイルシステム上にある可能性があるためです。SPRING_APPLICATION_ID異なるRailsアプリケーションを識別するために使用されます。デフォルトでは、現在のRUBY_VERSIONのmd5ハッシュであり、Railsプロジェクトルートへのパスです。SPRING_SOCKETが長期にわたるスプリングサーバープロセスと通信するために使用するUNIXソケットに使用する必要があるパス。デフォルトでは、これはSPRING_TMP_PATH/SPRING_APPLICATION_IDです。SPRING_PIDFILE長期にわたるスプリングサーバープロセスのPIDを保存するために使用する必要があるパス。デフォルトでは、これはソケットパスに関連しています。ソケットパスが/foo/bar/spring.sockの場合、pidfileは/foo/bar/spring.pidになります。SPRING_SERVER_COMMANDまだ実行されていないときにSpringサーバーを起動するために実行するコマンド。デフォルトはspring _[version]_ server --backgroundになります。 Springが何をしているかについての詳細情報を取得したい場合は、別のターミナルでSpringを明示的に実行できます。
$ spring server
ロギング出力はstdoutに印刷されます。 SPRING_LOG環境変数を持つファイルにログ出力を送信することもできます。