[學習資料來自尚學堂公布之視頻]
[前面已經轉了幾篇有關靜態/動態代理的帖子.寫的都很不錯.自己也跟著視頻敲了幾篇代碼.
現在貼出來.算是有有始有終吧.]
1.UserManager接口
3.動態代理的類safeHandler
[前面已經轉了幾篇有關靜態/動態代理的帖子.寫的都很不錯.自己也跟著視頻敲了幾篇代碼.
現在貼出來.算是有有始有終吧.]
1.UserManager接口
1
package com.zyl.proxy;
2
3
public interface UserManager {
4
5
public void addUer(String name,String password);
6
7
public void delUser(String id);
8
9
public void modifyUser(int id, String name, String password);
10
11
}
12
2.實現接口的UserManagerImpl類
2

3

4

5

6

7

8

9

10

11

12

1
package com.zyl.proxy;
2
3
public class UserManagerImpl implements UserManager {
4
5
6
public void addUer(String name, String password) {
7
//
添加日志/安全性檢查
8
//checksafe();
9
//采用添加代理類的方法會如何?
10
System.out.println("UserManagerImpl.addUser()123");
11
12
}
13
14
@Override
15
public void delUser(String id) {
16
//
添加日志/安全性檢查
17
//checksafe();
18
System.out.println("UserManagerImpl.delUser()");
19
}
20
21
@Override
22
public void modifyUser(int id, String name, String password) {
23
//
添加日志/安全性檢查
24
//checksafe();
25
System.out.println("UserManagerImpl.modifyUser()");
26
27
}
28
// private void checksafe(){
29
// System.out.println("檢查安全性的方法");
30
// }
31
}
32
注釋的地方不用理會
2

3

4

5

6

7


8

9

10

11

12

13

14

15

16


17

18

19

20

21

22

23


24

25

26

27

28

29

30

31

32

3.動態代理的類safeHandler
1
package com.zyl.proxy;
2
3
import java.lang.reflect.InvocationHandler;
4
import java.lang.reflect.Method;
5
import java.lang.reflect.Proxy;
6
7
public class safeHandler implements InvocationHandler { //實現InvocationHandler接口
8
9
private Object targetObj;
10
public Object newProxy(Object targetObj){
11
this.targetObj=targetObj;
12
//生成動態代理::
13
//對象的接口等ooxx
14
return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),
15
this);//targetObj.getClass().getInterfaces()的傳入,所以只要實現了接口的類都會被動態代理
16
17
}
18
public Object invoke(Object proxy, Method method, Object[] args)//args是傳遞過來的參數,比如name為張三
19
throws Throwable {
20
//調用任何方法前都會前調用invoke方法,所以我們在invoke方法前放置需要調用的代碼 如安全性檢查/log日志等等添加的方法
21
//這里還可以加入一些邏輯判斷,是否加入安全性檢查
22
checksafe();
23
System.out.println("方法名是"+method.getName());
24
for(int i=0;i<args.length;i++){
25
System.out.println("哈哈"+args[i]);
26
}
27
//臨時添加方法調用結束
28
//以下調用一般的方法
29
Object result=null;
30
31
try{
32
method.invoke(targetObj,args); //真正的調用對象的實現的方法(非添加的那些方法)
33
}catch(Exception e){
34
e.printStackTrace();
35
}
36
return result; //invoke方法需要返回一個對象.所以前面定義了一個Object result=null; 這里返回result
37
}
38
//將要加入的安全性檢查等等類似的方法放在此類中
39
private void checksafe(){
40
System.out.println("檢查安全性的方法");
41
}
42
43
}
44
4.client端:
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

1
package com.zyl.ooxx;
2
3
import com.zyl.proxy.UserManager;
4
import com.zyl.proxy.UserManagerImpl;
5
import com.zyl.proxy.safeHandler;
6
7
8
public class client {
9
10
public static void main(String[] args) {
11
safeHandler handler=new safeHandler();//建立代理類的實例
12
UserManager usermanager=(UserManager)handler.newProxy(new UserManagerImpl());//傳入代理對象
轉成原接口類型
13
usermanager.addUer("實際是調用代理的方法", "2222");//調用代理中的東西,然后再調用代理對象的ooxx
14
15
}
16
17
}
18
就到這里吧.學習spring aop的基礎差不多打好了
2

3

4

5

6

7

8

9

10

11

12


13

14

15

16

17

18
