1. @Component注解的原理剖析

1. 动机与目标

  1. 通过Java注解方式配置IOC容器随着Springboot的使用已经逐渐形成了风靡,在日常开发中,启动时可能报错提示找不到beanDifinition,对于此类问题,了解@Component的机制对于排查问题很有帮助;
  2. 为了应对面试;

2. 测试用例

spring framework version: 5.1.x

配置类

/**
 * @author: virgil
 * @date: 2022/7/24 12:04 AM
 **/
@ComponentScan(basePackages = "edu.analysis.spring.component")
@Configuration
public class MainConfig {

	public MainConfig() {
		System.out.println("call MainConfig no-arg construct...");
	}

}

被Component注解修饰的类

@Component
public class TargetComponent {

	public TargetComponent() {
		System.out.println("call TargetComponent no-arg construct...");
	}

	public void sayHello() {
		System.out.println("hello...");
	}

}

为了能够说明@ComponentScan的机制和@Component、@Service、@Repository的关系,再补充两个测试类。

被@Service修饰的类

/**
 * @author: virgil
 * @date: 2022/7/25 11:31 PM
 **/
@Service
public class TargetService {

	public TargetService() {
		System.out.println("call TargetService no-args construct");
	}

	public void sayService() {
		System.out.println("I am targetService ...");
	}

}

被@Repository修饰的类

/**
 * @author: virgil
 * @date: 2022/7/25 11:32 PM
 **/
@Repository
public class TargetRepository {

	public TargetRepository() {
		System.out.println("call TargetRepository no-args constructs");
	}

	public void sayRepository() {
		System.out.println("I am repository");
	}

}

驱动类(测试类)

/**
 * @author: virgil
 * @date: 2022/7/24 12:12 AM
 **/
public class MainTest {

	@Test
	public void componentTest() {
		ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
		TargetComponent targetComponent = applicationContext.getBean("targetComponent", TargetComponent.class);
		targetComponent.sayHello();
	}

}

3. 图示

ACA: AnnotationConfigApplicationContext

MainConfig ACA AnnotatedBeanDefinitionReader ClassPathBeanDefinitionScanner ConfigurationClassPostProcessor 创建IOC this() new new register() register doRegisterBean register mainConfig invokeBeanFactoryPostProcessors() processConfigBeanDefinitions() parse() doProcessConfigurationClass() doScan(basePackages) findCandidateComponents & registerBeanDefinition 从配置的包中找到 被@Component修饰的类 还应该有被@Service等修饰的类 MainConfig ACA AnnotatedBeanDefinitionReader ClassPathBeanDefinitionScanner ConfigurationClassPostProcessor

4. 使用心得

  1. 对于某些第三方工具包里面的类可能会被@Component注解修饰,在使用这些类的时候,由于项目的包扫描@ComponentScan一般不会配置扫描第三方工具包,也不会这么做,因为无法评估工具包下的bean都是安全且合乎要求的。这个时候可以通过写一个被@Component修饰的类,里面可以写一个被@bean修饰的方法,return 新的工具类,还有一个方式在配置类或者组件类上使用@Import注解(待生产验证)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值