开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
【简单回顾】原生手动装配
注解@Configuration + @Bean或者 @Component + @ComponentScan可以实现编程式/声明式的手动装配。如编程式具体使用就是在一个类上用@Configuration标注为配置类,用@Bean在方法上标注为Bean就可将该方法返回的东西作为Bean注册到IOC;声明式是用@Component注解标注在类上,声明该类,使用组件扫描注解@ComponentScan来扫描包下带@Component的类,注册到IOC容器。
考虑一个问题:如果Bean很多的话,我们就要一个个@Bean或@Component,显然这样的方式是比较麻烦的。
模块装配
模块通常是独立的、功能高内聚的、可相互依赖、目标明确的,模块装配可以理解成把一个模块的核心功能都装配好。
自定义注解+@Import导入组件实现模块装配。
下面我们自定义了一个@EnableFixed来模仿spring中的整合模块的方法(spring中用@EnableXXX注解,如事务)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnableFixed {
}
当然模块装配的话还需要一个最重要的@Import注解来标注一下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(把需要用的类的字节码放进去,如Boss.class,使用@EnableFixed注解的时候就会自动把需要用的类对象变成Bean放到IOC容器中了)
public @interface EnableFixed {
}
接下来的步骤就是写配置类、启动类。
需要导入多个类的话可以像这样 @Import({Boss.class, BartenderConfiguration.class})
上述讲的只是模块装配中的一种方式,模块装配实际上是有下述四种的。
- @Import + Bean类型(普通类,前面讲的就是普通类)
- @Import + 配置类(依葫芦画瓢)
- @Import +ImportSelector实现类
- @Import +ImportBeanDefinitionRegistrar实现类
剩下两种方式大家可以自己去探究哈~
条件装配
条件装配,装配自己想要的。
这里面比较重要的注解先@Profile,我们可以使用这个注解在我们的配置类上(可以不是配置类),给@Profile传入一个参数,如@Profile("123456"),那我们从IOC容器中拿出来之前需要用ctx.setActiveProfiles("123456")激活一下才能拿到去用,这就是Profile注解。@Profile注解相当于给这个Bean加一个配置属性,当配置属性激活时才会装配上。
它固然强大,但也有Profile控制不到的地方,因为Profile控制的是整个运行环境,无法根据单个Bean来决定是否装配。Spring发现了这个问题,提出了@Conditional注解来解决这个问题。
@Condition可以让 Bean 基于一些指定的条件来装配,简单来说,被标注 @Conditional 注解的 Bean 要注册到 IOC 容器时,必须全部满足 @Conditional 上指定的所有条件才可以。
以上就是本文要讲的内容了。