Spring Boot入门① ~依赖注入~
在学习Spring时,我会将通过教材和网络上查找的信息整理成自己的版本。由于我在框架方面几乎没有经验,所以这些内容会非常入门级。
在开始之前
首先,「Spring Boot」是什么。
随着「Spring Framework」的规模不断增长,如何使用它变得越来越困难。
于是就出现了「Spring Boot」。
-
- 複雑なXML設定ファイルが要らない
- TomcatなどのWebコンテナを内含する
这个框架利用了类似的特点,使得可以快速创建和执行基于Spring的应用程序。请理解为可以简单地使用”Spring Framework”创建应用程序。
接下来,我们将逐渐掌握构建Spring应用所需的知识。
DI(依赖注入)
DI在日语中是指“依存性的注入”。
意思上可以理解为“对象的注入”。
通过从类的外部注入依赖(对象),旨在解决类之间的依赖关系。
DI容器
这是为了实现依赖注入而使用的框架。
通过DI容器来生成和管理实例。
除了解决类之间的依赖关系,还可以获得以下副作用效果。
・可以控制实例的作用域。
-> 可以每次生成新实例,也可以设置为单例等等。
・可以通过事件控制实例的生命周期。
-> 可以处理生成时和销毁时的事件等等。
・可以嵌入公共处理。
・对象之间变得松散耦合,易于测试。
豆子的定义
DI容器定义一个用于管理实例的配置文件。
有3种设置方法。
-
- XML
-
- JavaConfig
- アノテーション
这次我们将来看一下注释的设置。
标注
我们可以通过给JAVA源码添加注解来进行Bean的定义。
重要的注解是
@Component
@ComponentScan
@Autowired可以被用作在Spring框架中实现自动化组件扫描和依赖注入机制的注解。
成为。
组件扫描
这是一个附有Component注解的类,它会被注册到DI容器中的注解。
它会扫描与被附有ComponentScan注解的类相同包或更低级包中的类,并将其注册到DI容器中。
//@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SpringSampleApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringSampleApplication.class, args);
SampleB sampleb = context.getBean(SampleB.class);
sampleb.testDi();
}
}
@SpringBootApplication执行@Configuration、@EnableAutoConfiguration和@ComponentScan。
在示例代码中,故意将注解分开附加。
组件
如果给要注入的类添加Component注解,那么DI容器将会管理这个类。
@Component
public class SampleA {
public String getClassName() {
return this.getClass().getName();
}
}
这是一个只返回自身类名的组件。
自动装配
将其注入到相应的字段中。
DI容器会寻找带有@Autowired注解的字段,并进行适配性匹配,进行注入。
@Component
public class SampleB {
@Autowired
private SampleA sampleA;
public void testDi() {
System.out.println("called " + sampleA.getClassName());
}
}
请从DI容器注入sampleA实例。
这样就可以获取sampleA的类名了。
由于SampleB还需要在main方法中调用,因此将其作为组件进行注册。
请注意
看起来无法在上述情况下进行直接投资。
・通过使用静态的DI
・在生成的新实例上进行DI
由于此次是在主方法中执行,
@Autowired
private static SampleB sampleb;
/* 省略 */
sampleb.testDi();
是
SampleB sampleb = new SampleB();
sampleb.testDi();
我尝试了一下,但是两者都没有成功地进行DI,并发生了NullPointerException。
备考
除了Component之外,还存在一些其他注释可以作为扫描的目标。根据类的角色,我们应该适当使用每个注释。
@Controller(@RestController)
→目标是MVC控制器
@Service
→目标是业务逻辑等服务层
@Repository
→目标是执行数据库访问的DAO类等
参考资料
首次使用Spring Boot
重新学习Spring- DI(依赖注入)
对于DI和DI容器,你真的理解了吗?