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容器,你真的理解了吗?

bannerAds