1.Spring自动装配byName和byType区别。
byName | byName会搜索整个配置文件中的bean,如果有相同名称的bean则自动配置,否则显示异常 |
byType | byType会搜索整个配置文件中的bean,如果有相同类型的bean则自动装配,否则显示异常。 |
2. @Autowired
@Autowired按byType自动注入,是有Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。
2.1 @Autowired装配属性
在Web MVC中控制层(Controller)访问的是业务层(Service),而业务层(Service)访问的是数据层(Dao),使用@Autowired注解实现注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。byType注入:
public class TestServiceImpl {
@Autowired
private UserDao userDao; // 用于字段上
}
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
3. @Resource
@Resource默认按byName自动注入,是由J2EE提供的注解,需要导入包javax.annotation.Resource。
3.1 @Resource装配属性
@Resource有两个重要的属性name和type:
1.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
2.如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
3.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
4.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
@Resource与@Autowired区别
1、@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
2、@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。
名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
3、@Resources按名字,是JDK的,@Autowired按类型,是Spring的
4.@Autowired:先byType再byName ,@Resource:先byName再byType(当指定@Resource name属性时,只会byName)
4. @Reference
@Service dubbo提供者服务用于声明对外暴露服务,与@Reference配合使用。
@Reference 用于dubbo消费者服务指明引用哪个提供者接口服务。在微服务中,工程项目会分成很多模块(Maven工程),每个模块相当于一个服务,一个服务调用另一个服务的功能需要使用@Reference注解。它可以定义在类中的一个字段上,也可以定义在一个方法上,甚至可以用来修饰另一个 annotation,表示一个服务的引用。通常 @Reference 定义在一个字段上。