目录
一、依赖注入是什么?
首先Spring的核心是建立在依赖注入的概念上,Spring提供一个容器(Spring应用上下文,Spring application context),它会创建和管理应用组件(bean),bean会在Spring应用上下文中装配在一起,形成一个完整的应用程序。
所谓依赖注入,就是明确地定义组件接口(如UserDAO,面向接口编程),独立开发各个组件,然后根据组件间的依赖关系组装(UserAction依赖于UserService,UserService依赖于UserDAO)运行的设计开发模式。是 Spring 框架核心 IOC 的具体实现。
系统组装的时候,只要是UserDAO的实现类就可以注入到UserService中,可以是UserDAOjdbc实现,也可以是UserDAOmybatis实现。具体用那个组装时在决定。
依赖注入框架(如Spring),允许用户通过约定(以及注解)将应用程序对象之间的关系外部化,而不是在对象内部彼此硬编码实例化代码,以便更轻松地管理大型Java项目。
二、示例说明
1.代码文件列表
MyHello.java --interface MyHelloImplLiSi.java --class implements MyHello MyHelloImplXiaoMing.java --class implements MyHello
2.创建类
MyHello.java --interface
package com.example.demo;
public interface MyHello {
public String hellalert();
}
MyHelloImplLiSi.java --class implements MyHello
package com.example.demo;
public class MyHelloImplLiSi implements MyHello {
@Override
public String hellalert() {
return "李四";
}
}
MyHelloImplXiaoMing.java --class implements MyHello
package com.example.demo;
public class MyHelloImplXiaoMing implements MyHello {
@Override
public String hellalert() {
return "小明";
}
}
3.测试
import com.example.demo.MyHelloImplLiSi;
import org.junit.Test;
public class TestMy {
//实例化对象调用
MyHelloImplLiSi myHello= new MyHelloImplLiSi();
@Test
public void testXingMing(){
System.out.println(myHello.hellalert());
}
}
不使用Spring框架依赖注入装配时,像测试代码中一样在对象内部实例化类的对象硬编码调用。测试结果打印“李四”,那如果要得到“小明”呢?此时是不是又要在对象内部实例化MyHelloImplXiaoMing类对象调用,是吧。
下面我们在Spring框架下依赖注入装配调用测试:
我们将
MyHello.java --interface
MyHelloImplLiSi.java --class implements MyHello
MyHelloImplXiaoMing.java --class implements MyHello
移入springboot项目测试
package com.sbootwo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbootwoApplicationTests {
@Test
void contextLoads() {
}
//spring自动装配bean,依赖注入应用程序上下文(容器)
@Autowired
private MyHello myHello;
@Test
public void testXingMing(){
System.out.println(myHello.hellalert());
}
}
测试代码中依赖注入了接口MyHello到容器中进行方法调用,没有了对象内部实例化类的对象硬编码调用。增加了外部实现的灵活性。在方法实现上要实现“李四”或“小明”只要接口不变,就可以在装配接口时任意组装。如下:
package com.sbootwo;
import org.springframework.stereotype.Service;
@Service //装配小明到接口
public class MyHelloImplXiaoMing implements MyHello {
@Override
public String hellalert() {
return "小明";
}
}
或者
package com.sbootwo;
import org.springframework.stereotype.Service;
@Service //装配李四到接口
public class MyHelloImplLiSi implements MyHello {
@Override
public String hellalert() {
return "李四";
}
}