自學spring AOP

本人是一個編程新手也是第一次寫博客 這篇文章是我結合網上的資料和一些書籍學的 若是有不對之處請留言告知 java

 

 

本文介紹了AOP的兩個知識點spring

1: 代理編程

代理有兩種 我先寫:Java靜態代理app

1:創建一個接口測試

package com.proxy;
/**
 * 
* @ClassName: IPerson
* @Description: 抽象的定義這個角色
* @author 
* @date 2017年10月24日 下午6:40:43
*
 */
public interface IPerson {
	public void show();
}

  

2:建立類實現接口this

package com.proxy;spa

public class Lishi implements IPerson {代理

public void show() {
System.out.println("啦啦啦");
}xml

}blog

  

3:建立代理類實現接口(構造方法中要求傳入接口做爲參數)

package com.proxy;

/**

* @ClassName: lishiproxy
* @Description: 代理類
* @author 
* @date 2017年10月24日 下午6:41:33
*
*/
public class Lishiproxy implements IPerson {
private IPerson ip;

public lishiproxy(IPerson iPerson) {
super();
this.ip = iPerson;
}

public void show() {
ip.show();
}

}

  

 

4:測試類調用代理類進行測試

package com.proxy;

import org.junit.Test;

public class Lishitest {
	@Test
	public void showls() {
		

		lishi ls = new lishi();
		// 一個代理可以實現多個實現類
		IPerson lip = new lishiproxy(ls);
		lip.show();

	}
}

  

 

2:Java動態代理

先來步驟

1:創建一個接口

 

package com.proxy2;

public interface Iperson2 {
	public void eat();
}

 

  

 

2:建立類實現接口

 

package com.proxy2;

public class Ruan implements Iperson2 {

	public void eat() {
		System.out.println("啦啦啦啦啦");
	}

}

 

  

 

3:建立代理類實現接口InvocationHandler(構造方法要求傳入接口做爲參數)

 

 

package com.proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class proxy2 implements InvocationHandler {
	private Iperson2 iperson2;

	public proxy2(Iperson2 iperson2) {
		super();
		this.iperson2 = iperson2;
	}

	    // 執行
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// 傳入的是執行的人
		return method.invoke(iperson2, args);
	}

}

 

  

 

注意重寫一個方法

4:測試實現代理類進行測試

 

package com.proxy2;

import java.lang.reflect.Proxy;

import org.junit.Test;

public class Ruantest {
	@Test
	public void eat() {
		Iperson2 ip2 = new Ruan();
		proxy2 proxy2 = new proxy2(ip2);

		Iperson2 iperson2 = (Iperson2) Proxy.newProxyInstance(Ruan.class.getClassLoader(), Ruan.class.getInterfaces(),
				proxy2);
		iperson2.eat();

	}
}

 

  

 

2:通知

通知有三種1:環繞通知

                 2:前置通知

                 3:後置通知

三種通知我寫在一塊兒了 一次性發出來把 可貴分開了 步驟我仍是會寫出來

 

1:創建一個接口

package com.proxy3;

public interface IPerson3 {
	public void seelp();
	public void cadd();
}

  

2:建立類實現接口    目標

package com.proxy3;

public class Siming implements IPerson3 {

	public void seelp() {
		System.out.println("嘻嘻嘻嘻嘻嘻.哈哈哈哈哈");
	}

	public void cadd() {
System.out.println("哈哈哈,通知過濾");		
	}

}

  

3:建立代理類  通知

package com.proxy3;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class BeforeAdvice implements MethodBeforeAdvice {

	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("前置的通知");
	}

}

  

4:配置applicationContext.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: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-4.3.xsd
        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
	http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-4.3.xsd
	http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- 目標 實例化 -->
	<bean id="Siming" class="com.proxy3.Siming"></bean>
	<!-- 前置通知 -->
	<bean id="BeforeAdvice" class="com.proxy3.BeforeAdvice"></bean>
	<!-- 後置通知 -->
	<bean id="AfterAdvice" class="com.proxy3.AfterAdvice"></bean>
	<!-- 環繞通知 -->
	<bean id="Methods" class="com.proxy3.Methods"></bean>

	<!-- 某個方法回去觸發通知 -->

	<bean id="myBefore"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice" ref="BeforeAdvice"></property>
		<property name="pattern" value=".*add.*"></property>
	</bean>

	<!-- 配置混合代理 -->
	<bean id="myProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<!-- 引用目標 -->
		<property name="target" ref="Siming"></property>
		<!-- 目標實現的全部接口 -->
		<property name="proxyInterfaces">
			<list>
				<value>com.proxy3.IPerson3</value>
			</list>
		</property>
		<!-- 配置通知 -->
		<property name="interceptorNames">
			<list>
				<idref bean="Methods" />
				<idref bean="myBefore" />

				<idref bean="BeforeAdvice" />
				<idref bean="AfterAdvice" />
			</list>
		</property>

	</bean>
</beans>

  這個配置文件裏面有 先後通知 環繞通知的配置  感興趣的能夠看下 已經寫的很詳細了

5:使用

package com.proxy3;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class proxy3test {
	@Test
	public void seelp() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		IPerson3 ip3 = (IPerson3) ac.getBean("myProxy");
		// ip3.seelp();
		ip3.cadd();
	}
}

  

 

 

這些就是我自學的成果了 第一次寫博客 若是寫的很差敬請諒解 謝謝了

相關文章
相關標籤/搜索