Aru*_*run 5 spring design-patterns java-ee
大多数ј2ее(spring和JPA)类都设计有接口.除了继承任何技术原因有?像dynaimc proxy或aop,我需要更多技术细节
前
public interface UserDAO {
void delete();
void update();
void save();
List<User> get();
}
public class UserDAOImpl implements UserDAO {
public void delete(){}
public void update(){}
public void save(){}
public List<User> get(){}
}
Run Code Online (Sandbox Code Playgroud)
JB *_*zet 21
IMO主要有三个原因:
如果你向Spring询问UserDAO类型的bean,它实际上将返回一个封装实际UserDAOImpl实例的代理.这允许它划分事务,验证安全授权,日志访问,计算统计等.可以在没有接口的情况下完成它,但是需要进行字节码操作.
在对使用UserDAO的业务服务进行单元测试时,通常会注入模拟的UserDAO实现.再一次,当UserDAO是一个界面时,这更容易做到.这可能是一个具体的类,但它并不总是,并且它仍然更容易与接口
通过使用接口,您可以在其中为其客户端定义DAO的真实合约.当然,setDataSource()在具体实现中需要一种方法,但客户并不关心这一点.他们所需要的只是DAO提供的一组数据访问方法.通过分离接口和具体实现,您可以确保客户端不依赖于DAO的实现细节.
一个接口是我看到的合同.例如,一组软件工程师(实施类)可能与公司(接口)签订特定合同.公司可根据项目需求不时选择在工程师之间切换.由于它们遵循相同的合同并遵循相同的规则,因此每次项目需要更改时,切换比从外部引入资源(编写新类)更容易.您只需更改配置即可切换实现类.
接口是干净的,是对类实现的规则的一点访问.
链接
因为你已经提到了Spring explicite.
Spring AOP可用于不同的配置.默认值使用java动态代理(java.lang.reflect.Proxy).这只能应用于接口
Spring AOP默认使用AOP代理的标准J2SE动态代理.这使得任何接口(或接口集)都可以被代理.
@see Spring Reference Chapter 7.1.3 AOP Proxies @see 动态代理类
| 归档时间: |
|
| 查看次数: |
4821 次 |
| 最近记录: |