2017-03-06 8 views
0

Loggerオブジェクトを手動で作成していますが、SpringはUserServiceを期待通りに初期化しません。 SpringにUserServiceの初期化を強制するにはどうすればよいですか?AutowiredなしでSpringサービスを初期化するには?

以下のコードを試しましたが、初期化されません。

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); 
userService = context.getBean(UserService.class); 

ここはJobServiceです。

@Service 
public class JobService{ 
    private static final Logger logger = LoggerFactory.getLogger(JobService.class); 

    doJob(){ 
     logger.info("Job is starting..."); 
     ..... 
    } 
} 

My LoggerFactory;

public class LoggerFactory { 

    public static Logger getLogger(Class clazz) { 
    Logger logger = new Logger(clazz); 
    return logger; 
    } 

    private LoggerFactory() { 
    throw new UnsupportedOperationException("Not instantiable"); 
    } 

} 

そして、私のLogger;

public class Logger { 
    @Autowired 
    UserService userService; 

    public void info(String message){ 
     User user = userService.getCurrentUser(); //userService is null 
    } 
} 

答えて

0

あなたはLoggerFactory、ないのSpring Beanファクトリを使用してLoggerをインスタンス化します。

LoggerはSpringコンポーネントではありません。つまり、Springは依存関係の配線を担当しません。

あなたが行う瞬間、それは春のコントロール外です。

この依存関係は正しいとは限りません。 Loggerにはサービスがありません。それは別の方法であるべきです。

サービスからユーザー情報を取得し、Loggerに渡します。

代替手段がない場合、SpringにBeanとしてLoggerをインスタンス化する必要があります。次に、あなたが請求するクラスのにそれを注入する必要があります。

私はまだ2番目の選択肢が大きな問題だと言います。

なぜ何千ものクラスが同じことをしなければならないのだろうかと思います。アスペクトにログインして1か所でやり直す方が良いのではないでしょうか?

あなたの質問はあなたのシステムに大きな問題があることを示唆しています。

+0

すべてのプロジェクトにユーザー情報を追加する必要があるため、ユーザー情報を取得してLoggerに渡すことはできません(何千ものクラスがあります) UserServiceを初期化する方法は? – hellzone

+0

ひどいデザインのような音。何千?疑わしい。 – duffymo

0

あなたは、アノテーションによって、あるいは、このようなXMLで@ComponentScan指定する必要があります。

をしかし、私はあなたのエラーはあなたのLoggerクラスがBeanではないということだと思います。 Beanクラスに対してのみBeanをオートワイヤードすることができます。デフォルトでは、Beanはシングルトンインスタンスであり、Factoryアプローチを使用しています。 Factory Beansを見てみよう:https://spring.io/blog/2011/08/09/what-s-a-factorybean

関連する問題