接口及面向接口编程
接口
-
用于沟通的中介物的抽象化。
-
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法。使其能被修改内部而不影响外部其他实体的与其交互的方式(对外的一种说明,说明会提供哪些功能,内部实现对外不公开)
-
接口即声明,声明哪些方法对外提供。
-
Java8中接口可以拥有方法体(类似抽象类)
接口:(1.8以前)只能有声明,不能有实现。(1.8)静态方法与default方法可以有方法体! 抽象类:既可以有声明也可以有实现。(抽象方法只能声明,不能实现;非抽象方法必须实现) 类:实现
面向接口编程
-
结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能的接口,各层仅依赖接口而非实现类
-
接口内部的实现变动不影响各层之间的调用,这一点在公共服务中尤为重要
-
“面向接口编程”中的“接口”是用于【隐藏具体的实现】和【实现多态性】的组件
IOC控制反转
控制反转:控制权的转移,应用程序本身不负责依赖对象的创建与维护,而是由外部容器负责创建和维护。
依赖注入(DI):是一种实现方式,由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中
目的:创建对象并且组装对象之间的关系
获得依赖对象的过程被反转了。(不是由自己创建,而是由外部容器负责创建和维护。)【获得依赖对象的过程由自身管理变为了由IOC主动注入】
所谓依赖注入,就是IOC容器在运行期间,动态的将某种依赖关系注入到对象中。
单元测试
创建UnitTestBase类,完成对Spring配置文件的加载/销毁
所有的单元测试类都继承自UnitTestBase,通过它的getBean方法获取想要得到的对象
子类(具体执行单元测试的类)加注解:@RunWit(BlockJUnit4ClassRunner.class)
package com.zjx.interfaces.test;
import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;
public class UnitTestBase {
/**
* 相对路径应用上下文
*/
private ClassPathXmlApplicationContext context;
/**
* XML文件的存放路径
*/
private String springXmlPath;
public UnitTestBase() {
}
public UnitTestBase(String springXmlPath){
this.springXmlPath = springXmlPath;
}
@Before
public void before(){
if (StringUtils.isEmpty(springXmlPath)) {
springXmlPath = "classpath*:spring-*.xml";//加载spring配置文件
}
try {
// xml文件用逗号或者空格符隔开,均可加载
context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));
context.start();
} catch (BeansException e) {
e.printStackTrace();
}
}
@After
public void after(){
context.destroy();
}
@SuppressWarnings("unchecked")
protected <T extends Object> T getBean(String beanId){
try {
return(T)context.getBean(beanId);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
}
protected <T extends Object> T getBean(Class<T> clazz){
try {
return context.getBean(clazz);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
}
}
Spring框架中都用的
设计模式
代理模式:在AOP和remoting中被用的比较多。
单例模式:在spring配置文件中定义的bean默认为单例模式。
模板方法模式:用来解决代码重复的问题。
前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。
依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式:BeanFactory用来创建对象的实例。