了解spring boot的自动装配先了解spring framework的手动装配。
spring framework手动装配
spring 模式注解装配
- 定义:一种用于生命在应用中扮演“组件”角色的注解。比如:@controller、@service、@Component等
- 装配:<context:component-scan>或者 @ComponentScan;前者是spring2.5中提出的方案, 后者是spring3.1的方案。
Spring @Enable 模块装配
什么是模块装配: Spring Framework 3.1 开始支持”@Enable 模块驱动“。所谓“模块”是指具备相同领域的功能组件集合, 组合所形成一个独立 的单元。比如 Web MVC 模块、AspectJ代理模块、Caching(缓存)模块、JMX(Java 管 理扩展)模块、Async(异步处 理)模块等。比如:@EnableWebMvc 启用WebMVC模块 @EnableTransactionManagement 启用事务管理模块
实现方式
- 注解方式
@Retention( RetentionPolicy. RUNTIME)
@Target(ElementType. TYPE)
@Documented
@Import (DelegatingWebMvcConfiguration. class)
public @interface EnableWebMvc {
....
}
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
....
}
-
编程接口的方式
实现一个自定义注解
/**
* 激活 HelloWorld 模块
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(HelloWorldImportSelector.class)
public @interface EnableHelloWorld {
}
实现一个配置类
/**
* HelloWorld 配置
*
*/
public class HelloWorldConfiguration {
@Bean
public String helloWorld() { // 方法名即 Bean 名称
return "Hello,World 2019";
}
}
定义个selector,实现import org.springframework.context.annotation.ImportSelector接口
public class HelloWorldImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{HelloWorldConfiguration.class.getName()};
}
}
然后在可以在spring boot的启动类上加上@EnableHelloWorld,然后在 return "Hello,World 2019"打上断点debug启动就可以看到效果。也可以直接在自动注解的上加这个@Import(HelloWorldConfiguration.class)引入配置类而不是这个selector,同样也可以实现。但是为什么要要一圈呢?主要是因为多一层这个selector可以在select里做一下流程控制。
实现自动装配只需要在resource下新建META-INF文件夹,然后加入
# /是换行符,这里的类名一般都很长为了方便阅读换行标注,多个类用逗号分隔
org.springframework.boot.autoconfigure.EnableAutoConfiguration=/
com.HelloWorldAutoConfiguration,TestConfiguration
网友评论