Spring注解驱动开发——自动装配(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rubulai/article/details/80473260

自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖赋值

1、@Autowired:

    默认先按照类型去容器中找相应的组件(applicationContext.getBean(Xxx.class)),若只找到一个则进行装配,若找到多个则再按照属性的名称作为id找对应的组件(applicationContext.getBean("beanId"));另外可使用@Qualifier指定属性Bean的id进行装配,如果没有找到指定的属性bean,则会报NoSuchBeanDefinitionException的异常,如果想在找不到属性bean的时候不让程序出错,则可以设置@Autowired的required属性为false:@Autowired(required=false),此时则在容器中有该属性bean时装配,无则不装配

@Service
public class BookService {
	
	@Autowired
	@Qualifier("bookDao")
	private BookDao bookDao;

}

看下面代码:

@Configuration
@ComponentScan({"com.bdm.service","com.bdm.dao"})
public class MyAutowireConfig {
	@Bean
	public BookDao bookDao2(){
		return new BookDao();
	}

}

 此时该配置类容器中会有两个BookDao实例,一个是通过自动扫描创建的,一个是通过@Bean注解创建的,通过自动扫描创建的bean的id默认为类名的首字母小写,通过@Bean注解创建的id则为方法名

使用Spring提供的@Primary注解指定首选装配的Bean:在容器中有多个该类型的bean时,优先装配该bean

@Configuration
@ComponentScan({"com.bdm.service","com.bdm.dao"})
public class MyAutowireConfig {
	
	@Bean
	@Primary
	public BookDao bookDao2(){
		return new BookDao();
	}
}

此时在容器中有多个BookDao类型的bean时会优先装配这个由@Primary注解的bean,除非使用@Qualifier明确制定了要装配的bean的id

2、@Resource(JSR250规范)和@Inject(JSR330规范):这两个是Java规范的注解,而@Autowired是Spring自己的注解

    @Resource默认是按照组件的名称(属性名作为id)装配,而不像@Autowired是默认先按照类型装配,使用@Resource时@Primary注解会失效,也可以使用@Resource注解的name属性指定组件,类似于@Autowired结合@Qualifier,但是@Resource不支持required=false,也就是说使用@Resource时必须装配成功,否则会报错:NoSuchBeanDefinitionException

@Service
public class BookService {
	
	//@Autowired(required=false)
	//@Qualifier("bookDao3")
	@Resource(name="bookDao2")
	private BookDao bookDao;

}

使用@Inject时需要导入依赖:javax.inject

<dependency>
	<groupId>javax.inject</groupId>
	<artifactId>javax.inject</artifactId>
	<version>1</version>
</dependency>

@Inject的功能和@Autowired的功能一样,也支持@Primary注解,只是少了required=false的属性

@Service
public class BookService {
	
	//@Autowired(required=false)
	//@Qualifier("bookDao3")
	//@Resource(name="bookDao2")
	@Inject
	private BookDao bookDao;

}

这三个注解的区别在于:@Autowired是Spring的注解,脱离不了Spring的支持,@Resource和@Inject是java的规范,其他的框架也会支持,但是@Autowired的功能稍微强大一些

这些注解之所以能完成自动装配的功能,是因为Spring提供的后置处理器AutowiredAnnotationBeanPostProcessor,该后置处理器通过解析@Autowired、@Resource、@Inject等注解完成自动装配

猜你喜欢

转载自blog.csdn.net/rubulai/article/details/80473260