Всегда вставляйте некоторые поля в сервис Spring через контекст - PullRequest
0 голосов
/ 06 мая 2011

У меня есть следующий класс:

@Service
public class TestService{

    @Autowired
    private Integer size;

    private MyClass myObject;

    public Test(){
        // Default constructor for Spring
    }

    public Test(MyClass myObject){
        this.myObject = myObject;
    }

    // Getters and Setters ...

}

Теперь я создаю экземпляр моего TestService извне этого класса с помощью

new TestService(myObject);

Переменная size, конечно, null. Но я хочу, чтобы он был внедрен из контекста весны, хотя я и не вводил весь объект.

Можно ли всегда вводить некоторые поля?

Ответы [ 3 ]

3 голосов
/ 06 мая 2011

Самый простой способ - использовать статическую компиляцию AspectJ (или ткачество времени загрузки) и @Configurable: любой объект с аннотацией @Configurable будет автоматически подключен, даже если его экземпляр реализован через new()

Но более традиционный способ - подключить его программно:

MyBean foo = new MyBean();
ApplicationContext ctx = // whereever you get your context from
ctx.getAutowireCapableBeanFactory().autowireBean(foo);
1 голос
/ 06 мая 2011

Да, вы можете поместить произвольный объект в процесс автоматической разводки, используя:

appContext.getAutowireCapableBeanFactory().autowireBean(existingBean)

Для этого вам все равно нужна ссылка на appContext, что вам решать.

Более изощренный способ - использовать ткачество во время загрузки, используя AspectJ и @Configurable, но для этого требуется больше усилий по настройке - см. docs .

0 голосов
/ 06 мая 2011

Я не думаю, что это возможно. Только объекты, которые создаются экземпляром, являются теми, которыми он управляет жизненным циклом. Я имею в виду, что у Spring нет способа узнать, что вы создали этот объект. Может быть, если он подключен к самой JVM, он может это сделать, но это не так. И философски не так, как написано IoC и будет написано.

...