Spring Demo

8075 ワード

Springとは何ですか.
Springは軽量級のDIとAOP容器フレームワークであり,非侵入式であり,springに基づいて開発された応用は一般的にspringのクラスに依存しない.
 
DI:依存注入(Dependency Injection)と呼ばれ、IOC(制御反転)という概念があり、呼び出されたオブジェクトをSpringして作成し、コンテナがオブジェクトをインスタンス化する際に呼び出された者(またはその依存オブジェクト)を積極的に呼び出しオブジェクトに注入するので依存注入とも呼ばれる.
 
AOP:Springはフェースプログラミングに強力なサポートを提供しています.これにより、ビジネスロジックをアプリケーションサービス(トランザクション管理など)から分離し、高集約開発を実現しました.アプリケーションオブジェクトはビジネスロジックだけに注目し、ログ、トランザクションなどの他のシステム問題を担当しません.
 
コンテナ:Springは、アプリケーション・オブジェクトのライフサイクルと構成を含み、管理するコンテナです.オブジェクトの作成、破棄、コールバックなど.
フレームワーク:Springはフレームワークとして、トランザクション管理、永続層統合などの基礎機能を提供し、開発者がアプリケーションロジックの開発に専念できるようにします.
 
Springのメリット
1.SpringのIOCコンテナを使用して、オブジェクト間の依存関係をSpringに渡し、コンポーネント間の結合性を低下させ、論理の適用に集中させる
2.多くのサービス、事務管理、WSなどを提供できます.
3.AOPのとても良い支持、インスタントラーメンはうどんにプログラミングします.
4.Hibernate、Struts 2、JPAなど、主流のフレームワークに優れた統合サポートを提供
5.Spring DIメカニズムは、ビジネス・オブジェクトの置き換えの複雑さを軽減します.
6.Springは低侵入に属し、コード汚染は極めて低い.
7.Springの高度な開放性は、Springに強制的に依存するものではなく、開発者はSpringの一部または全部を自由に選択することができます.
 
次にspring demoを直接列挙する
 
public interface Axe {
	public String chop();
}

 
public interface Person {
	public void useAxe();
}

 
@Service
public class StoneAxe implements Axe {

	public String chop() {
		return " ";
	}
}

 
//@Service
public class SteelAxe implements Axe {

	public String chop() {
		return " ";
	}
}

 
@Service
public class Chinese implements Person {

	@Resource
	private Axe axe;

	public void setAxe(Axe axe) {
		this.axe = axe;
	}

	public void useAxe() {
		System.out.println(axe.chop());
	}
}

  bean.xml  
余分な構成があれば、ここでは削除しません.
<?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: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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

	<context:component-scan base-package="springDemo"></context:component-scan>
	<context:annotation-config />
</beans>  

 
クライアントコール
	@Test
	public void springTestAxe() {

		ApplicationContext context = new ClassPathXmlApplicationContext(
				"bean.xml");
		Chinese chinese = context.getBean("chinese", Chinese.class);
		chinese.useAxe();
	}

 
maven
JArパッケージ
<dependencies>    
    	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit-dep</artifactId>
		<version>4.11</version>
		<scope>test</scope>
	</dependency>
        
    	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.1.4.RELEASE</version>
	</dependency>
    
    	<dependency>
		<groupId>javax.annotation</groupId>
		<artifactId>javax.annotation-api</artifactId>
		<version>1.2</version>
	</dependency>
    
    	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.8.5</version>
	</dependency>
</dependencies>

 
 
ログ管理AOP
 
<?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: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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

	<context:component-scan base-package="springDemo"></context:component-scan>
	<context:annotation-config />
	 
    	<aop:config>
		<aop:pointcut id="servicepointcut"
			expression="execution(* springDemo.*.*.*(..))" />
		<aop:aspect id="loggeraspect" ref="optLogger">
			<aop:before method="logger" pointcut-ref="servicepointcut" />
		</aop:aspect> 
	</aop:config> 
	<!-- 
		proxy-target-class  ,   false,    jdk        ,  
		   <aop:aspectj-autoproxy poxy-target-class="true"/> ,    CGLib          。
		    proxy-target-class   false,           , spring     CGLib    。 
	 -->

	<aop:aspectj-autoproxy proxy-target-class="true"/>  
</beans>    

 
ログ処理クラス
@Service
public class OptLogger {

//	public void logger() {
//		System.out.println("      。。。");
//	}

	public Object logger(ProceedingJoinPoint pjp) throws Throwable {
		// proceed()            
		Object obj = pjp.proceed();
		//      
		String method = pjp.getSignature().getName();
		//          
		String clazzName = pjp.getTarget().getClass().getName();

		String key = clazzName + "." + method;

		PropertiesUtil.getInstance("opt.properties");

		System.out.println("   " + PropertiesUtil.getProperty(key));
		return obj;
	}
}

 
PropertiesUtilプロファイルの読み込み
public class PropertiesUtil {

	static Properties props = new Properties();

	private PropertiesUtil() {
	}

	public static Properties getInstance(String path) throws IOException {
		props.load(PropertiesUtil.class.getClassLoader().getResourceAsStream(
				path));
		return props;
	}

	public static String getProperty(String key) {
		String val = "";
		if (props != null) {
			String prop = props.getProperty(key);
			if (prop != null) {
				val = prop;
			}
		}
		return val;
	}
}

 
opt.propertiesファイル
springDemo.inter.impl.StoneAxe.chop=\u67E5\u8BE2
 
クライアント呼び出しコードは変更されません
 
通知タイプ
 
1)先行通知は、ターゲットメソッド呼び出しの前に実行される.放出異常2)後置通知がターゲットメソッド呼び出し後に実行されない限り、後続の実行を阻止することはできません.ターゲットメソッドは正常に終了してから実行されます.3)最終通知
ターゲットメソッド呼び出しの後に実行します.ターゲットメソッドは正常または異常に実行されます.4)異常通知は、ターゲットメソッド呼び出しに異常が発生した後に実行される.5)オービット通知は、ターゲットメソッド呼び出しの前後で実行される.この5種類の通知は,内部呼び出し時にtry{呼び出し前置通知周回前置処理呼び出し先オブジェクトメソッド周回後置処理呼び出し後置通知}catch(Exception){呼び出し異常通知}finally{呼び出し最終通知}を組織する.