10

私は次のように2つの春の豆を持っています:

@Component("A")
@Scope("prototype")
public class A extends TimerTask {

    @Autowired
    private CampaignDao campaignDao;
    @Autowired
    private CampaignManager campManger;
    A(){
        init_A();
       }
    }

レガシーコードのため、新しいキーワードでAの新しいオブジェクトを作成する必要があります

@Component("B")
@Scope("prototype")
public class B{
     public void test(){
       A a = new A();
     }
}

実行中->クラスAのSpringBeanがnullの場合、Spring Bean Aの新しいインスタンスを作成し、それでも自動配線を使用できますか?

4

2 に答える 2

16

コンポーネント「A」はSpringコンテナによって作成されていないため、依存関係は注入されません。ただし、(あなたの質問から理解できるように)いくつかのレガシーコードをサポートする必要がある場合は、@Configurableアノテーションとビルド/コンパイル時のウィービングを使用できます。

@Configurable(autowire = Autowire.BY_TYPE)
public class A extends TimerTask {
  // (...)
}

次に、Springは、コンテナー自体によってインスタンス化されているか、またはレガシーコードでインスタンス化されているかに関係なく、自動配線された依存関係をコンポーネントAに注入しますnew

たとえば、Mavenプラグインを使用してビルド時のウィービングを設定するには、次のことを行う必要があります。

  1. <context:spring-configured/>Springアプリケーションコンテキストに追加する
  2. Maven AspectJプラグインを構成します:

ビルドプラグインセクション:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>aspectj-maven-plugin</artifactId>
      <version>1.4</version>
      <configuration>
        <complianceLevel>1.6</complianceLevel>
        <encoding>UTF-8</encoding>
        <aspectLibraries>
          <aspectLibrary>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
          </aspectLibrary>
        </aspectLibraries>
        <!-- 
          Xlint set to warning alleviate some issues, such as SPR-6819. 
          Please consider it as optional.
          https://jira.springsource.org/browse/SPR-6819
        -->
        <Xlint>warning</Xlint>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>test-compile</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

...および依存関係セクション:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.6.11</version>
</dependency>

詳細については、Springリファレンスを参照してください: http ://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable

于 2012-06-12T13:47:31.190 に答える
2

new演算子を使用してクラスAのオブジェクトを自分で作成しているため、そのオブジェクトの自動配線フィールドを取得してnullを検出することはありません。春のコンテナから豆を取得してみてください。

これがお役に立てば幸いです。乾杯。

于 2012-06-12T13:06:30.413 に答える