獲取bean
Class beanClass = Class.forName(event.className);
FilterEvent filterEvent = (FilterEvent)BeansContext.getWebApplicationContext().getBean(beanClass);
event.className為要獲取的類名
1 反復檢查類名是否正確 ok
2 檢查包掃描配置是否正確 ok
3 檢查bean 是否已注冊 ok 檢查之后確認bean沒有問題
@Service public class GDXMMXExtendEx implements FilterEvent { @PostConstruct public void init(){ System.out.println("==============?"); } }
4 在代碼其他地方獲取bean ok
5 對比能獲取到bean 與不能獲取到bean 時的差異 發現
beanClass上的classloader 不一致
能獲取到bean的classloader 為RestartClassLoader
不能獲取到bean的classloader 為AppClassLoader
查詢classloader的區別 發現 devtools 可能會影響classloader
去掉這個插件 一切正常了
<!-- <dependencies>--> <!-- <dependency>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-devtools</artifactId>--> <!-- <optional>true</optional>--> <!-- </dependency>--> <!-- </dependencies>
補充:20191217
打包的時候將文件屏蔽掉了
我的bean 叫FIAPITestService 下面這個排除剛好排除掉
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.yaml</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude>ApplicationTest.class</exclude>
<exclude>**/*Test*.class</exclude>
<exclude>**/static/**</exclude>
<exclude>**/**/*.yaml</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
參考:
1 https://blog.csdn.net/qq_36285899/article/details/82867768