4

アノテーション付きのインターフェースと、Componentそれを次のように実装したいくつかのクラスがあります。

@Component
public interface A {
}

public class B implements A {
}
public class C implements A {
}

Autowiredまた、次のような変数を持つクラスがあります。

public class Collector {
    @Autowired
    private Collection<A> objects;

    public Collection<A> getObjects() {
        return objects;
    }
}

私のコンテキストファイルは次の定義で構成されています。

<context:component-scan base-package="org.iust.ce.me"></context:component-scan>

<bean id="objectCollector" class="org.iust.ce.me.Collector" autowire="byType"/>

<bean id="b" class="org.iust.ce.me.B"></bean>
<bean id="c" class="org.iust.ce.me.C"></bean>

そしてメインクラスには、次のようなコードがあります。

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
B b = (B) context.getBean("b");
C c = (C) context.getBean("c");
Collector objectCollector = (Collector) context.getBean("objectCollector");

for (A object : objectCollector.getObjects()) {
    System.out.println(object);
}

出力:

org.iust.ce.me.B@1142196
org.iust.ce.me.C@a9255c

これらのコードはうまく機能しますが、いくつかの理由で、xmlコンテキストファイルを使用したくありません。newそれに加えて、メソッドを使用するよりも、演算子を使用してオブジェクトを作成する方が好きgetBean()です。それでも、AutoWiringプログラミングでは本当に良いアイデアなので、失いたくありません。

今、私は2つの質問があります!!

  1. xmlコンテキストファイルを使用せずにインターフェイスをAutoWire実装するクラスを作成するにはどうすればよいですか? それは可能ですか?A

  2. scopeBeanのをからに変更すると、singlton次 のprototypeようになります。

    <bean id="b" class="org.iust.ce.me.B" scope="prototype"></bean>

    そして、そのいくつかのBeanをインスタンス化します。作成context中にインスタンス化されたBeanのみが変数になります。なんで?injectedAutoWired

どんな助けでもありがたいです。

4

3 に答える 3

9

使用している Spring のバージョンがわからない。@Configurationただし、現在は.xml を置き換えるために使用できます。@Configurationを見てください。

以下はドキュメントのコードです

@Configuration
public class ServiceConfig {
    private @Autowired RepositoryConfig repositoryConfig;
    public @Bean TransferService transferService() {
        return new TransferServiceImpl(repositoryConfig.accountRepository());
    }
}

@Configuration
public interface RepositoryConfig {
    @Bean AccountRepository accountRepository();
}

@Configuration
public class DefaultRepositoryConfig implements RepositoryConfig {
    public @Bean AccountRepository accountRepository() {
        return new JdbcAccountRepository(...);
    }
}

@Configuration
@Import({ServiceConfig.class, DefaultRepositoryConfig.class}) // import the concrete config!
public class SystemTestConfig {
    public @Bean DataSource dataSource() { /* return DataSource */ }
}
public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);
    TransferService transferService = ctx.getBean(TransferService.class);
    transferService.transfer(100.00, "A123", "C456");
}
于 2012-10-08T13:05:39.973 に答える
0

1-操作を行う別のクラスを作成する必要があります。@Component を B および C クラスに書き込みます。

public static void main(){
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");  
    InitClass initClass = (InitClass) context.getBean("initClass");  
}


public class InitClass{  
   @Autowired 
   public B b;

   @Autowired 
   public C c;
}

これにより、xmlを使用せずにBとCを取得できます。

2- http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html Bean スコープの詳細については、こちらを参照してください。常に新しいオブジェクトが必要な場合は、プロトタイプを使用する必要がありますが、新しいオブジェクトの作成は別のクラスで行われます。同じクラスで、新しい参照を追加する必要があります。

お気に入り

public class InitClass{
    @Autowired 
    public A a1;

    @Autowired 
    public A a2;

}
于 2012-10-08T13:00:43.330 に答える