Java依赖注入(DI)相关面试总结-Java基础
1)依赖注入
面向对象编程,经常需要处理解耦问题。程序耦合性越低则程序可读、可维护性越高。控制反转(Inversion of Control或IoC)是面向对象编程的常用设计原则,这个原则可以降低耦合性。依赖注入是控制反转常见的实现方式。
依赖注入就是将应用程序所依赖的组件在运行的时候动态的加载到应用程序中间。依赖注入的目标不是为应用程序添加功能,而是提升组件的重用性,并未应用程序搭建一个具有叫强灵活性和广泛性的平台。
控制反转是指吧创建对象,操作属性的事情,交给第三方框架来进行实现。
2)Proxy模式
代理设计模式就是多出代理类代替原对象进行一些操作。采用代理类就是调用原来的方法,并且对产生的结果进行控制。可以将功能划分更加清晰,有助于后期的维护。
- 接口定义
public interface SourceAble {
public void print();
}
- 接口实现
public class Source implements SourceAble{
public void print() {
// TODO Auto-generated method stub
System.out.println("实现接口方法");
}
}
- 代理实现
public class Proxy implements SourceAble{
private Source source;
public Proxy(){
super();
this.source = new Source();
}
public void print() {
// TODO Auto-generated method stub
before();
source.print();
after();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
}
- 测试
public class Proxy implements SourceAble{
private Source source;
public Proxy(){
super();
this.source = new Source();
}
public void print() {
// TODO Auto-generated method stub
before();
source.print();
after();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
}
对已有的方法进行改动来适应新需求的话,违反了扩展性原则,通过代理,可以调用原来方法,并进行适应性改正。
3)常见依赖注入的方式
1、接口注入
借助接口实现调用者和实现者分离。依赖注入创建一套接口,依赖作为参数进行传入,通过统一调用接口完成具体实现的依赖注入。
public interface Inter1 {
public void print(String print);
}
public class TestInter implements Inter1{
public void print(String print) {
System.out.println("print");
}
}
接口注入和setter方法注入类似,不同的是接口注入使用了统一的方法来完成注入,而setter方法注入的方法名称相对比较随意。
- 构造子注入
将依赖作为构造方法的参数进行传递完成依赖注入。
- 设置注入
1)这种方式广泛应用在Spring框架的参数配置中,客户代码仅仅面向接口编程,而无需知道实现类的具体名称。同时,我们可以很简单的通过修改配置文件来切换具体的底层实现类。
2)setter方法注入。增加setter方法,参数为需要注入的依赖亦可完成依赖注入。
依赖查找
依赖查找和依赖注入一样属于控制反转原则的具体实现,不同于依赖注入的被动接受,依赖查找这是主动请求,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态。
依赖注入的相关描述:
- 依赖注入的目标:在代码之外管理程序组件间的依赖关系;
- 依赖注入能够独立开发各组件,然后根据组件间的关系进行组装;
- 依赖注入提供使用接口编程;
- 依赖注入指对象在使用时动态注入;
- 依赖注入常用两种方法为:设置注入和构造注入;
- 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入;
- 设置注入是指Loc容器使用属性的setter方法来注入被依赖的实例,这种注入更为简单、直观。
- IOC就是由Spring来负责控制对象的生命周期和对象间的关系;
- BeanFactory是最简单的容器,提供了基础的依赖注入支持;
- ApplicationContext建立在BeanFactory之上,提供了系统的架构服务。ApplicationContext初始化时会检验,而BeanFactory在第一次使用时未注入才会抛出异常。
- 在ASP.net中,程序实现:Assembly.Load(AssemblyName).CreateInstance(TypeName(类名)),可以在程序中得到一个要求的对象实例。在程序的实现过程中,可以配合反射技术,达到更加灵活的变化。