开发者

Spring not injecting bean if it is instantiated on definition

开发者 https://www.devze.com 2023-03-27 22:40 出处:网络
I have a session scoped bean defined like so: <!-- this is where the serviceImpl bean is defined -->

I have a session scoped bean defined like so:

<!-- this is where the serviceImpl bean is defined -->
<import resource="classpath:META-INF/*-core-context.xml"/>

<bean id="myBean" class="com.company.Bean">
    <property name="service" ref="serviceImpl"/>
</bean>

Now inside the bean I have defined a default value f开发者_StackOverflow社区or the injected service like so:

public class Bean {

    private Service service = new NullService();

    public void setService(Service service) {
        this.service = service;
    }
}

What I want to do is to provide the ability to optionally inject the service and if you choose not to the Bean will use the NullService implementation which simply does nothing, not affecting the bean logic in any way.

The problem is that for some reason the serviceImpl is never injected and I always end up with the NullService implementation.

So is there some spring setting or feature which prevents it from injecting it ? Or do you have any other ideas on why this might happen ?


More info

This is the setter that spring uses to inject the service:

public void setPermissionsService(PermissionService permissionsService) {
    this.permissionsService = permissionsService;

    System.out.println("setting permissions service to: " + permissionsService.getClass().getName());
    if (this.permissionsService instanceof NoopPermissionsServiceImpl) {
        System.out.println("NULL IMPLEMENTATION");
    }
    else if (this.permissionsService instanceof PermissionServiceImpl) {
        System.out.println("CORRECT IMPLEMENTATION");
    }
    else {
        System.out.println("WHAT ?!?!");
    }
}

It prints "WHAT ?!?!".

So it turns out spring sets it to a dynamic proxy $Proxy859. Is there a way to see the class the proxy is proxying ?


You seem to be lacking a definition for your serviceImpl bean in your configuration. Something like

<bean id="serviceImpl" class="com.company.ServiceImpl" />


The only solution I see to your problem is to reverse-engineer this a bit. Do something like that in the same spring.xml:

<bean id="myBean" class="com.company.Bean">
  <property name="service" ref="testServiceImpl"/>
</bean>

<bean id="testServiceImpl" class="com.company.TestServiceImpl" />

Then implement the TestServiceImpl with simple debug messages indicating that construction and your service call is actually working. This has to work. If it does you have a problem with your original service definition. If not you have a problem in your Bean.

Try to narrow the problem to a simpler. And then work into the simpler problem.

Good luck!


Instead of using instanceof use Class.isAssignableFrom(Class)

0

精彩评论

暂无评论...
验证码 换一张
取 消