看 Spring - Autowired 的文档,从 2.5 版本开始就一直支持 Autowiring Arrays, Collections, and Maps。
不知道你用的哪个版本,但 2.5 以后应该都支持。
找到错误了。。判断条件写错了
在Spring中,Spring会认为一切Java类都是资源,而资源都是Bean,容纳并管理这些Bean的就是Spring所提供的IoC容器,pojo可以理解为Bean中的一部分。
可以使用@Qualifier指定装配
上面写的正规一点不应该使用raw type,应该是Collection<String> collection = new ArrayList<String>(); 数组能不能使用Autowired注解有没有人实验过??
我这样猜想,大概是 因为 Spring 源码中,@Autowired 注解 解析的时候, 有条件的是封装成 Map 类型, 如果突然用 HashMap 类型进行接收值,大概是会产生 【向下转型的概念】,所以才会报错。 《java机制中,向上转型是自动的, 向下转型 需要强制转换。。。。。》 用了 HashMap 类型来接收值,没有被强制转换,应该是会报错的
注入的是实现类的bean,例如一个借口有多个实现的话,可以用list,Map,Set等容器包装,通过循环容器获取对应的实现bean。
要看你的测试类中代码是怎么写的。
ApplicationContext 初始化了两次,定义在xml中的bean就也会初始化两次。
只能是接口吧
当然可以,@Autowired直接注解这个成员变量就可以了,相当于自动生成了SET方法 ,当然成员变量上不使用@Autowired,在它的setter方法或者该类的构造方法使用也是一样的。注意这总共是3种方法,不是需要同时使用的。
Bean不能是接口,而且父类可以调用子类构造器来生成对象,所以它会自动调用BeanInterface的子类来生成对象。
在Junit测试类上使用
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-config.xml"})
然后可以使用@Autowired进行自动装配
错误解决!是因为我导入的包围3.1.1,导入4以上的包就可以了。
你好,可以看看接口BeanInterface是否有具体的实现类,并且检查下该类是否被spring扫描或者通过配置的方式注入到spring的容器中
数组不为null不代表数size为0啊。加上size不为0,只为了确保数组里面有东西
List是个数组集合,指定@order或者实现ordered接口,是按索引升序的顺序输出的,不指定@order和ordered接口,就随机输出了。
版本的问题
楼上正解
@Component注解的Target是类,接口是不能实例化的。注解在接口上没有意义。就如xml定义beanid后,beanid对应的实例化的类一定是实现类而不是接口。两者是同理的。
已经发了
IOC是一种容器,也就是说配置文件中配置bean就相当于spring为你生产这个类的对象,并且管理这个对象,而你自己不用去实例化对象和销毁。接口本身是不能实例化对象的,如果在接口上面注解就违反了这一原则。
注解只是为了让XML配置文件更加简洁,方便
变还是不变得看对应的那个对象的Scope。估计你是对scope有点疑惑,spring中每个scope类都实现了org.springframework.beans.factory.config.Scope接口,然后注册到org.springframework.beans.factory.config.CustomScopeConfigurer中。每次获取bean的时候底层都是访问Scope来获取的,你也可以定义自己的Scope。比如
public class ThreadScope implements org.springframework.beans.factory.config.Scope { private final ThreadLocal<Map<String, Object>> SCOPE_THREAD = new ThreadLocal() { @Override protected Object initialValue() { return new HashMap<String, Object>(); } }; @Override public Object get(String name, ObjectFactory<?> objectFactory) { if (SCOPE_THREAD.get().containsKey(name)) { return SCOPE_THREAD.get().get(name); } SCOPE_THREAD.get().put(name, objectFactory.getObject()); return SCOPE_THREAD.get().get(name); } @Override public Object remove(String name) { return SCOPE_THREAD.get().remove(name); } //空实现代表不让spring容器管理bean @Override public void registerDestructionCallback(String s, Runnable runnable) { } @Override public Object resolveContextualObject(String s) { return null; } @Override public String getConversationId() { return null; } }
然后注册:
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="thread"> <bean class="xx.xx.xx.ThreadScope"></bean> </entry> </map> </property> </bean>
这样就OK了,这个Scope就是每个线程的bean都是同一个
IOC里的实例都是交给容器去实例化的,既然是让容器去实例化,那么肯定要将对象注册到容器里,不然容器都不懂对象在哪里,所以bean要通过xml或者注解来注册到容器中。
代码要实例化对象,那么就要通知IOC容器给我XX对象,不然容器也不懂需要注入哪些实例,所以要用注解来告诉容器对象需要注入的成员有哪些。
至于test就是个测试,看看之前的两布配置有没有错误
总的来说就是:注册对象->注入对象->测试对象。