需求:
service层中某个service对象service01方法执行时,需要对执行对象的权限进行判别,没有权限者不予执行权力。
思路:
在service类的该方法上进行注解,运用工厂产生这个service类代理对象service01,代理对象在该方法被调用时利用反射判断service01是否有权限注解,再根据权限注解来决定是否执行该方法
代码:
Permission注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission {
int value();
}
被注解的方法
public interface BusinessService {
@Permission(1)
public void method01();
public void method02();
}
public class BusinessServiceImp implements BusinessService {
@Permission(1)
@Override
public void method01() {
System.out.println("测试方法01");
}
@Override
public void method02() {
System.out.println("测试方法02");
}
}
工厂类产生代理
public class ServiceFactory {
private ServiceFactory() {}
private static ServiceFactory instance = new ServiceFactory();
public static ServiceFactory getInstance() {
return instance;
}
public BusinessService createBusinessService(User user) {
BusinessService service = new BusinessServiceImp();
//产生代理对象并且返回
return (BusinessService) Proxy.newProxyInstance(ServiceFactory.class.getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//得到要调用的方法的注解
Permission per = method.getAnnotation(Permission.class);
//如果没有注解
if(per == null) {
System.out.println("没有注解");
return method.invoke(service, args);
}
//在这里如果user的id与注解相同,就是拥有该权限
if(user.getId()==per.value()) {
System.out.println("权限正确");
return method.invoke(service, args);
}
//id与注解不同
System.out.println("您没有该方法的执行权限");
return null;
}
});
}
}
代理对象中用到的user类
public class User {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
测试类
public class ExecutionServlet {
@org.junit.Test
public void Test() {
User user01 = new User();
user01.setId(1);
ServiceFactory fac01 = ServiceFactory.getInstance();
BusinessService bus01 = fac01.createBusinessService(user01);
User user02 = new User();
user02.setId(2);
ServiceFactory fac02 = ServiceFactory.getInstance();
BusinessService bus02 = fac02.createBusinessService(user02);
User user03 = new User();
user03.setId(1);
ServiceFactory fac03 = ServiceFactory.getInstance();
BusinessService bus03 = fac03.createBusinessService(user03);
bus01.method01();//权限正确 测试方法01
bus02.method01();//您没有该方法的执行权限
bus03.method02();//没有注解 测试方法02
}
}