项目结构:
http://www.cnblogs.com/hongten/gallery/image/112445.html
执行过程:
用户 -------------- >> 代理对象 -------------->> 目标对象
/AOP/src/com/b510/service/PersonService.java
1 package com.b510.service;
2 /**
3 *
4 * @author Hongten
5 *
6 */
7 public interface PersonService {
8
9 /**
10 * 保存方法
11 *
12 * @param name
13 * 姓名
14 */
15 public void save(String name);
16
17 /**
18 * 得到person的姓名
19 *
20 * @param personid
21 * id号
22 * @return 返回person姓名
23 */
24 public String getPersonName(Integer personid);
25
26 /**
27 * 更新方法
28 *
29 * @param name
30 * person的姓名
31 * @param personid
32 * person的id号
33 */
34 public void update(String name, Integer personid);
35 }
/AOP/src/com/b510/service/impl/JDKProxyFactory.java
1 package com.b510.service.impl;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6
7 /**
8 * 当用户要调用目标对象的时候,首先调用的是JDKProxyFactory代理类,代理类会执行invoke方法,在这个调用的过程中,
9 * 我们在把方法的调用委派给目标对象
10 *
11 *
12 * @author Hongten
13 *
14 */
15 public class JDKProxyFactory implements InvocationHandler {
16
17 private Object targetObject;
18
19 public Object createProxyInstance(Object targetObject) {
20 this.targetObject = targetObject;
21 // 参数一:类装载器
22 // 参数二:代理对象要实现的所有接口
23 // 参数三:回调JDKProxyFactory本身实现的接口方法invoke()方法
24 return Proxy.newProxyInstance(this.targetObject.getClass()
25 .getClassLoader(),
26 this.targetObject.getClass().getInterfaces(), this);
27 }
28
29 /**
30 * 实现接口中的方法invoke() 参数一:代理对象 参数二:被拦截到的方法 参数三:方法的输入参数
31 *
32 * 当执行Proxy.newProxyInstance()的时候,会被newProxyInstance()方法中的第三个参数拦截到,
33 * 进入回调invoke()方法
34 *
35 */
36 @Override
37 public Object invoke(Object arg0, Method method, Object[] arg)
38 throws Throwable {
39 PersonServiceBean bean = (PersonServiceBean) this.targetObject;
40 Object result = null;
41 //判断bean对象的user属性是否为空,如果为空,则不用把方法委派给目标对象
42 if (bean.getUser() != null) {
43 // 把方法的调用委派给的创建的目标对象
44 result = method.invoke(targetObject, arg);
45 }
46 return result;
47 }
48
49 }
/AOP/src/com/b510/service/impl/PersonServiceBean.java
1 package com.b510.service.impl;
2
3 import com.b510.service.PersonService;
4
5 public class PersonServiceBean implements PersonService {
6
7 private String user = null;
8
9 public PersonServiceBean() {
10
11 }
12
13 public PersonServiceBean(String user) {
14 this.user = user;
15 }
16
17 public String getUser() {
18 return this.user;
19 }
20
21 @Override
22 public String getPersonName(Integer personid) {
23 System.out.println("this is the getPersonName() function");
24 return "hongten";
25 }
26
27 @Override
28 public void save(String name) {
29 System.out.println("this is the save() function");
30 }
31
32 @Override
33 public void update(String name, Integer personid) {
34 System.out.println("this is the update() function");
35 }
36
37 }
/AOP/src/com/b510/test/AOPTest.java
1 package com.b510.test;
2
3 import com.b510.service.PersonService;
4 import com.b510.service.impl.JDKProxyFactory;
5 import com.b510.service.impl.PersonServiceBean;
6
7 public class AOPTest {
8 public static void main(String[] args) {
9 JDKProxyFactory factory = new JDKProxyFactory();
10 PersonService service = (PersonService) factory
11 .createProxyInstance(new PersonServiceBean("hello"));
12 service.save("hongten");
13 service.getPersonName(1);
14 service.update("hello", 2);
15 System.out.println("*************************");
16 PersonService service1 = (PersonService) factory
17 .createProxyInstance(new PersonServiceBean());
18 service1.save("hongten");
19 service1.getPersonName(1);
20 service1.update("hello", 2);
21 System.out.println("end");
22 }
23 }
运行结果;
1 this is the save() function
2 this is the getPersonName() function
3 this is the update() function
4 *************************
5 end
我们看到的是:new PersonServiceBean("hello")的时候,传递了参数后,即PersonServiceBean中的user属性的值不为空,那么那些方法save(),update(),getPersonName()
就会被调用,而new PersonServiceBean()的时候,没有传递任何参数,结果是不会调用任何方法的。