准备数据:
定义接口:
/**
* 定义一个接口
* @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一起使用。