向 IOC 容器中添加组件的几种方式


1. 通过 @Bean的方式来导入组件(适用于导入自己的类/第三方组件的类)

@Configuration 
public class MainConfig {
 	@Bean
    public Person person() {
        return new Person();
    }
}

2.通过@CompentScan +@Controller @Service @Respository @compent 组合使用导入

// 此处以SpringBoot为例
// 1.在启动类,添加ComponentScan,指定扫描哪个包下的文件
@SpringBootApplication
@ComponentScan(value="com.example")   // value也可以接多个包,它是一个String[]类型
public class DemoApplication {
	public static void main(String[] args){
		SpringApplication.run(DemoApplication.class, args);
	}
}
// 2.在指定配置扫描的包下,在类中使用@Controller/@Service 这些注解即可
@Controller
public class HomeController{
	// 这样,HomeController类也就会被扫描到 Spring IOC 容器中
}

3. 通过 @Import 来导入组件 (这种方式导入组件的id为全类名路径)

@Configuration
@Import(value={Person.class, Car.class})
public class MainConfig {
	
}	

4. 通过@Import + ImportSeletor类实现组件的方式,来导入组件(可以指定bean的名称)

// 1.定义类,实现ImportSelector类,重写selectImports()方法
public class MyImportSelector implements ImportSelector {
	// 可以获取导入类的注解信息
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[]{"com.example.entity.Person"};    // 要导入IOC容器类的全类名路径
	}
}

// 2.使用@Import方式导入
@Configuration
@Import(value={Person.class, Car.class, MyImportSelector.class})
public class MainConfig {

}

5. 通过@Import + BeanDefinitionRegister导入组件(可以指定bean的名称)

// 1.定义类,实现ImportBeanDefinitionRegistrar类,重写registerBeanDefinitions()方法
public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar{
	// 可以获取导入类的注解信息
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		//创建一个bean定义对象 
		RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class); 
		//把bean定义对象导入到容器中 
		registry.registerBeanDefinition("person",rootBeanDefinition);
	}
}

// 2.使用@Import方式导入
@Configuration
@Import(value={Person.class, Car.class, MyBeanDefinitionRegister .class})
public class MainConfig {

}

6. 通过实现FacotryBean接口来实现注册 组件

// 1.定义MyFactoryBean类,实现FactoryBean类,重写getObject()/getObjectType()/isSingleton()方法
public class MyFactoryBean implements FactoryBean<Person> {

	// 返回bean的对象
	@Override
	public Person getObject() throws Exception {
		return new Person();
	}

	// 返回bean的类型
	@Override
	public Class<?> getObjectType() {
		return Person.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}
}

// 2.使用getBean()方法获取bean实例
@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyFactoryBean.class);
		// bean名称为类名首字母小写
		Object bean = ac.getBean("myFactoryBean");   // 获取的是指定的bean对象
		System.out.println(bean);
		Object bean1 = ac.getBean("&myFactoryBean");  // 名称加个&,获取工厂bean本身对象(MyFactoryBean类)    
		System.out.println(bean1);
	}
}

在这里插入图片描述

FacotryBean方式添加组件至IOC容器,运用场景:

  对于创建过程比较复杂的对象的创建,目前Spring其实有很多实现方式了,而FactoryBean只是其中一种,也许我们不会采用此种方式来实现实例对象的创建,但我们需要能够看懂此种方式,知道有这种实现方式;很多第三方都沿用了此种方式,我们去追源码的时候,很容易就能碰到;


博主写作不易,加个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

我不能保证所写的内容都正确,但是可以保证不复制、不粘贴。保证每一句话、每一行代码都是亲手敲过的,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扛麻袋的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值