AOP部分学习开始
满足需求,只有用户注册了的才能访问所有的方法。如果方法太多,肯定不能一个一个的if判断,所以引入java的动态代理。----前提条件是必须实现接口,不然Proxy就不能用了,解决方案是采用第三方的cglib来实现。
public interface UserService {
public void save(String name);
public void update(String name, int id);
public String getUsername(int id);
public void delete(int id);
}
public class UserServiceImpl implements UserService {
private String username;
@Override
public void save(String name) {
System.out.println("UserServiceImpl 的 save方法" + name);
}
@Override
public void update(String name, int id) {
System.out.println("UserServiceImpl 的 update方法" + name);
}
@Override
public String getUsername(int id) {
System.out.println("UserServiceImpl 的 getUsername方法" + id);
return null;
}
@Override
public void delete(int id) {
System.out.println("UserServiceImpl 的 delete方法" + id);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class RuiProxyFactory<T> implements InvocationHandler{
public T targetObject;
@SuppressWarnings("unchecked")
public T createProxyInstance(T targetObject) {
this.targetObject = targetObject;
return (T) Proxy.newProxyInstance(targetObject.getClass()
.getClassLoader(), targetObject.getClass().getInterfaces(),
<strong style="background-color: rgb(153, 255, 153);">this</strong>);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
UserServiceImpl service = (UserServiceImpl) targetObject;
Object result = null;
if (service.getUsername() != null) {
result = method.invoke(targetObject, args);
}
return result;
}
}
public class UserServiceTest {
@Test
public void testProxy() {
RuiProxyFactory<UserServiceImpl> proxy = new RuiProxyFactory<>();
UserServiceImpl impl = new UserServiceImpl();
impl.setUsername("xxxxx"); //这句话是关键点,直接决定了是否有权限
UserService service = (UserService) proxy.createProxyInstance(impl);
service.save("xxxx");
}
}