前言
一直使用springMVC做平台开发,没有了解过内部机制,对“面向切面”和“依赖注入”也只是听过名字而已;近期开始研读spring in action,对spring产生了新的理解。现将自己的体会总结下来,此为第一篇。
正文开始
依赖注入
依赖注入用白话来解释就是:以注入的方式来解决依赖导致的高耦合问题。
在任何一个应用中,都会有多个类组成,这些类相互之间进行合作来完成业务逻辑。如果按照传统的做法,一个对象都要管理其所依赖的对象的引用,这将会导致高耦合也不利于功能扩展。举个例子:
public class Robat{
private Training training ;
public Robat (){
this.training = new ReadingTraining();//Robat 与 training类高耦合
}
public practise(){
this.training.practise();
}
}
我们定义了一个机器人类,这个机器人需要训练,而训练的方法来自于阅读训练这个类中的practice函数。因此,可以看出,robat类依赖于Readingtraining类。导致如果机器人需要训练别的项目,那么需要我们更改代码或者重写,产生很多重复的逻辑。因此spring将这种依赖关系进行转移,不再硬编码般的写入到依赖的类中,而是将其依赖关系交给目标对象,让目标对象去定义依赖关系;在依赖对象中,只去定义一个接口。具体代码如下:
public interface Training (){
public void practice();
}
public class ReadingTraining implement Training(){
@Override
public void practice(){
print("this is read practice")
}
}
public class Robat{
private Training training;
public Robat (Training training){
this.training = trianing;//构造器注入,training类被注入进来 }
public practise(){
this.training.practise();
}
}
上面,我们定义了一个training的接口,因此,我们可以任意更改注入的东西,只要注入的类实现了training接口,使系统具有很高的扩展性。
依赖注入的三种实现方式
1、构造函数注入
这是最简单的注入方式,上面代码所使用的就是构造函数注入。
2、setter注入
同样我们也可以使用set函数进行依赖的注入:
public class Robat{
private Training training;
public void setTraining(Training train){
this.training = train;
}
public practise(){
this.training.practise();
}
}
3、接口注入
接口注入首先需要定义一个接口,接口中定义注入方法,让依赖类实现这个接口。看代码
public interface injectRobat(){
public void inject(Training training);
}
public class Robat implement injectRobat{
private Training training;
@Override
public void inject(Taining training){
this.training = training;
}
public practise(){
this.training.practise();
}
}
网友评论