为什么Spring @Autowired会注入另一个目标?

时间:2017-11-19 16:39:18

标签: java spring spring-boot

我正在使用Spring Boot v1.5.8.RELEASE。

我已经定义了WebSocketHandler,其中我保留了会话列表。 在另一个@Component我已经自动装配此处理程序以到达其会话。但它总是零大小(虽然原来不是)。难道我不能自动装配相同的单一物体吗?为什么?默认情况下不是@Component单身?

以下是代码:

WebSocketHandler.java

@Component
public class WebSocketHandler extends TextWebSocketHandler {

    public CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<WebSocketSession>();

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        System.out.println("SIZE: "+ sessions.size()); // -> This grows as clients connected
    }

    public CopyOnWriteArrayList<WebSocketSession> getSessions() {
        return sessions;
    }
}

MyComponent.java

@Component
public class MyComponent {

    @Autowired
    WebSocketHandler wshandler;

    @Scheduled(fixedRate=20000)
    public void mytask() {
        System.out.println(wshandler.sessions.size()); // THIS IS ALWAYS ZERO           
        // wshandler.getSessions().size() -> no difference
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个假的错误。 在我直接从一个例子中复制的WebSocketHandler的配置中,我已经在创建一个处理程序。

package database.config

import javax.inject.{Inject, Singleton}

import play.api.db.slick.DatabaseConfigProvider
import play.db.NamedDatabase
import slick.jdbc.{JdbcProfile, PostgresProfile}

@Singleton
final class DatabaseProvider @Inject()(@NamedDatabase("postgres") configProvider: DatabaseConfigProvider) {
  val dbConfig = configProvider.get[PostgresProfile]
}

所以,修复很简单:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/mywebsocket").setAllowedOrigins("*");     
    }
}

感谢Dovmo,我还将类的名称更改为MyWebSocketHandler,因为Spring已经有了WebSocketHandler。