SpringBoot @Component無法注入其他Bean
一、現(xiàn)象
在SpringBoot新new一個普通類,習慣性添加@Component讓Spring掃描。
在@Component修飾的類里注入了其他Bean,運行時提示注入的為null
但這個Bean可以在控制層被引入,在普通類就不行。
二、解決
找了些資料,最后也沒解決注入的問題。
最后的方案就是去掉@Component注解,在new這個普通類時從Spring上下文實例中取出這個Bean賦給成員變量使用。
弊端:這個類非單例
三、代碼如下
ApplicationContextProvider
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文對象實例 */ private static ApplicationContext applicationContext; @SuppressWarnings("static-access") @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 獲取applicationContext * * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通過name獲取 Bean. * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通過class獲取Bean. * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通過name,以及Clazz返回指定的Bean * * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
IdentityCheckUtil
import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.FullHttpRequest; import org.apache.log4j.Logger; public class IdentityCheckUtil { private Logger logger = Logger.getLogger(IdentityCheckUtil.class); private UserMapper userMapper; public IdentityCheckUtil() { this.userMapper = ApplicationContextProvider.getBean(UserMapper.class); } public boolean allowedPass(ChannelHandlerContext ctx, FullHttpRequest fullHttpRequest) { System.out.println(userMapper); } }
@Component注解自動注入失效問題
使用@Component聲明 進行自動注入失效
@Component,在默認情況下只能掃描與控制器在同一個包下以及其子包下的@Component注解,以及能將指定注解的類自動注冊為Bean的@Service@Controller和@ Repository,將接口與對應實現(xiàn)類放在了與控制器所在包的同一級目錄下,這樣的注解自然是無法被識別的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/wkh___/article/details/87876442