春とは何ですか
第一バネは、コンテナフレームに対向軽量制御の反転(IOC)とセクション(AOP)であります
Springフレームワークは、作成したソフトウェア開発の複雑さによるものです。春は、基本的なJavaBeanのは、以前はEJBによって行われることを行うために使用されます。しかし、春には、サーバー側の開発の使用に限定されません。Javaアプリケーションの大半は、春の観点から単純、テスト容易性と疎結合から利益を得ることができます。
言い換えれば、私たちは、春はイデオロギーの概念はIoCのとAOPで学ぶことであることを学びます。任意のアプリケーションが恩恵を受けることができるように、その範囲は広いです。
春の利点
- 以下侵入/低結合(ソフトウェア層の間にデカップリング、コンポーネント間の結合を減少させます)
- 宣言型トランザクション管理(セクションおよび慣行に基づきます)
- 他のフレームワークとの統合を容易にするために(例えばMyBatisの、休止状態)
- Java開発者は、難易度を下げます
- スプリングフレームワークJ2EEプラットフォームは、各溶液(停止)の層を含みます
Springフレームワーク
いくつかの概念
- POJOつまり旧来のJavaは、昔ながらのJavaオブジェクトをオブジェクト
- JavaBeanの JavaのクラスのJavaBean仕様を満たしています。JAVAのJavaBeanに書かれたことは、再利用可能なコンポーネントです。これは、JavaBeanの中に書かれており、特定のクラスは、パブリック、および引数なしコンストラクタでなければなりません。デザインパターンの整合性に沿った一般的な方法を提供することによってJavaBeanは、内部ドメインメンバプロパティを公開セットと取得する方法を取得します。我々はすべて知っているように、このモデルに沿って、属性名、およびその他のJavaクラスは、これらの属性JavaBeanのイントロスペクションメカニズム(反射)の操作により見つけることができます。
IoC
IoC:コントロールの逆(反転制御)
- 「制御の反転」、よりよい理解ではなく、技術的な、しかし、デザインのアイデアとして読むには、管理するために、Springフレームワークに引き渡され、プログラム手動制御で、もともとのオブジェクトを作成することです。
- ポジティブコントロール:オブジェクトを使用するには、原因であることが、独自のオブジェクトを作成する必要があります
- アンチコントロール:春のフレームワークのオブジェクトを作成するためのコントロールの逆である、オブジェクトの作成プロセスを気にしない、ちょうどあなたが春を使用するオブジェクトからコンテナを取得し、オブジェクトを使用するには
- ハリウッドのルール:DOは私があなたを呼んでよ、私を呼んでいません
一般的な例
伝統的な方法:
従来のモデルでは、我々はこのコードの実装を持っています
Juice juice = new Juice("橙子","多糖","超大杯");
工場出荷時のパターン:
繰り返しますが、私たちは次のコードを達成しました。
Shop shop = new Shop("橙子","多糖","超大杯");
Juice juice = Shop.makeJuice();
実際には、このような単純なクラスのために、私たちは、複雑さの増加に工場モデルを導入する必要がありますが、より複雑なクラス(オレンジた場合、砂糖は比較的複雑なクラスである)のために、そして私たちは、工場出荷時には、コードの管理コストを削減します使用しています。
この最初の例を覚えて、我々は、単純な春のプログラムを書きます。
まず、POJOを書く(伝統的なオブジェクト)
package pojo;
public class Source {
private String fruit; // 类型
private String sugar; // 糖分描述
private String size; // 大小杯
/* setter and getter */
}
ライトアセンブリBean構成ファイル
<?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/spring-beans.xsd">
<bean name="source" class="pojo.Source">
<property name="fruit" value="橙子"/>
<property name="sugar" value="多糖"/>
<property name="size" value="超大杯"/>
</bean>
</beans>
そして、春を試してみます
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"applicationContext.xml"}
);
Source source = (Source) context.getBean("source");
System.out.println(source.getFruit());
System.out.println(source.getSugar());
System.out.println(source.getSize());
次のように出力されます
(私たちのプロジェクトのファイル構造の下)
(春のプロジェクトを作成する方法は?)
私たちは、IDEAを使用
しますが、春の環境を含むプロジェクトを取得するようにします。
AOP
コア春のIoCは、その後、春とアスペクト指向プログラミングの一つは、データベースのトランザクション・プログラムの中で最も重要な機能である場合には、広くセクションで使用されています
AOPすなわちアスペクト指向プログラムは、指向プログラミング
まず、内部に、機能は、コアビジネス機能に分かれていアスペクト指向プログラミングの思考、および周辺機能を。
- いわゆるコアビジネスは、そのような着陸、増加データとして、削除データがコアビジネスを呼び出します
- などパフォーマンス統計、ログ、トランザクション管理、いわゆる周辺機能、
春AOPのプログラミングセクションの周辺機能は何年も思ったが、それはセクションとして定義されています
内部のAOPの考えを指向プログラミングの局面では、カットコアビジネス機能と機能が独立して一緒にカット機能やコアビジネス機能、その後、「織り」を開発、AOPと呼ばれています
AOPの概念の中で:
- エントリポイント(ポイントカット)カットを意味クラス、()がオン
- 通知(アドバイス)実際にこの方法を実行するもの:何(とき前者の方法/方法/メソッドの前と後)(何:拡張機能)
- セクション(アスペクト)通知用のセクション= +エントリポイント、人気のポイントは次のとおりです。で、何時間何を、何をすべきかの機能強化!
- 製織(ウィービング)セクションでは、オブジェクトに追加され、プロセスの代理オブジェクトを作成しました。(スプリングによって完成品)
AOPプログラミング
私たちは、デモを実施するためのプロファイル方法を採用します
まず、コア機能を用意し:
package service;
public class ProductService {
public void doSomeService(){
System.out.println("doSomeService");
}
}
周辺機能があります。
package aspect;
//这里的依赖包需要额外安装,建议看这个教程:https://blog.csdn.net/shuduti/article/details/53069241
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggerAspect {
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}
文書編集IoCの方法に従って構成されました
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="productService" class="service.ProductService" />
<bean id="loggerAspect" class="aspect.LoggerAspect"/>
</beans>
ライティング試験方法
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"applicationContext.xml"}
);
ProductService productService = (ProductService) context.getBean("productService");
productService.doSomeService();
}
実行
次は、このセクションの焦点であります
私たちは、AOPに切断するために使用しました
我々は、doSomeService()にしたい始点その中で、前と実施後強化のロギング
このような構成
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="productService" class="service.ProductService" />
<bean id="loggerAspect" class="aspect.LoggerAspect"/>
<!-- 配置AOP -->
<aop:config>
<!-- where:在哪些地方(包.类.方法)做增加 -->
<aop:pointcut id="loggerCutpoint"
expression="execution(* service.ProductService.*(..)) "/>
<!-- what:做什么增强 -->
<aop:aspect id="logAspect" ref="loggerAspect">
<!-- when:在什么时机(方法前/后/前后) -->
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
</aop:config>
</beans>
実行します。
私たちは、ログ機能を得られますが、ビジネスのコードを変更しません。