2013-06-27 3 views
1

мой spring.xml как нижеКак использовать @Autowired весной

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.2.xsd 

"> 
    <context:component-scan base-package="com.mkyong.service" /> 
    <context:annotation-config /> 

</beans> 

и я TEST1 класс

package com.mkyong.service; 

import org.springframework.stereotype.Component; 
@Component("test1") 
public class Test1 { 
public int i=1; 
} 

У меня есть класс App

package com.mkyong.common; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.mkyong.service.Test1; 

public class App 
{ 
    @Autowired 
    Test1 test1; 

    public static void main(String[] args) 
    { 
     ApplicationContext context = new ClassPathXmlApplicationContext(
       "spring.xml"); 
     App app=new App(); 

     System.out.println(app.test1); 
    } 

} 

Но я получить вывод как null.I не могу Autowire его правильно. Где я делаю неправильно?

+0

возможно дубликат [Почему моя весна @Autowired поле нулевой?] (Http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

ответ

8

Когда вы сделаете это:

App app=new App(); 

Он создает новый экземпляр приложения, который не управляется Spring, поэтому вы не будете иметь autowired компоненты.

Вы должны объявить компонент App в весеннем XML, а затем получить его с помощью context.getBean("beanName")

Э.Г. в Spring XML вы можете объявить боба что-то вроде этого:

<bean id="app" class="com.mkyong.common.App" /> 

, а затем вернуть его обратно с context.getBean("app"), то он будет иметь компоненты Autowired.

+1

Спасибо чувак , Теперь он отлично работает. Также я узнал из вашего ответа. Спасибо снова. Кстати, знаете ли вы, почему не разрешено принимать ответ в течение 6 минут? –

+1

@SanjayaLiyanage Читать [this] (http://meta.stackexchange.com/a/50703/219240): * Обоснование в том, что если люди принимают ответы в течение минут или даже секунд (без шутки), они даже не успел правильно оценить или проверить ответ. * – NINCOMPOOP

+0

@ TheNewIdiot да правильно. Спасибо man –

4

Вам не нужно искать фасоль, используя context.getBean("beanName"). Это вводит
ненужной зависимости от Spring framework. Это не очень чисто.

Лучше всего аннотировать ваш класс App аннотацией @Configurable.

... 
@Configurable 
public class App 
{ 
    @Autowired 
    Test1 test1; 
... 

и добавить в spring.xml один тег:

<context:spring-configured /> 

Вот и все. Теперь вы можете создать свой класс App так, как вы хотели, и автоустановка будет работать.

... 
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
App app=new App(); 
System.out.println(app.test1); 
... 

Примечание: вам нужны пружинные аспекты, spring-aop, aspectjrt на вашем пути к классу.

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
</dependency> 
+1

спасибо друг. Это действительно полезно. Я мог бы принять этот ответ, если бы это было быстро. Во всяком случае, это мой передовой для идеального ответа. –

+0

один компьютер работает, но в другом же проекте выводится нуль System.out.println (app.test1); после того, как я внес изменения, которые вы задали. –