Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is Spring not wiring my @Autowired members in a dependent jar?

I'm building a Google App Engine app using Spring 3.1 and am having a problem getting members in one of my jars wired.

I have three projects:

  1. server
  2. server.model
  3. server.persistence

I have an ant build script so that when my workspace builds, it creates jars for server.model and server.persistence, and puts them in the correct lib directory for the server project.

In server, I can autowire things from both server.model and server.persistence, but in server.model my server.persistence beans aren't getting wired even though they're the exact same as in server.

snippet from my servlet application config:

<context:component-scan base-package="com.impersonal.server"/>          

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore"/>

<bean autowire="byType" id="userList" class="com.impersonal.server.model.UserList"/>

I have the following code in both the server project and the server.model project, and only the server one gets fulfilled. Here's the one failing:

package com.impersonal.server.model;

import java.util.ArrayList;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;

import com.impersonal.server.persistance.AppEngineDataStore;
import com.impersonal.server.persistance.IDataStore;

public class UserList extends ArrayList<User>
{
    private UserList(){}

//this is always null, but the same line in a class in the other project works
private @Autowired AppEngineDataStore _dataStore;

public UserList(UUID userId, String tempId)
{
    String poo = "poo";
    poo.concat("foo ");

    int i = 3;
}
}

Edit: Just did a test in the server.model project trying to @Autowired something that I don't have defined as a bean in my application config, and didn't get any errors. I should have got a 'no such bean found' error like I do if I do the same thing for the server project.

Any ideas why?

like image 484
MStodd Avatar asked Jun 21 '12 08:06

MStodd


People also ask

Why is my Autowired not working?

When @Autowired doesn't work. There are several reasons @Autowired might not work. When a new instance is created not by Spring but by for example manually calling a constructor, the instance of the class will not be registered in the Spring context and thus not available for dependency injection.

Is @autowired used for dependency injection?

Spring @Autowired annotation is used for automatic dependency injection. Spring framework is built on dependency injection and we inject the class dependencies through spring bean configuration file.

What are the Autowiring modes Spring uses to resolve Autowired dependencies?

Autowiring by autodetect uses two modes, i.e. constructor or byType modes. First, it will look for valid constructor with arguments. If it is found, then the constructor mode is chosen. If there is no constructor defined in a bean, the autowire byType mode is chosen.

Can we use @autowired in pojo?

The beans can be wired via constructor or properties or setter method. For example, there are two POJO classes Customer and Person. The Customer class has a dependency on the Person. @Autowired annotation is optional for constructor based injection.


1 Answers

I was instantiating my objects incorrectly. For framework objects and such like MVC controllers, you don't need to do anything to get your @Autowired members wired.

For objects I was creating on the fly, I wasn't going through the IOC container, that's why their dependencies weren't being fulfilled.

like image 138
MStodd Avatar answered Oct 18 '22 11:10

MStodd