据我所知,Spring并没有这样的概念。
然后只知道处理点是一个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;
}
}
谢谢拉尔夫!好的,只要有任何bean被注入到任何地方,就会调用这个BeanPostProcessor。有什么方法可以识别**要注入的bean是什么?我的意思是我得到了:'postProcessBeforeInitialization(Object bean,String beanName)'其中'bean'是一个需要进行注入的bean(我在问题中已经问过**的**部分),'beanName '是'bean'的名字。现在我不知道'bean'中的哪个字段想要进行注入 - 换句话说,我不知道注入的bean是否是LoggerProvider或别的东西。 – 2012-03-14 13:04:34
正如我所了解的那样,后处理程序在创建bean后被调用! (没有注入任何地方)。这个想法是在豆后处理器之上实现你自己的小型注入框架。 – Ralph 2012-03-14 13:34:28
好的,所以每当创建一个bean时都会调用BeanPostProcessor实现者。所以,你的想法是实现'postProcessBeforeInitialization'和扫描具有我自定义注释的字段(让我们说'@ Logger'),并通过反射,使用我自己的自定义逻辑来初始化此字段。这是你的方法还是我太复杂了?再次感谢! – 2012-03-14 13:47:34