@Autowired与@Resource (@Inject)的区别

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

准备数据:

定义接口:

/**
 * 定义一个接口
 * @author lizehao
 * @company 连连支付
 * @date 2019年2月18日下午2:54:03
 */
public interface UserService {

}

实现类

/**
 * 第一个实现类 
 * bean的名称默认是全类名首字母小写 userServiceImpl
 * @author lizehao
 * @company 连连支付
 * @date 2019年2月18日下午2:54:49
 */
@Service
public class UserServiceImpl implements UserService {

}

/**
 * 第二个实现类 
 * bean的名称默认是全类名首字母小写 userServiceImpl2
 * @author lizehao
 * @company 连连支付
 * @date 2019年2月18日下午3:00:29
 */
@Service
public class UserServiceImpl2 implements UserService {

}

Controller:

/**
 * @author lizehao
 * @company 连连支付
 * @date 2019年2月18日下午3:22:10
 */
@Controller
public class UserController {

	/** 
	 * 按类型注入 
	 * 如果一个接口有两个实现类的时候,按类型装配就会报错,需要指定名称
	 * */
	@Autowired
	@Qualifier("userServiceImpl2")
	/** 
	 * 	按名称注入 (按名称找不到匹配的bean,才按照类型装配)
	 * 	如果一个接口有两个实现类的时候,@Resource默认按名称注入,找不到按类型装配,按类型的时候,就会报错,需要指定名称
	 *  如果name属性一旦指定,就只会按照名称进行装配。
	 * */
	@Resource(name = "userServiceImpl")
	private UserService userService;

	@PostConstruct
	public void init() {
		System.out.println("----------" + userService);
	}
}
  • @Autowired与@Resource都可以用来装配bean.
  • @Autowired属于Spring的;@Resource为JSR-250标准的注释,属于J2EE的。 @Inject是JSR330规范实现的,需要导入额外的包

@Autowired

  • 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired
@Qualifier("userServiceImpl")
  • 如果一个接口有两个实现类的时候,按类型装配就会报错,需要指定名称,如上:

@Resource

  • 按名称注入 (按名称找不到匹配的bean,才按照类型装配)
@Resource
private UserService userService;
实质是按类型注入的

@Resource
private UserService userServiceImpl;
按名称注入
  • 如果一个接口有两个实现类的时候,@Resource默认按名称注入,找不到按类型装配,按类型的时候,就会报错,需要指定名称
@Resource(name = "userServiceImpl")
  • 如果name属性一旦指定,就只会按照名称进行装配。

@Autowired和@Inject区别

  • @Autowired和@Inject都是按照类型装配,不同的是@Autowired默认require=true,而@Inject没有这个属性。
  • @Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用。

猜你喜欢

转载自blog.csdn.net/QQ994406030/article/details/87623140