私が知る限り、春にはそのような概念はありません。
次に、処理されるポイントを認識しているのはBeanPostProcessorです。
例:
@Target(PARAMETER)
@Retention(RUNTIME)
@Documented
public @interface Logger {}
public class LoggerInjectBeanPostProcessor implements BeanPostProcessor {
public Logger produceLogger() {
// get known WHAT bean/component invoked this producer
Class<?> clazz = ...
return LoggerFactory.getLogger(clazz);
}
@Override
public Object postProcessBeforeInitialization(final Object bean,
final String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean,
final String beanName) throws BeansException {
ReflectionUtils.doWithFields(bean.getClass(),
new FieldCallback() {
@Override
public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
field.set(bean, produceLogger());
}
},
new ReflectionUtils.FieldFilter() {
@Override
public boolean matches(final Field field) {
return field.getAnnotation(Logger.class) != null;
}
});
return bean;
}
}
ありがとうラルフ!このBeanPostProcessorは、Beanがどこにでも挿入されるたびに呼び出されます。私が認識できる何らかの方法はありますか**どんな豆が注射されるのですか?私は 'postProcessBeforeInitialization(Object bean、String beanName)'を実行することを意味します。ここで 'bean'はインジェクションをしたいbeanです(私の質問で** who **の部分を尋ねました)。そして' beanName 'は' bean'の名前です。今、私は 'bean 'のどのフィールドが注入を望んでいるのかわかりません。言い換えれば、注入されたbeanが' LoggerProvider'かどうかわかりません。 –
私が理解しているように、ポストプロセッサが呼び出されると、Beanが作成されます。 (どこにも注入されていない)。アイデアは、Beanポストプロセッサの上に独自の小さなインジェクションフレームワークを実装することでした。 – Ralph
これで、Beanが作成されるたびに 'BeanPostProcessor'実装者が呼び出されます。ですから、あなたの考えは 'postProcessBeforeInitialization'を実装することでした。私のカスタム注釈を持っているフィールドを探してみましょう( '@ Logger'と言うことがあります)。そして、リフレクションを通して、自分のカスタムロジックを使ってそのフィールドを初期化します。これはあなたのアプローチですか、それとも私はそれをあまりにも複雑にしましたか?もう一度ありがとう! –