本人是一個編程新手也是第一次寫博客 這篇文章是我結合網上的資料和一些書籍學的 若是有不對之處請留言告知 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(); } }
這些就是我自學的成果了 第一次寫博客 若是寫的很差敬請諒解 謝謝了