springboot的@Autowired注入無法實例化service


一.問題場景:springboot整合netty時,netty的處理類無法實例化service
二.問題解讀:經過查閱資料,netty的bean對象默認不交由spring管理
三.解決方案:
@Component//1.添加注解
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    private static Log log = LogFactory.getLog(NettyServerHandler.class);

    @Autowired
    private RedisUtils redisUtils;

    //2.聲明本類
    private static NettyServerHandler nettyServerHandler;
    //3.聲明構造方案
    public NettyServerHandler(){}

    //4.添加注解,在項目初始化時執行這個方法
    @PostConstruct
    public void init() {
        nettyServerHandler = this;
        nettyServerHandler.redisUtils = this.redisUtils;
    }

=====================================
經過以上4步驟的處理

for (Map dto : variants){
    String key = dto.get("key").toString();                   
     nettyServerHandler.redisUtils.hmset(dto.get("key").toString(),
dto, 100000);
 }
//nettyServerHandler.redisUtils.hmset()  通過這種方式調用redisUtils就可以了
    
View Code
四.@PostConstruct 描述
@PostConstruct
從Java
EE5規范開始,Servlet增加了兩個影響Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。這兩個注解被用來修飾一個非靜態的void()方法.而且這個方法不能有拋出異常聲明。
@PostContruct是spring框架的注解,在方法上加該注解會在項目啟動的時候執行該方法,也可以理解為在spring容器初始化的時候執行該方法。

@PostConstruct在項目中的用處
@PostConstruct注解的方法在項目啟動的時候執行這個方法,也可以理解為在spring容器啟動的時候執行,可加載項目中常規數據。

spring中Constructor、@Autowired、@PostConstruct的順序
要將對象b注入到對象a,那么首先就必須得生成對象b與對象a,才能執行注入。所以,如果一個類a中有個成員變量b被@Autowired注解,那么@Autowired注入是發生在a的構造方法執行完之后的。

如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那么就無法在構造函數中實現。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。

Constructor >> @Autowired >> @PostConstruct

 

 

參考資料:https://www.cnblogs.com/kelelipeng/p/11309591.html

參考資料:https://blog.csdn.net/qq_39851704/article/details/80392867


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM