spring注入Bean的七种方式
方式一
直接xml 注入 不举例了
方式二
配合包扫描@ComponentScan 使用@Controller @Service @Component 等方式注入 可以使用excludeFilters 排除扫描包下某些类
注意 在springboot应用下 默认扫描包位置 springboot启动类所在包及其子包
像图示这种情况下 F H这两个类 都被我加了 @Component 他们也在包扫描下的位置下 如果使用excludeFilters 可以排除某个类进容器
方式三
配合@Import 值为某个类
例如
@Import({A.class}) A这个类不用任何注解 就可加入容器中
方式四
配合@Import @Import({B.class}) 值为某个类 这个类实现ImportSelector 注意这个类不会注入到容器中 但是B1会注入到容器中
//若实现了此接口 则这个类不会呗注入到容器中 配合@Import注解使用 public class B implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //annotationMetadata 为@import所在那个类的注解 return new String[]{"com.pps.back.frame.pupansheng.entity.B1"}; } }
方式五
配合@Import @Import({C.class}) 值为某个类 这个类实现ImportBeanDefinitionRegistrar 注意这个类不会注入到容器中 但是C1会注入到容器中 并且这种方式可以得知容器其他的类
public class C implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { Arrays.stream(beanDefinitionRegistry.getBeanDefinitionNames()).forEach(System.out::println); RootBeanDefinition beanDefinition=new RootBeanDefinition(C1.class) ; beanDefinitionRegistry.registerBeanDefinition("pps",beanDefinition); } } 方式六 保证某个类可以注入到容器中 这个类实现 FactoryBean 接口 那么 容器中不仅有这个类 还有其接口实现返回的类 // 用容器的getBean(&+name) 可以得到具体类 不加& 得到是工厂类 当然可以直接使用@Autowired注解到容器中
如下:容器中不仅有 DBeanFactory 还有DB
@Configuration public class DBeanFactory implements FactoryBean { @Override public Object getObject() throws Exception { return new DB(); } @Override public Class<?> getObjectType() { return DB.class; } @Override public boolean isSingleton() { return true; } } 方式七(springboot环境)
使用@EnableConfigurationProperties 加上 @ConfigurationProperties(要注入的类) 即可注入 (自动配置常用到) 不举例了