@Bean //表示注入第三方bean,beanId为方法名
@Import // 表示注入第三方bean,beanId为全类名
@EnableXXXX // 表示将企业bean交给springboot管理
Condition //符合条件才注入bean
FactoryBean //注入bean 与BeanFactory相反(spring容器获取bean)
ImportBeanDefinitionRegistrar //注入bean
ImportSelector //注入bean
项目结构
pom
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
MyConfig
//相当beans
@Configuration
/*** 表示自定义@EnableXXXX注解 该种注解的作用是为了能够给springBoot管理,
* 只要在springBoot项目启动类加上此注解表示将改注解管理的类交给spring容器管理 */
@EnableMySpringBoot
@Import({MyImportSelector.class, MyImportBeanDefinitionRegistrar.class, MyFactoryBean.class})
public class MyConfig {
/**
* @Bean @Import 都表示注入将第三方bean注入spring容器管理,
* 但是@Bean注入时的benaId默认是方法名称,而@Import默认是类的全路径
*/
@Conditional(MyCondition.class) //符合条件才注入bean
@Bean
public ConditionBean conditionBean() {
return new ConditionBean();
}
}
MyCondition
/**
* Condition判断某个环境才注入bean(windows,linux...)
*
* @author lq
*/
public class MyCondition implements Condition {
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String enir = conditionContext.getEnvironment().getProperty("os.name");
System.out.println("当前环境:"+enir);
if ("Windows 10".equals(enir)) {
return true;
}
return false;
}
}
MyFactoryBean
public class MyFactoryBean implements FactoryBean<FactoryBeanDemo> {
public FactoryBeanDemo getObject() throws Exception {
return new FactoryBeanDemo();
}
public Class<?> getObjectType() {
return FactoryBeanDemo.class;
}
public boolean isSingleton() {
//是否单例默认单例
return true;
}
}
MyImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(ImportBeanDefinitionRegistrarBean.class);
registry.registerBeanDefinition("importBeanDefinitionRegistrarBean", rootBeanDefinition);
}
}
MyImportSelector
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.whotw.model.ImportSelectorBean"};
}
}
bean
public class ConditionBean {
}
public class FactoryBeanDemo {
}
public class ImportBeanDefinitionRegistrarBean {
}
public class ImportSelectorBean {
}
public class SpringBootBean {
}
@interface EnableMySpringBoot
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({SpringBootBean.class})
public @interface EnableMySpringBoot {
}
WhotwDemo
public class WhotwDemo {
public static AnnotationConfigApplicationContext annotationConfigApplicationContext;
public static void main(String[] args) {
//测试注解版本
annotationDemo();
}
public static void annotationDemo() {
System.out.println("启动成功");
annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(MyConfig.class);
annotationConfigApplicationContext.refresh();
String name = annotationConfigApplicationContext.getBean("com.whotw.model.MyFactoryBean").getClass().getName();
System.out.println(name);
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
//输出注入spring容器中的bean
for (String beanName : beanDefinitionNames) {
System.out.println(beanName);
}
annotationConfigApplicationContext.close();
}
}
运行结果