1.关键策略:
● 基于POJO的轻量级和最小入侵性编程
● 通过依赖注入和面向接口实现松耦合
● 基于切面和惯例进行声明式编程
● 通过切面和模板减少样板式代码
1.1 spring的非入侵编程模型意味着bean在spring和非spring应用中都可以发挥相同作用,类本身没有痕迹表明使用了spring,不强迫实现spring规范的接口或者spring的类,最坏情形下,或许会使用spring注解
1.2 紧密耦合的代码难以测试、难以复用、难以理解,一定程度耦合是必须的,耦合需要被小心谨慎的管理。
非注入方式:
public class DamselRescuingKnight implements Knight {
private RescueDamselQuest quest;
public DamselRescuingKnight(){//紧耦合
this.quest=new RescueDamselQuest();
}
public void embarkOnQuest(){
quest.embark();
}
}
注入方式:
public class BraveKnight implements Knight {
private Quest quest;
public BraveKnight(Quest quest){//注入Quest
this.quest=quest;
}
public void embarkOnQuest(){
quest.embark();
}
}
public class RescueDamselQuest implements Quest {
public void embark() {
System.out.println("hhhh");
}
}
注入和非注入的区别:非注入方式与RescueDamselQuest 紧密耦合,不便于测试,如果在其构造过程中需要其他初始化操作,极其不便利;注入方式采用依赖注入的方式之一,构造器注入,BraveKnight能响应任意Quest,RescueDamselQuest 实现Quest接口后需要将其注入BraveKnight。
创建应用组件之间协作的行为通常称为装配(wiring)。装配通过xml文件或者注解方式进行。
spring通过应用上下文(Application Context)装载bean的定义并把他们组装起来,spring应用上下文全权负责对象的创建和组装
1.3应用切面(AOP)
面向切面允许将遍布软件各处的功能分离出来形成可重用的组件,如日志模块,安全模块,事务管理等非核心模块,这些组件会有更高的内聚性并且更加关注自身业务,完全不需要了解涉及系统服务所带来的复杂性
1.4对模板代码进行封装,如JDBC,JMS,JNDI和使用REST服务通常会涉及大量代码。