irpas技术客

@Component与@Configuration区别_战战的坚果_configuration和component的区别

未知 8054

@Component与@Configuration区别:

@Configuration本质上还是@Component。

@Configuration标记的类必须符合下面的要求: 1.配置类不能是 final 类、都必须声明为static 2.配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类, 3.配置类必须是非本地的(即不能在方法中声明,不能是 private)。

Spring 容器在启动时,会加载默认的一些PostPRocessor,其中就有ConfigurationClassPostProcessor, 这个后置处理程序专门处理带有@Configuration注解的类,这个程序会在bean 定义加载完成后,在bean初始化前进行处理。

@Configuration public class AppConfig { // 集群 @Value("${redis.sentinel}") private String redisAddress; @Value("${redis.master}") private String master; @Value("${redis.password}") private String password; @Autowired private UserFeignClient userFeignClient; @Bean public ThreadPool threadPool() { return new ThreadPool(100); } @Bean public BeanChangeUtil beanChangeUtil() { return new BeanChangeUtil(userFeignClient); } @Bean("redissonConfig") public Config getRedisConfig() { Config config = new Config(); SentinelServersConfig ssc = config.useSentinelServers().setMasterName(master); Set<String> redisSet = StringUtils.commaDelimitedListToSet(redisAddress); for (String address : redisSet) { ssc.addSentinelAddress(address); ssc.setPassword(AESUtil.AESDecrypt(password,"ECB")); } return config; } } @Component @Order(value = 1) public class StartService implements ApplicationRunner { @Autowired private PointToPointTask pointToPointTask; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("启动日报定时任务:"+new Date()); pointToPointTask.start(); } }

【重要区别】

@Component:会当做配置类,但不会为其生成CGLIB代理class

@Configuration:会当做配置类,但会为其生成CGLIB代理class

在获取当前类名时,使用@Component获取的是当前类名;而@Configuration获取的是当前类名+唯一标识(CGLIB代理)

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #final #bean #注解生成 #Spring