@Autowiredとstaticの関係

1146 ワード

げんりてきかいせき
静的変数、クラス変数はオブジェクトの属性ではなく、クラスの属性です.静的メソッドはクラス(class)に属し、通常のメソッドはエンティティオブジェクトに属します.(つまりNewから出たオブジェクト)のspring注入はコンテナ内でオブジェクトをインスタンス化するため、静的メソッドは使用できません.静的変数、クラス変数を使用して静的メソッドの使用範囲を拡大します.静的メソッドはspringでは推奨されません.注入に依存する主な目的は、コンテナにオブジェクトのインスタンスを生成させ、ライフサイクル全体で使用することです.また、testingの作業も容易になります.静的メソッドを使用すると、このクラスのインスタンスを生成する必要がなくなり、testingがさらに困難になります.また、与えられたクラスのために、注入方式によって異なる依存環境を持つ複数のインスタンスを生成することはできません.このstatic fieldは共有を隠し、globalグローバル状態であり、Springは同様に推奨しません.
ソリューション
1.構築方法に@Autowireを追加
@Component
public class Test {
    
    private static UserService userService;
    
    @Autowired
    public Test(UserService userService) {
        Test.userService = userService;
    }
    
    public static void test() {
        userService.test();
    }
}

2.@PostConstructで注記
@Component
public class Test {
    
    private static UserService userService;
    
    @Autowired
    private UserService userService2;
    
    @PostConstruct
    public void beforeInit() {
        userService = userService2;
    }
    
    public static void test() {
        userService.test();
    }
}