1. 动机与目标
- 通过Java注解方式配置
IOC
容器随着Springboot
的使用已经逐渐形成了风靡,在日常开发中,启动时可能报错提示找不到beanDifinition,对于此类问题,了解@Component
的机制对于排查问题很有帮助; - 为了应对面试;
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
4. 使用心得
- 对于某些第三方工具包里面的类可能会被
@Component
注解修饰,在使用这些类的时候,由于项目的包扫描@ComponentScan
一般不会配置扫描第三方工具包,也不会这么做,因为无法评估工具包下的bean
都是安全且合乎要求的。这个时候可以通过写一个被@Component
修饰的类,里面可以写一个被@bean
修饰的方法,return
新的工具类,还有一个方式在配置类或者组件类上使用@Import
注解(待生产验证)。