我使用Gucie 3.0来拦截任何具有我定义的注释@Log必需的方法。但是对于我的应用程序,一些bean由Spring使用注入的字段值初始化。在调用giuce injector. inject会员(this)后,bean被guice代理,但所有原始字段值都消失了。看起来Guice重新构建了bean并丢弃了所有旧值。这是预期的行为还是我如何解决这个问题?
创建一个类扩展AbstractModule
public class InterceptorModule extends AbstractModule{ public void configure()
{LogInterceptor跟踪=new LogInterceptor();请求注入(跟踪); bindInterceptor(Matcher.any(),Matcher.annotatedBy(Log必需.class),跟踪);}}
定义拦截器业务逻辑
public class LogInterceptor implements MethodInterceptor { //business logic here }
创建日志服务类
Public class LogService { Injector injector = Guice.createInjector(new InterceptorModule()); }
我有一个下面的bean示例,getName方法想要被拦截:
public class UserImplTwo implements IUser {
private String name;
@LogRequired
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
由Spring上下文初始化:
最后我有一个消费者来消费bean:
public class Consumer
{
@Inject
private UserImplTwo instance;
public void setInstance(UserImplTwo instance)
{
this.instance = instance;
}
public void init()
{
// the value of name is printed out as 'hello world'
System.out.println( this.instance.getName());
LogService.injector.injectMembers(this);
// the value of name is printed out as null, should be 'hello world'
System.out.println( this.instance.getName());
}
}
然后使用Spring初始化bean:
<bean id="consumer" class="com.demo.Consumer" init-method="init">
<property name="instance" ref="userTwo"></property>
</bean>
请让我知道这是正确的方法还是我做错了什么,因为我必须使用Spring来初始化一些bean。
一个正确的方法可能是保持事情简单,如果你使用Spring框架,使用Spring的DI,而不是尝试与Guice混合和匹配:-)
话虽如此,似乎没有技术上的原因,为什么它们不能在某种程度上混合搭配在一起。
我认为你会在另一种方法上取得更大的成功。我以前使用过的一种方法是利用SpringMVC基于Java的配置。这是基本方法。
创建一个扩展WebMvcConfigurationSupport的类:
@Configuration
@Import(BeansConfig.class)
public class Config extends WebMvcConfigurationSupport {
}
分离出您的bean配置(可能它可以与上面的代码合并,但我想它是相当沉闷的代码,您通常不想看到它)。并在将它们提供给Spring之前使用它来使用Guice注入器创建您的bean。
@Configuration
public class BeansConfig {
@Bean
public Consumer getConsumer() {
return SomeGuiceInjectorFactory.newInstance(Consumer.class);
}
}
将其包含在您的Spring. xml中(如果您的servlet容器比我的容器更新,则以其他方式引导)
<context:annotation-config/>
<bean id="extendedWebMvcConfig" class="Config"/>
构造函数注入和大多数/所有?其他Guice优点也应该适用于这种场景。
此外,您不需要在xml中配置您的bean。