AOP01
SpringAOP是Spring framework中的一個核心設計,本文開始寫一個系列主要有七種方式完成不同aop的實現(xiàn),第一種用的是java的動態(tài)代理,使用的是Proxy代理類的靜態(tài)方法newProxyInstance完成AOP的實現(xiàn)
1.IUserService.java
package com.qfedu.aop01;
import java.util.List;
public interface IUserService<T> {
/**
* 獲取所有的用戶對象列表
* @return
*/
List<T> getAllUser();
/**
* 保存用戶
* @param user
* @return
*/
boolean saveUser(T user);
/**
* 根據(jù)用戶uid刪除該uid對應的用戶信息
* @param uid
* @return
*/
boolean deleteUser(int uid);
/**
* 更新指定用戶信息
* @param obj
* @return
*/
boolean updateUser(T obj);
}
2.UserServiceImpl.java
package com.qfedu.aop01;
import java.util.ArrayList;
import java.util.List;
public class UserservcieImpl implements IUserService<Object> {
@Override
public List<Object> getAllUser() {
System.out.println("--------getAllUser----------");
return new ArrayList<>();
}
@Override
public boolean saveUser(Object user) {
System.out.println("--------saveUser----------");
return true;
}
@Override
public boolean deleteUser(int uid) {
System.out.println("--------deleteUser----------");
return false;
}
@Override
public boolean updateUser(Object obj) {
System.out.println("--------updateUser----------");
return true;
}
}
3.UserFactory.java
package com.qfedu.aop01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserFactory {
public static IUserService getUserService(){
IUserService us = new UserservcieImpl();
MyAspect ma = new MyAspect();
/**
*
* 使用Proxy類的靜態(tài)方法newProxyInstance來實現(xiàn)對于目標對象us的代理
* 目的是在原本us可以做的事情之前和之后可以做額外的事情
*
*/
IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理對象調(diào)用的回掉方法
* @param proxy 代理對象
* @param method 被代理的方法
* @param args 被代理方法的參數(shù)列表對象
* @return 每個方法的最終返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ma.before();
//System.out.println(proxy);
System.out.println("000000000" + method);
System.out.println("000001111" + args);
Object obj = method.invoke(us, args);
ma.after();
System.out.println("111111111" + obj);
return obj;
}
});
return ius;
}
}
4.MyAspect.java
package com.qfedu.aop01;
public class MyAspect {
public void before(){
System.out.println("********before**********");
}
public void after(){
System.out.println("********after**********");
}
}
5.TestAOP01.java
package com.qfedu.aop01;
import org.junit.Test;
public class TestAOP01 {
@Test
public void testUserService(){
IUserService us = new UserservcieImpl();
System.out.println(us.getAllUser());
System.out.println(us.updateUser(new Object()));
System.out.println(us.deleteUser(1));
System.out.println(us.saveUser(new Object()));
System.out.println("===============");
IUserService us2 = UserFactory.getUserService();
System.out.println(us2.getAllUser());
System.out.println(us2.updateUser(new Object()));
System.out.println(us2.deleteUser(2));
System.out.println(us2.saveUser(new Object()));
}
}
6.運行結果
--------getAllUser----------
[]
--------updateUser----------
true
--------deleteUser----------
false
--------saveUser----------
true
===============
********before**********
000000000public abstract java.util.List com.qfedu.aop01.IUserService.getAllUser()
000001111null
--------getAllUser----------
********after**********
111111111[]
[]
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.updateUser(java.lang.Object)
000001111[Ljava.lang.Object;@6ae40994
--------updateUser----------
********after**********
111111111true
true
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.deleteUser(int)
000001111[Ljava.lang.Object;@1a93a7ca
--------deleteUser----------
********after**********
111111111false
false
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.saveUser(java.lang.Object)
000001111[Ljava.lang.Object;@3d82c5f3
--------saveUser----------
********after**********
111111111true
true