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在编程中确实是个好主意,我不想失去它。

现在我有两个问题!!

  1. 如何在不使用 xml 上下文文件的情况下AutoWire实现接口的类? 有可能吗?A

  2. 当我将scopebean 从singlton更改 prototype为如下时:

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

    并实例化它的几个bean,只有在创建过程中实例化的beancontext才会injected进入AutoWired变量。为什么?

任何帮助将不胜感激。

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 回答
2

如果要管理的类已正确注释,Spring 可以扫描应用程序的文件以获取所需的信息,而无需任何 xml 或 java 配置文件。

AnnotationConfigApplicationContext  context = new AnnotationConfigApplicationContext();
context.scan("com.something.something.etc");
context.refresh();
...context.getBean("name_of_bean");

NoteAnnotationConfigApplicationContext被实例化,没有任何参数。context.scan("...");接受一个字符串,告诉 Spring 去哪里看。即包

com.something.something.etc.one
com.comthing.something.etc.two
将被扫描,并且这些包中带有@Component,@Autowired等注释的类将被实例化并在需要的地方注入。

这种方法似乎没有很好的记录。

于 2017-04-18T17:20:06.680 回答
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 回答