系统构造和使用分开
public Service getService(){
if(service == null){
service = new MyServiceImlpl(...);
}
return service ;
}
上述代码为延迟初始化/赋值。为什么这样做呢。
其实就是软件系统应该将起始过程和起始过程之后的运行逻辑分离开。这样加快启动速度,不影响应用对象的使用。
依赖注入、工厂、切面
依赖注入(Dependency Injection,DI)一种强大的机制可以实现分类构造和使用。比如;用户在xml上配置文件中定义对象,然后java代码请求特定的对象。
控制反转(Inversion of Control ,IOC)是依赖管理中的一个应用手段。
JNDI查找是DI的一种“部分”实现。
横贯式关注面(切面)
- 为解决多模块的相同持久化策略。
- 在Aop中,切面(aspect)的模块构造说明了系统中哪些点的行为会以某种一致的方式修改,从而支持某种特定的场景
- Aop可以以无损方式在目标代码中进行。
1、java代理
java代理适用于 如单独对象获类中包装方法调用 等简单的方法。
//method defined in InvocationHandler
public Object invoke(Object proxy,Method method,Object[] ages) thows Throwable{
String methodName = method,getName()
if(methodName.equals("getAccounts")){
bank.setAccounts(getAccountsFromDatabase());
return bank.getAccount();
} else if (methodName.equals("setAccounts")){
bank.setAccounts((Collection<Account) args[0]);
setAccountsToDatabase(bank.getAccounts());
return null;
} else {
.....
}
}
//Somewhere else....
Bank bank = (Bank)Proxy.newProxyInstance(
Bank.class.getClassLoader(),
new Class[] { Banl.class },
new BankProxyHandler(new BankImpl()))
缺点是:代码量和复杂度。
2、纯 java AOP 框架
这样的框架中,代理都是内置的。如 Spring Aop和 JBoss Aop
通过描述性配置文件或API,如:Xml
这些声明驱动了依赖注入(DI)容器,DI容器在实体化主要对象,并按需将对象连接起来。
在应用程序中,少数几行代码向DI容器请求系统中的顶层对象。如 XML 文件中定义的那样。
3、AspectJ的切面
AspectJ是关注面切分最全的工具。
优化决策
模块化和关注面切分成分散化管理和决策。不建议提前决策。模块化关注面的pojo提供敏捷能力,允许我们基于最新的知识做出优化、时机刚好的决策。