作者回复: 你仔细看看autoconfigure-demo那个项目的package,是geektime.spring.hello,包含了我们自动配置的类的geektime.spring.hello.greeting的,所以SpringBootApplication的扫描就能扫到我们的Configuration类,你换个包试试,没有包含关系,就不行了。
作者回复: 没太看明白你这里说的model和auto-config是指的什么。我大概猜测一下,你说是为什么我在geektime-spring-boot-autoconfigure里加了greeting这个artifact,为什么还要在autoconfigure-demo里再加greeting这个依赖吧。因为我用的scope是provided,并不会把它传递依赖进来。这个依赖应该由starter-dependency来引入,autoconfigure要做的就是Classpath里存在这个类时做配置,如果它自己就把这个依赖加进来了,我岂不是连判断都不用判了。
作者回复: 我的确没思考过这个问题,为此我自己DEBUG了一下,在spring.factories中EnableAutoConfiguration里加上这个类后,不管是否类上有@Configuration注解,这个类都会被作为配置类加载。@EnableAutoConfiguration的注释上也说了自动配置类就是普通的Configuration Bean,按照Spring的通常用法,还是考虑加上吧。
作者回复: 都会加载的
作者回复: 你在执行报错时给的一些提示信息就是由它们提供的,告诉你可能是什么问题,可以怎么怎么处理。
作者回复: 如果是接口的实现,那这些都是它的实现,你的问题应该是想问怎么知道具体运行过程中走了哪个实现吧。可以试着找配置文件,或者DEBUG,或者有时进行一些推断。通常如果不是多种不同实现,而是同一个类出现在不同jar里,那你就要小心是不是会存在运行过程中有不同的版本的类,可能会给你带来些小麻烦。
作者回复: 这是自己的电脑,虽说针对Mac的病毒不像Windows这么多,不够出于以防万一的角度,还是装了一个。不过大部分公司的确是有安装杀毒软件的要求。
作者回复: login是Spring容器注入到Bean的成员变量里的,你为了让main静态方法能访问到它将它设为了static的,main运行时login都还没被注入呢。运行run时容器已经都把Bean构造完了,依赖也都处理好了,自然就能找到了。
作者回复: 单单是Spring Boot的话,是不会实时读取配置文件的,启动时加载到什么就是什么了。Spring Cloud Config讲配置中心时我们会聊到能够动态生效的配置。