1

私のspring.xmlは以下の通りです

<?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);
    }

}

しかし、私は出力をヌルとして取得します。適切に自動配線できません。どこが間違っていますか?

4

2 に答える 2

9

これを行う場合:

App app=new App();

Spring によって管理されない App の新しいインスタンスを作成するため、自動配線されたコンポーネントはありません。

Spring xml で App Bean を宣言し、それを取得する必要があります。context.getBean("beanName")

たとえば、Spring XML では、Bean を次のように宣言できます。

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

そしてそれを元に戻すとcontext.getBean("app")、Autowired コンポーネントが含まれます。

于 2013-06-27T08:09:55.723 に答える
6

を使用して Bean を検索する必要はありませんcontext.getBean("beanName")
これにより、Spring フレームワークへの不要な依存関係が導入されます。それはあまりきれいではありません。

Appクラスにアノテーションを付けたほうがよいかもしれません@Configurable

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

spring.xml に 1 つのタグを追加します。

<context:spring-configured />

それで全部です。Appこれで、必要に応じてクラスを作成でき、自動配線が機能します。

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

注: クラスパスに spring-aspects、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>
于 2013-06-27T09:00:49.407 に答える