2

非常にXMLがスリム化されたアプリケーションにSpringMVCコントローラーがあり、多くのアノテーションと可能な限り少ない構成を使用しています。コントローラは機能しており、多数のリソース値が注入されています。しかし、私はこのコントローラーで本当に奇妙な振る舞いを経験しました。他のコンポーネントを参照する注釈付きのプライベートフィールドは挿入されません。これは機能しません。

@Controller
public class EntranceUnitController {

    @Value("${remote.baseUrl}")
    private String baseUrl = "http://localhost";

    @Value("${remote.port}")
    private String pushPort = "8080";

    @Autowired
    private HttpClientFactory httpClientFactory;

    ...

httpClientFactoryプライベートフィールドが設定されているときはまだ存在しないようですが、ブレークポイントを設定して値を検査すると、もちろんnullコントローラーの作成時に設定されます。

ただし、コンポーネントのセッターを作成し、プライベートフィールドの代わりにset-methodに注釈を付けると、コントローラーは期待どおりに機能します。

@Controller
public class EntranceUnitController {

    @Value("${remote.baseUrl}")
    private String baseUrl = "http://localhost";

    @Value("${remote.port}")
    private String pushPort = "8080";

    private HttpClientFactory httpClientFactory;

    @Autowired
    public void setHttpClientFactory(HttpClientFactory httpClientFactory) {
        this.httpClientFactory = httpClientFactory;
    }

    ...

私にとって、これは本当に迷惑です。注入点に関係なく、注釈値の自動配線注入が同時に発生していませんか?つまり、オブジェクトにセッターが注入されることが重要なのはなぜですか?プライベートフィールドインジェクションの直後にコンストラクトとセッターが続くと思いましたが、その場合は間違っていると思い始めます...

4

1 に答える 1

4

依存関係が実際に注入されているようです。クラスが既に作成されているにもかかわらず、ブレークポイントを間違った時点 (早すぎる) に配置しているだけで、依存関係はまだ注入されていません。

コンストラクター注入を使用していない限り、注入された依存関係を使用できる最初の場所は@PostConstructメソッドであることに注意してください。

@Controller
public class EntranceUnitController {

    @Autowired
    private HttpClientFactory httpClientFactory;

    @PostConstruct
    public void init() {
        httpClientFactory  //should not be null
    }
于 2012-10-24T20:47:52.617 に答える