概念性的东西本人就不必讲了。现在本人就直接拿源码说明:
有两个业务类。

public class BusinessA ...{
public static void a() ...{
System.out.println("println A");
}
}
public class BusinessB ...{
public static void b() ...{
System.out.println("println B");
}
}其中有一个业务需要上面这两个类来完成这个业务,而且完成这个业务,还要根据用户是什么样的角色。如果这个角色假设是"1"做什么,其它的做什么。下面这个类是具体业务的实现。

public class Service implements Observer,ServiceInterface...{
private List<String> list = new ArrayList<String>();

public void businessMethod() throws Exception ...{
System.out.println("start service ");
if (list.contains("1")) ...{
// BusinessA.a();
throw new Exception("您没有这个权限访问此方法.");
} else ...{
BusinessA.a();
BusinessB.b();
}
System.out.println("end service ");
}

public void update(Observable arg0, Object arg1) ...{
if (arg1 instanceof String[]) ...{
for (int i = ((String[]) arg1).length - 1; i >= 0; i--) ...{
list.add(((String[]) arg1)[i]);
}
}
}
}
具体业务的接口如下:
public interface ServiceInterface {
public void businessMethod() throws Exception;
}
public void businessMethod() throws Exception;
}
动态代理,主要功能是代理业务实现类即Service
public class ProxyObserver implements InvocationHandler {
private Object orgin ;
public ProxyObserver(Object orgin){
this.orgin = orgin ;
}
@SuppressWarnings("unchecked")
public Object proxy() {
return Proxy.newProxyInstance(orgin.getClass().getClassLoader(),
orgin.getClass().getInterfaces(), this);
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
if (arg1.getName()=="businessMethod") {
System.out.println(arg1.getName());
}
return arg1.invoke(orgin, arg2);
}
}
private Object orgin ;
public ProxyObserver(Object orgin){
this.orgin = orgin ;
}
@SuppressWarnings("unchecked")
public Object proxy() {
return Proxy.newProxyInstance(orgin.getClass().getClassLoader(),
orgin.getClass().getInterfaces(), this);
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
if (arg1.getName()=="businessMethod") {
System.out.println(arg1.getName());
}
return arg1.invoke(orgin, arg2);
}
}
下面进行一下测试,用户User类其中有一个属性为markcode是存管理员分配的相应的权限,在这里读者可以任意设置。可以控制方法的执行。
public static void main(String[] args) {
//Observer
UserObersered userOber = new UserObersered();
Service service = new Service();
userOber.addObserver(service);
User user = new User();
String[] markcode = {"2"};
user.setMarkcode(markcode);
userOber.codeChange(user);
ProxyObserver proxyUserWatcher = new ProxyObserver(service);
Object proxy = proxyUserWatcher.proxy();
try {
((ServiceInterface)proxy).businessMethod();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//Observer
UserObersered userOber = new UserObersered();
Service service = new Service();
userOber.addObserver(service);
User user = new User();
String[] markcode = {"2"};
user.setMarkcode(markcode);
userOber.codeChange(user);
ProxyObserver proxyUserWatcher = new ProxyObserver(service);
Object proxy = proxyUserWatcher.proxy();
try {
((ServiceInterface)proxy).businessMethod();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本文通过具体的源码示例介绍了如何使用动态代理技术对业务逻辑进行增强,并实现了基于用户角色的权限控制。示例中包括业务类BusinessA与BusinessB、服务实现类Service及其实现的业务逻辑、ServiceInterface接口定义、动态代理类ProxyObserver以及测试用例。
1742

被折叠的 条评论
为什么被折叠?



