@ComponentScan组件扫描原理
下面是一步步模拟@ComponentScan注解的实现原理,首先需要找到扫描的包。
转换包路径,通过Context的拓展功能解析并获取资源(获取扫描到的编译后的类路径文件)。
在com.example.demo2.b03.component中添加Bean,其中Bean4不加@Component注解。
package com.example.demo2.b03.component;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:58*/
@Component
public class Bean2 {private static final Logger log = LoggerFactory.getLogger(Bean2.class);public Bean2(){log.info("我被spring管理了");}
}
package com.example.demo2.b03.component;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:58*/
@Component
public class Bean3 {private static final Logger log = LoggerFactory.getLogger(Bean3.class);public Bean3(){log.info("我被spring管理了");}
}
package com.example.demo2.b03.component;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:58*/public class Bean4 {private static final Logger log = LoggerFactory.getLogger(Bean4.class);public Bean4(){log.info("我被spring管理了");}
}
打印资源路径:
上面是获取到编译后的类路径,继续解析注解元数据信息,判断是否加了@Component注解。
CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory();
对于派生的@Conponent注解也想要判断的话,需要再加一层校验。把bean3的@component注解换成@Controller注解。