SpringBoot交给IOC管理对象的几种方式
文章目录
- @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管理对象的几种方式相关推荐
- SpringBoot静态获取 bean的三种方式,你学会了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...
- springboot 获取控制器参数的几种方式
这里介绍springboot 获取控制器参数有四种方式 1.无注解下获取参数 2.使用@RequestParam获取参数 3.传递数组 4.通过URL传递参数 无注解下获取参数 无注解下获取参数,需要 ...
- SpringBoot解决跨域的5种方式
本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...
- springboot 多数据源配置的几种方式
springboot多数据源配置的三种方式 application.yml配置 1.@Ds("配置数据源名称") 引入依赖 <dependency> <group ...
- 【302期】SpringBoot 项目鉴权的 4 种方式,你了解吗?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 文章介绍了 ...
- Springboot实现登录拦截的三种方式
文章目录 1. 登录认证 1.1 介绍 1.2 方式 1.3 扩展 2. 实现 2.1 项目结构以及前置准备 2.2 过滤器实现登录拦截 2.3 拦截器实现登录拦截 2.4 AOP+自定义注解实现 2 ...
- SpringBoot实现多数据源的两种方式
前言 公司项目有连接多个不同数据库的需求,特研究了一下,根据网上的资料,造了一个基于AOP方式的数据源切换轮子,但继续探索,突然发现有开源的多数据源管理启动器.不过,本篇两种方式都会介绍. 基于dyn ...
- springboot 获取enviroment.Properties的几种方式
springboot获取配置资源,主要分3种方式:@Value. @ConfigurationProperties.Enviroment对象直接调用. 前2种底层实现原理,都是通过第三种方式实现. @ ...
- Springboot打jar包的几种方式
springboot打jar的几种方式 一.使用IntelliJ IDEA Spring Boot打jar包 第一步:POM文件的修改: <plugins><plugin>&l ...
最新文章
- SpringBoot 接口幂等性的实现方案
- Intellij IDEA + Maven + Cucumber 项目 (三):简单解释RunCukesTest.java
- CodeForces - 820D Mister B and PR Shifts(思维+模拟)
- FTP配置文件详解vsftpd.conf
- python实现接口自动化_python 实现接口自动化1
- 十二.激光SLAM框架学习之livox-loam框架安装和跑数据集
- IE11 0x2ee4 bug 以及类似问题解决方法
- 能跑的东西,尽量继续跑,平稳过渡
- GIMP的Path的import和export
- 大学生创业实战 - 代充的套利故事
- 用Python制作我的核酸检测日历
- Google Earth Engine(GEE)——1981-2020年全球降水数据年均降水量直方图表示(北京市为例)
- win7 IE中使用svg时利用symbol的方式出现卡死现象
- GPS 入门 7 —— GPS定位、LSB基站定位、wifi定位区别
- 固体激光器的转换效率
- 如何获取淘宝商品类目信息,通过商品ID获取商品类目?
- 解决ubuntu18 上网速度慢的问题(已经确定没用,你的网速慢就是网速慢)
- halcon循环语句,条件句结构格式
- 机器学习面试题之机器学习基础(一)
- Android 使用阿里推送服务报错Manifest merger failed