问题:
在浏览之前别人做的项目时会发现别人的业务层和持久层基本都是先写接口在写实现类,恨不能理解的时直接写实现类的好了呀,为什么还要多此一举的写接口在写实现类?
动态代理引发的思考
//**接口**
public interface IUserManager {
public boolean addUserInfo(UserInfo userInfo) throws Exception;
public boolean delUserInfo(int id) throws Exception;
public boolean modifyUserInfo(UserInfo userInfo, int id) throws Exception;
public UserInfo queryUserbyId(int id) throws Exception;
}
//实现类
public class UserManagerImpl implements IUserManager {
public boolean addUserInfo(UserInfo userInfo) throws Exception {
System.out.println("=========UserManagerImpl.addUserInfo()=========");
return false;
}
public boolean delUserInfo(int id) throws Exception {
System.out.println("=========UserManagerImpl.delUserInfo()=========");
return false;
}
public boolean modifyUserInfo(UserInfo userInfo, int id) throws Exception {
System.out.println("=========UserManagerImpl.modifyUserInfo()=========");
return false;
}
public UserInfo queryUserbyId(int id) throws Exception {
System.out.println("=========UserManagerImpl.queryUserbyId()=========");
return null;
}
}
以上类就是我们项目中遇见的项目中一层的方式,那么有什么好处呢?
动态代理
public class Client {
public static void checkSecurity(){
System.out.println("=============checkSecurity()==============");
}
public static void main(String[] args) throws Exception {
final IUserManager iUserManager1 = new UserManagerImpl();
IUserManager iUserManager = (IUserManager) Proxy.newProxyInstance(iUserManager1.getClass().getClassLoader(),
iUserManager1.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object resultObj = null;
try {
if (method.getName().equals("addUserInfo")){
resultObj = method.invoke(iUserManager1,args);
}else {
checkSecurity();
resultObj = method.invoke(iUserManager1,args);
}
}catch (Exception ex){
ex.printStackTrace();
}
return resultObj;
}
});
iUserManager.addUserInfo(new UserInfo());
iUserManager.delUserInfo(1);
iUserManager.modifyUserInfo(new UserInfo(),1);
iUserManager.queryUserbyId(1);
}
}
在经过动态代理后,我们的方法就会得到一定程度的增强,这是我们通过jdk来是实现的动态代理,要求就是被代理对象必须实现一个接口,这大概也就是为什么项目中先写接口在写实现类的原因吧
注: 第三方库cglib可以不需要被代理类实现接口