我有一个带有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
在编程方面确实是个好主意,我不想失去它
现在我有两个问题!!
如何在不使用xml上下文文件的情况下实现
A
接口的AutoWire
类
有可能吗?当我将bean的
scope
从singlton
更改为prototype
如下:<bean id="b" class="org.iust.ce.me.B" scope="prototype"></bean>
并实例化其中的几个bean,只有在创建
context
时实例化的bean是injected
到AutoWired
变量中。为什么?
如有任何帮助,我们将不胜感激。
不确定您使用的Spring版本。但目前你可以用@Configuration
来代替.xml
以下是文档中的代码
@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");
}
如果要管理的类已经正确注释,Spring可以扫描应用程序的文件以获得所需的信息,而不需要任何xml或java配置文件。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.something.something.etc");
context.refresh();
...context.getBean("name_of_bean");
注意AnnotationConfigApplicationContext
是在没有任何参数的情况下实例化的。context.scan("...");
获取一个字符串,该字符串告诉Spring在哪里查找。即程序包
com.something.something.etc.onecom.comething.something.etc.two将被扫描,并且那些用
@Component
、@Autowired
等注释的包中的类将被初始化并在需要的地方注入。
这种方法似乎没有得到很好的记录。
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;
}