文章目录

  • @Component
  • @Bean
  • @Import
  • @Import搭配ImportSelector
  • @Import搭配ImportBeanDefinitionRegistrar
  • BeanFactoryPostProcessor
  • BeanDefinitionRegistryPostProcessor
  • FactoryBean
  • 总结

@Component

  • 第一种方式是@Component方式,标志这个类是一个Bean对象
  • 要放在启动类的目录或者子目录下,不然需要在加上@ComponentScan来扫描
  • 通过加在类上实现
@Component
class Test{}
  • 还有同等注解@Controller加在控制层,@Service服务层,@Repository持久层,@Configuration配置类,因为他们都使用了@Component

@Bean

  • 第二种@Bean,这个注解要加在方法上,然后返回值是要实例化的类
//必须先让这个类被springboot扫描到@Bean才会起作用
@Configuration
class Test{@AutowiredTestClass testClass;//返回了实例那么这个实例会被springboot所管理@Beanpublic TestClass getTestClass(){return new TestClass();}@PostConstructpublic void print(){System.out.println(testClass);}
}class TestClass{}

@Import

  • 第三种@Import注解,可以直接导入想要被springboot管理的类
@Configuration
//value是一个数组,可以写多个class。比如a.class,b.class
@Import(TestClass.class)
class Test{@AutowiredTestClass testClass;@PostConstructpublic void print(){System.out.println(testClass);}
}class TestClass{}

@Import搭配ImportSelector

  • 第四种@Import搭配ImportSelector,实现ImportSelector的方法实例化多个bean
@Configuration
@Import(TestClass.class)
class Test{@AutowiredTestSelectImports testSelectImports;@PostConstructpublic void print(){System.out.println(testSelectImports);}
}
//TestClass类似于一个实例化类的工具类,自身不会被springboot所管理
class TestClass implements ImportSelector {//返回值是一个字符串数组,也是需要类的全类名@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{TestSelectImports.class.getName()};}
}class TestSelectImports{}
  • 输出:

@Import搭配ImportBeanDefinitionRegistrar

  • 第五种是@Import搭配ImportBeanDefinitionRegistrar,实现这个接口的方法会交给我们一个BeanDefinitionRegistry,实现这个接口的都是工厂类,所以就是我们可以直接通过这个接口的方法把bean直接注册到工厂中
@Configuration
@Import(TestClass.class)
class Test{@AutowiredTestSelectImports testSelectImports;@PostConstructpublic void print(){System.out.println(testSelectImports);}
}class TestClass implements ImportBeanDefinitionRegistrar {//AnnotationMetadata是谁导入了这个类也就是Test类//BeanDefinitionRegistry可以简单理解成Bean工厂,然后可以直接注册Bean//每个Bean都会被转换成BeanDefinition,里边包含了Bean的所有元数据信息@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {registry.registerBeanDefinition("testSelectImports",new RootBeanDefinition(TestSelectImports.class));}
}class TestSelectImports{}
  • 输出:

BeanFactoryPostProcessor

  • 第六种我们可以实现BeanFactoryPostProcessor接口,他会返回给我们一个BeanFactory,我们可以任意操作,这是spring的一个扩展点,可以让我们在实例化Bean之前对元数据信息进行任意修改
@Component
class TestBeanFactory implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {//这个接口只有两个实现类,一个XmlFactory现实了DefaultListableBeanFactory并且被标记为废弃了//所以把它转换成子类,功能更多DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;//直接向工厂注册BeandefaultListableBeanFactory.registerBeanDefinition("testSelectImports",new RootBeanDefinition(TestSelectImports.class));}
}class TestSelectImports{}

BeanDefinitionRegistryPostProcessor

  • 第七种是实现BeanDefinitionRegistryPostProcessor,它实现了上边的BeanFactoryPostProcessor,所以也有这个接口的功能
@Component
class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {beanDefinitionRegistry.registerBeanDefinition("test",new RootBeanDefinition(TestBeanDefinitionRegistry.class));}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {//跟上边一样就不演示了}
}class TestBeanDefinitionRegistry{public TestBeanDefinitionRegistry(){System.out.println("实例化TestBeanDefinitionRegistry");}
}
  • 输入:

FactoryBean

  • 第八种是实现FactoryBean接口,这是一个工厂,也是一个Bean,可以用来生产对象,但也会被IOC所管理
