spring開放式拡張の理解
10747 ワード
自分を整理してspringの拡張に対する簡単な理解をします.大きな方面から見れば、springを拡張して、自分達が開発した枠組みを彼女のシステムに組み込むことができます.彼女が開いている様々な機能インターフェースを利用して、springのデフォルト値に代わる機能をカスタマイズできます.この二つの面からいくつかの例を挙げて、springの拡張の特徴を紹介します.今は自分でフレームを作って、彼女を使ってみたいです.そして、私達の多くのシステムはspringに基づいて作っています.自分達のやっている枠組みはspringに適合しています.springの中に入れられないなら、私達はただこのような牛鼻騒々しい枠組みを作ったのではないですか?ここのspringの専門家も考えたかもしれません.私達が開発したspringの鼻はどのように自分の枠組みを私達のspringに適合させるのですか?ハハ、今のmybatis-springを見ました.spring-data-redisなどはspringカスタムschemasによって実現されています.つまりspringの要求通りにすれば、springの懐で快適に過ごせると保証されます.どうしましたか?まず、springの本質はbean容器です.beanはspringの定義の実体類BenDefinitionです.私たちが作っているのは私たちのカスタムフレームのものをspringの中の一つまたは複数のbeanに転化することです.私たちは普段どうやって作っているのかを考えてみます.私達はxmlの中で様々なことを書いてはいけませんか?それと同じように、今私達がしたいのはxmlを作ってspringを作って中の内容をbeanに解析させます.springは三つのファイルをカスタマイズして、Spring.handers、Spring.schemas.もう一つはexample.xsdです.これを見てみます.
http\://www.aaa.com/schema/example=com.ccc.MyNamespaceHandler
http\://www.aaa.com/schema/example.xsd=META-INF/example.xsd
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.aaa.com/schema/example"
xmlns:tns="http://www.aaa.com/schema/example" elementFormDefault="qualified">
<xsd:import namespace="http://www.springframework.org/schema/beans" />
<xsd:element name="user">
<xsd:complexType>
<xsd:attribute name="name" type="string"/>
xsd:complexType>
xsd:element>
xsd:schema>
まず自分で見てみます.この3つのファイルの関係は何ですか?Spring.handlersはMyNamespace Handlerという種類のパスを定義しているようです.Spring.schemasはexample.xsdのパスを定義しました.example.xsdは何ですか?彼女は私達がspringに解析を依頼したxmlです.大意は全部見られます.userというラベルを定義しています.彼女は属性がnameと言います.でも、私達はxmlの上にあるのを見ました. targetNamespace="http://www.aaa.com/schema/example"
xmlns:tns="http://www.aaa.com/schema/example"
これも前の2つのファイルの番号の左側のもので、私達がsprigxmlを使う時毎回コピーして貼り付けます."http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
実は私達の意図と同じで、springに必要なbeanはどのxmlの中にありますか?ハハ、面白いですか?私達もwwwを追加しました.nice.はい、そしてカスタムのMyNamespace Handlerを見に行きます.public class MyNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
this.registerBeanDefinitionParser("user", new AbstractSimpleBeanDefinitionParser (){
@Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
String name = element.getAttribute("name");
BeanDefinitionRegistry registry = parserContext.getRegistry();
User user = new User();
user.setName(name);
GenericBeanDefinition def = new GenericBeanDefinition();
def.setBeanClass(user.getClass());
def.setLazyInit(false);
parserContext.getRegistry().registerBeanDefinition("user", def);
}
});
}
}
つまり、Namespace Handler Supportを継承して、beanの解像器を登録します.解像器はxmlを解析します.GeneraicBenDefinitionを定義して、アメリカをspringに入れることに成功しました.そして、userというbeanは私達が普通に使ってもいいです.これはbeanタグを作ることに成功しました.今後はこのようにしてbeanを定義することができます.このようにして、私達は牛の鼻を使って騒いでいる自分のフレームをspringに適合させることができます.非常nine.小さい方はspring内の通知メカニズムを説明します.例えば、ユーザー登録機能が完成したら、ユーザーからの歓迎メールが必要です.登録関数に直接書いたら、解結合の原則を満たしていない一方で、機能のエラーを送信して、登録に失敗したということもあります.だから、普通は非同期でメッセージキューなどを作ることを考えています.しかし、springは通知機構を持っています.とても便利です.appicationイベントを通じて実現します.私たちはどうやって使うかを見てみます.まずリストを定義して、Message Eventイベントのリリースを傍受します.public class MessageEvent extends ApplicationEvent {
public MessageEvent(Object msg) {
super(msg);
}
}
public MessageEventListener implements ApplicationListener {
@Override
public void onApplicationEvent(final ApplicationEvent event) {
if (event instanceof MessageEvent) {
MessageEvent msgEvent = (MessageEvent) event;
doSomething(msgEvent.getSource());
}
}
}
コードは一目瞭然で、Message Eventイベントを取得し、イベントに含まれているメッセージを処理します.@Autowired
private ApplicationEventPublisher eventPublisher;
public void register() {
doRegister();
this.eventPublisher.publishEvent(new MessageEvent(msg));
}
Aplication Event Publisherはspring自身がイベントを発表するためのbeanです.私達はpublishEventを呼び出してイベントを発表します.これでいいデカップリングが実現しました.springはどのように私達を結合させるのかを見てみます.publishEventはAbstractAplication Contで実現します.この中のキーコードはこのようになります.getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
このコードの意味はイベント放送器を取ってから私達のイベントを放送します.イベントの放送器が何をしているかを見に行きます.ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
for (final ApplicationListener> listener : getApplicationListeners(event, type)) {
Executor executor = getTaskExecutor();
if (executor != null) {
executor.execute(new Runnable() {
@Override
public void run() {
invokeListener(listener, event);
}
});
}
else {
invokeListener(listener, event);
}
}
ここでは、すべてのモニターを取得して、非同期スレッドプールを定義しているかどうかを判断します.ある場合は、スレッドプールに入れます.ここでは、スレッドプールの非同期呼び出しを推奨します.予期しないエラーの発生が主サービスの進行に影響を与えることを防止できます.その後、invokeListenerを通じて一歩ずつ最後の呼び出しコードはlistener.onApplicationEvent(event);
見ましたか?これは私達がカスタマイズしたイベントモニターが書き換えたコードです.私達が定義したイベントの呼び出しを完了しました.springイベント放送の仕組みは終わりました.ここの拡張をまとめました.まず、springはAplication EventMulticasterを定義しました.その後、自分で簡易版の実現をしました.イベントを発表する時、私達のモニターを通して、オンアプリケーションEventに戻る方法です.スプリングは各ステップにおいてオープン設計をしています.モニター、スレッドプール、インターフェース設計を含めて、ユーザーの最大のカスタマイズが保証されています.はい、スプリングの中でよく使われている二つの機能によって、springの拡張機制が作られています.全体的にはフレームや方法を勉強する時に、どのように設計するのが一番大切だと思います.上に述べたように、springはほとんどインターフェースと抽象の上でよくできています.springを空の棚と見なしてもいいです.彼女は十分に開放的なインターフェースをくれました.またspringを箱を開けて使うフレームとしてもいいです.彼女は私達の既定のデフォルト実現を提供しています.だから、私はspringを勉強していますが、springのコードの一つ一つにこだわることはありません.多すぎます.必要はありません.彼女がどのような機能をしていますか?大体の構造は何ですか?大体を見てください.私達はある細い点に困惑している時だけ深く追究します.これも今勉強している方法です.