Spring学习(9)--- @Autowired注解(二)

  • 可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,MessageSource
package com.mypackage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

public class MovieRecommender {

	@Autowired
	private ApplicationContext context;

	public MovieRecommender(){
	}

	//...
}
  • 可以通过添加注解给需要该类型的数组的字段和方法,以提供ApplicationContext中的所有特定类型的bean
private Set<MovieCatalog> movieCatalogs;

@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
	this.movieCatalogs = movieCatalogs;
}
  • 可以用于装配key为String的Map
private Map<String , MovieCatalog>  movieCatalog;

@Autowired
public void setMovieCatalog(Map<String, MovieCatalog> movieCatalog) {
	this.movieCatalog = movieCatalog;
}
  • 如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用的@Order注解
  • @Autowired是由Spring BeanPostProcessor处理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过XML或者Spring的@Bean注解加载

数组及Map的自动注入——例子:

先定义一个BeanInterface接口

package com.multibean;

public interface BeanInterface {

}

在定义两个实现类

package com.multibean;

import org.springframework.stereotype.Component;

@Component
public class BeanInterfaceImpl implements BeanInterface {

}
package com.multibean;

import org.springframework.stereotype.Component;

@Component
public class BeanInterface2Impl implements BeanInterface{

}

定义BeanInvoker实现数组和Map

package com.multibean;

import java.util.*;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class BeanInvoker {

	@Autowired
	private List<BeanInterface> list;

	@Autowired
	private Map<String,BeanInterface> map; 

	public void say(){
		if(null != list){
			System.out.println("list...");
			for(BeanInterface bean:list){
				System.out.println(bean.getClass().getName());
			}
		}else{
			System.out.println("List<BeanInterface> list is null.");
		}

		if(null != map && 0 != map.size()){
			System.out.println("map...");
			for(Map.Entry<String,BeanInterface> entry:map.entrySet()){
				System.out.println(entry.getKey()+"-----"+entry.getValue().getClass().getName());
			}
		}else{
			System.out.println("Map<String,BeanInterface> map is null.");
		}
	}

}

XML配置:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.1.xsd">

        <context:component-scan base-package="com.multibean">
        </context:component-scan>
</beans>

单元测试:

package com.multibean;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UnitTest {

	@Test
	public void test(){
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-beansnnotation.xml");
		BeanInvoker beanInvoker = (BeanInvoker)context.getBean("beanInvoker");
		beanInvoker.say();
	}
}

结果:

七月 06, 2015 10:46:41 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org[email protected]32482417: startup date [Mon Jul 06 22:46:41 CST 2015]; root of context hierarchy
七月 06, 2015 10:46:41 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring-beansnnotation.xml]
list...
com.multibean.BeanInterface2Impl
com.multibean.BeanInterfaceImpl
map...
beanInterface2Impl-----com.multibean.BeanInterface2Impl
beanInterfaceImpl-----com.multibean.BeanInterfaceImpl

@Order注解----例子:

改造一下两个实现类,加上@Order注解

package com.multibean;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(value = 1)
@Component
public class BeanInterfaceImpl implements BeanInterface {

}
package com.multibean;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(value = 2)
@Component
public class BeanInterface2Impl implements BeanInterface{

}

测试同上

结果:

七月 06, 2015 10:58:58 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org[email protected]1e397bcb: startup date [Mon Jul 06 22:58:58 CST 2015]; root of context hierarchy
七月 06, 2015 10:58:58 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring-beansnnotation.xml]
list...
com.multibean.BeanInterfaceImpl
com.multibean.BeanInterface2Impl
map...
beanInterface2Impl-----com.multibean.BeanInterface2Impl
beanInterfaceImpl-----com.multibean.BeanInterfaceImpl

PS:@Order只针对数组,对于map无效

  

时间: 2024-10-12 20:28:16

Spring学习(9)--- @Autowired注解(二)的相关文章

spring学习2:基于注解+xml实现ioc和依赖注入

spring学习2:基于注解+xml实现ioc和依赖注入 一.在spring配置文件中开启spring对注解的支持 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

spring学习笔记之——注解

spring注解可以很大的减少xml的配置,spring.xml文件的声明为: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context

Spring学习笔记--使用注解装配

使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的context命名空间配置中的<context:annotation-config>元素,如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.

Spring学习之事务注解@Transactional

今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念: 事务:并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务数据库能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. 事务隔离级别:在并发处理数据中,为了保持数据的完整性和正确性,而执行的操作数据方式. 脏读 :一个事务读取到另一事务未提交的更新数据. 幻读:一个事务读到另一个事务已提交的insert数据. 不可重复读: 是指在一个事务内多

Spring学习记录-注解

注解 一.org.springframework.web.bind.annotation ControllerAdviceCookieValue : 可以把Request header中关于cookie的值绑定到方法的参数上.CrossOriginExceptionHandlerInitBinderMappingMatrixVariableModelAttribute : 代表的是,该Controller的所有方法在调用前,先执行此ModelAttribute方法,可用于注解和方法参数中,可以把

Spring学习笔记事务(二)

鲁春利的工作笔记,好记性不如烂笔头 用 @Transactional 注解声明式地管理事务 Spring 还允许简单地用 @Transactional 注解来标注事务方法(只能标注公有方法).在 Bean 配置文件中增加 <tx:annotation-driven> 元素声明, 并为之指定事务管理器.如果事务处理器的名称是 transactionManager, 在<tx:annotation-driven> 元素中可以省略 transaction-manager 属性,元素会自动

Spring中的Autowired注解和Resource注解的区别

1.所属jar包不同,Autowired是Spring中的Resource是JSR-250规范定义的注解 2.自动装配时可以选择的参数不一样,具体的可以看其接口 Resource里面有这几个可以配置的,我只能看懂name 和 type,意思分别是按名称装配,按类型装配. 默认安装名称进行装配.当找不到与名称匹配的bean时才按照类型进行装配. 如果name属性一旦指定,就只会按照名称进行装配. 如果指定了type,则按照类型进行装配,找不到或者找到多个bean,都会抛出异常 autowired:

spring学习3_通过注解简单实现AOP

在上一篇中通过XML配置演示了Spring实际进行AOP的过程,这里简单介绍一下通过注解实现这一功能的过程. 1.Spring配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo