Spring自动装配——@Autowired、@Resource等

@Autowired、@Resource是Spring常用的用于自动装备的注解,此外还有@Inject和实现Aware接口等。下面来看看这些注解和接口如何使用和他们之间的区别。

@Autowired:

@Autowired是Spring自己实现的,也是最常用的用于自动装配的注解。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	boolean required() default true;  //是否必须装载属性,默认为true
}

从@Autowired源码中可以看出,@Autowired可以用于构造器、方法、参数、属性和用于注解声明,而我们实际应用中,用的最多的是用于属性装配。先来看一下@Autowired用于属性装配时的特点:

@Autowired用于属性,自动注入:

  •          1)默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
  •          2)如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查applicationContext.getBean("bookDao")
  •          3)默认情况下,自动装配一定要将属性赋值,没有就会报错; 可以使用@Autowired(required=false);

@Autowired还有一些辅助注解,来规范属性的注入:

  •          1)@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不再使用属性名
  •          2)@Primary:与@Bean组合使用,让Spring进行自动装配的时候,默认使用首选的bean;
                     也可以继续使用@Qualifier指定需要装配的bean的名字
@Service
public class BookService {
	
	@Qualifier("bookDao")   //必须加载实例名为bookDao的BookDao实例
	@Autowired(required=false) //非必须装配,bookDao可为null
	private BookDao bookDao;
	
	public void print(){
		System.out.println(bookDao);
	}

	@Override
	public String toString() {
		return "BookService [bookDao=" + bookDao + "]";
	}
}


@Configuration
@ComponentScan({"com.zsm"})
public class MainConifgOfAutowired {
	
	@Primary //优先使用实例名为bookDao的BookDao实例
	@Bean("bookDao")
	public BookDao bookDao(){
		BookDao bookDao = new BookDao();
		bookDao.setLable("1");
		return bookDao;
	}
}

 @Autowired用于构造器,参数,方法; 都是从容器中获取参数组件的值。

  •     1)标注在方法位置:Spring容器创建当前对象时,会调用标注了@Autowired注解的方法。如果方法中有参数,参数值从Spring容器中获取。@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
  •     2)标在构造器上:容器启动创建bean时,会优先调用标有@Autowired注解的构造器,如果@Autowired标注在有参构造器上,构造器中的参数必须在容器中可以找到,否则容器启动失败。
  •     3)放在参数位置:从Spring容器中获取参数信息,一般都省略@Autowoired注解
@Component
public class Person {
	
	public Person(){
		System.out.println("person()");
	}
	
	@Autowired
	public Person(Book b){ //Book 必须注册进容器,否则容器启动失败
		System.out.println("person(Book b)");
	}
	
	public Person(String name,String s){
		System.out.println("person(String name,String s)");
	}
	
	@Autowired
	public void autowiredMeth(Person person){
		if(person != null)
			System.out.println("autowiredMeth");
		else
			System.out.println("person is null ");
	} 	
}
@ComponentScan(value = {"cn.zsm.entity"}) 
@Configuration
public class SpringCondiguration {	 
			
}

测试:

	@Test
	public void test2(){
		AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext(SpringCondiguration.class); 
	}

输出结果:

@Resource、@Inject:

@Resurce是基于JSR 250 规范的注解,@Inject是基于JSR 330规范的注解。

@Resource和@Autowired的主要区别是:@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

@Resource有两个重要属性,分别是name和type:

  1. 两个属性都不指定时,@Resource默认按照属性名查找,如果查找不到就按照类型查找,如果找不大或找到多个会报异常。
  2. 只指定name属性,则按照指定的name名查找,如果找不大或找到多个会报异常。
  3. 只指定type属性,则按照属性信息查找,如果找不大或找到多个会报异常。
  4. 同时指定name属性和type属性,则按照属性信息和name名查找,如果找不大或找到多个会报异常。

@Inject注解和@Autowired注解的使用方式相同,只是@Inject没有required属性,也不能和@Qualifier和@Primary注解组合使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: @AutowiredSpring 容器提供的注解,可以用来根据类型自动装配bean,而 @Resource 则是 Java 提供的注解,可以根据 bean 的名称进行装配。@Autowired 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。@Resource 默认按照 bean 的名称进行装配,名称可以通过 name 属性进行指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名作为 bean 的名称。 ### 回答2: 在Spring框架中,@Autowired和@Resource都是用于依赖注入的注解,它们的作用是从容器中获取指定类型的实例并自动注入到相应的属性中。它们之间的区别如下: 1. @Autowired注解属于Spring的注解,而@Resource注解是JavaEE的注解。因此,如果我们使用的是纯粹的Spring框架,可以选择使用@Autowired注解;如果是使用的是JavaEE容器,可以选择使用@Resource注解。 2. 默认情况下,@Autowired注解按照类型进行依赖注入。即,它会根据属性的类型在容器中查找相应的实例进行注入。而@Resource注解默认按照名称进行依赖注入。即,它会根据属性的名称在容器中查找相应的实例进行注入。当然,@Resource注解也可以通过name属性指定注入的名称。 3. 在@Autowired注解中,可以使用required属性来指定是否必须注入成功。如果将required属性设置为true,但容器中找不到相应的实例,会抛出异常;如果设置为false,在找不到实例时,则会将属性设置为null。而@Resource注解则没有类似的属性,它的行为是非强制性的,也就是说,如果找不到相应的实例,则不会抛出异常,属性会保持不变。 4. @Autowired注解可以应用于构造方法、属性和方法上,而@Resource注解则主要应用于属性上。 综上所述,@Autowired和@Resource注解的区别在于注解本身的来源、注入方式、是否强制注入以及适用范围。根据具体的需求和使用场景,可以选择合适的注解来进行依赖注入。 ### 回答3: 在Spring框架中,@Autowired和@Resource注解都用于依赖注入,但有一些细微的区别。 首先,@AutowiredSpring提供的注解,而@Resource是由Java EE(JSR-250)提供的注解。这意味着如果只使用Spring框架,则可以使用@Autowired,而@Resource也可以在任何Java EE环境中使用。 其次,@Autowired默认按照类型进行依赖注入。它会去查找与属性类型匹配的Bean,并将其注入。如果存在多个匹配的Bean,Spring会抛出异常。要解决这个歧义,可以使用@Autowired的required属性进行控制。另外,还可以使用@Qualifier注解来指定具体的Bean名称。 而@Resource默认按照属性名称进行依赖注入。它会先按照属性名称查找对应的Bean,如果找不到再按照类型查找。通过@Resource的name属性,可以指定具体的Bean名称。 此外,@Autowired可以用于构造方法、参数、属性和方法上,而@Resource只能用于属性和方法上。 最后,@AutowiredSpring的特定功能注解,它提供更多的功能和灵活性,可以实现更复杂的依赖注入。而@Resource是Java EE提供的注解,它更简单,功能相对较少。 综上所述,两者的主要区别在于来源、注入方式和功能灵活性。对于只使用Spring框架的项目来说,@Autowired是首选,而@Resource可以在Java EE环境中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值