springboot 自动装配机制是springboot 的核心机制之一,也是非常重要的机制。什么是自动装配?概率很玄乎。我们先来看一下一个常见案例:@EnableXXX
@EnableCaching //开启缓存
@SpringBootApplication
public class EnableDemoApplication {
public static void main(String[] args) {
}
}
注意 @EnableXXX 注解只是springboot 自动装配机制中的一部分,@EnableXXX 官方并没有给具体含义,只是配合使用完成自动装配,可以将 @EnableXXX 称为,@Enable 驱动或者@Enable模块,简单点就是@Enable 注解。
- 自动装配:
本质就是将Bean 交给spring 容器托管。严格意义是上是加载外部的Bean。
- 注解驱动开发@ComponentScan
最原始或者说最开始被使用的一种spring 扫描Bean 的方式,配合使用的注解有 @Component,以及 @Component 衍生的注解 @Configuration,@Service等等。
说明:@SpringBootApplication 扫描的根路径是启动类所在的路径。
//测试 @ComponentScan --> com.example.enabledemo
package com.example.enabledemo.helloworld;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HelloWorldConfig {
@Bean
public HelloWorld helloWorld () {
return new HelloWorld();
}
}
=======================
package com.example.enabledemo.helloworld;
public class HelloWorld {
public void hello () {
System.out.println("hello world");
}
}
=======================
package com.example.enabledemo;
import com.example.enabledemo.helloworld.HelloWorld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ConfigurableApplicationContext;
//@EnableCaching
@SpringBootApplication
public class EnableDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(EnableDemoApplication.class, args);
HelloWorld helloWorld = context.getBean(HelloWorld.class);
helloWorld.hello();
}
}
运行结果 输出 hello world
说明我们使用项目内加载Bean 是成功的,当然是成功的,有一点spring 基础的人都知道。。那么问题来了,假设有个外部的 基于spring开发的模块需要添加到本项目中,那怎么让当前容器加载所有的Bean呢?最简单的解决方案肯定能想到:使用 @ComponentScan 配置扫描路径。这肯定是没有问题的,但是springboot 帮我们提供了跟更优雅的方式:自定装配或者自动注入。接下来我们就来看看springboot的解决思路。