@Component
//可以指定泛型
class MyFactoryBean implements FactoryBean<Object>{@Overridepublic Object getObject() throws Exception {//返回的就是要交给IOC管理的Beanreturn new Object();}@Overridepublic Class<?> getObjectType() {//Class对象return Object.class;}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(Demo123Application.class, args);//获取对象,通过名字获取的是返回的对象//通过&名字获取的是FactoryBean的对象      System.out.println(run.getBean("myFactoryBean"));System.out.println(run.getBean("&myFactoryBean"));}}
  • 输出:

总结

  • 这些方式中有的只能帮我们创建Bean对象,但有的会返回给我们一个Bean工厂或者其他,我们拿到以后可以进行很多操作,不止是创建Bean,比如给了我们一个BeanFactory,我们都拿到了BeanFactory那么是不是很多功能都可以实现,所以可以做很多自己想做的事情

SpringBoot交给IOC管理对象的几种方式相关推荐

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  2. springboot 获取控制器参数的几种方式

    这里介绍springboot 获取控制器参数有四种方式 1.无注解下获取参数 2.使用@RequestParam获取参数 3.传递数组 4.通过URL传递参数 无注解下获取参数 无注解下获取参数,需要 ...

  3. SpringBoot解决跨域的5种方式

    本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...

  4. springboot 多数据源配置的几种方式

    springboot多数据源配置的三种方式 application.yml配置 1.@Ds("配置数据源名称") 引入依赖 <dependency> <group ...

  5. 【302期】SpringBoot 项目鉴权的 4 种方式,你了解吗?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 文章介绍了 ...

  6. Springboot实现登录拦截的三种方式

    文章目录 1. 登录认证 1.1 介绍 1.2 方式 1.3 扩展 2. 实现 2.1 项目结构以及前置准备 2.2 过滤器实现登录拦截 2.3 拦截器实现登录拦截 2.4 AOP+自定义注解实现 2 ...

  7. SpringBoot实现多数据源的两种方式

    前言 公司项目有连接多个不同数据库的需求,特研究了一下,根据网上的资料,造了一个基于AOP方式的数据源切换轮子,但继续探索,突然发现有开源的多数据源管理启动器.不过,本篇两种方式都会介绍. 基于dyn ...

  8. springboot 获取enviroment.Properties的几种方式

    springboot获取配置资源,主要分3种方式:@Value. @ConfigurationProperties.Enviroment对象直接调用. 前2种底层实现原理,都是通过第三种方式实现. @ ...

  9. Springboot打jar包的几种方式

    springboot打jar的几种方式 一.使用IntelliJ IDEA Spring Boot打jar包 第一步:POM文件的修改: <plugins><plugin>&l ...

最新文章

  1. SpringBoot 接口幂等性的实现方案
  2. Intellij IDEA + Maven + Cucumber 项目 (三):简单解释RunCukesTest.java
  3. CodeForces - 820D Mister B and PR Shifts(思维+模拟)
  4. FTP配置文件详解vsftpd.conf
  5. python实现接口自动化_python 实现接口自动化1
  6. 十二.激光SLAM框架学习之livox-loam框架安装和跑数据集
  7. IE11 0x2ee4 bug 以及类似问题解决方法
  8. 能跑的东西,尽量继续跑,平稳过渡
  9. GIMP的Path的import和export
  10. 大学生创业实战 - 代充的套利故事
  11. 用Python制作我的核酸检测日历
  12. Google Earth Engine(GEE)——1981-2020年全球降水数据年均降水量直方图表示(北京市为例)
  13. win7 IE中使用svg时利用symbol的方式出现卡死现象
  14. GPS 入门 7 —— GPS定位、LSB基站定位、wifi定位区别
  15. 固体激光器的转换效率
  16. 如何获取淘宝商品类目信息,通过商品ID获取商品类目?
  17. 解决ubuntu18 上网速度慢的问题(已经确定没用,你的网速慢就是网速慢)
  18. halcon循环语句,条件句结构格式
  19. 机器学习面试题之机器学习基础(一)
  20. Android 使用阿里推送服务报错Manifest merger failed

热门文章

  1. 小米系统不显示手动选择安装包
  2. ElasticSearch——倒排索引和正向索引
  3. 灰色产业链带来的合法正当的行业收入
  4. 无法找到来自源 nvlddmkm 的事件 ID 14 的描述
  5. js数字滚动功能实现
  6. Oracle的基本概念及用法
  7. 百姓网上怎么引流?百姓网如何发帖引流?百姓网如何推广?
  8. 磨皮插件portraiture2023最新中文版
  9. 迈克尔•波特的“五力模型”中,最明显的竞争状态是()国开个人与团队管理知识点解析
  10. PCIe 6.0 – 关于 PCI Express Gen6 您需要知道的一切