首先说明ByType和ByName的区别:
ByType也就是当spring容器中只有一个Bean时,才会使用ByType,否则会报错
byName:根据属性名称来匹配Bean的名称进行自动装配。
@Autowired:来源于spring框架自身默认是byType自动装配,当配合了@Qualifier注解之后,
由@Qualifier实现byName装配。它有一个required属性,用于指定是否必须注入成功,默认为true。
java
package com.spring.service.impl;
import com.spring.dao.AccountDao;
import com.spring.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
@Qualifier("accountDaoImplTwo")
private AccountDao accountDao;
@Override
public void saveAccount() {
accountDao.saveAccount();
}
}
java
package com.spring.dao.impl;
import com.spring.dao.AccountDao;
import org.springframework.stereotype.Repository;
@Repository
public class AccountDaoImplOne implements AccountDao {
@Override
public void saveAccount() {
System.out.println("one保存了账户信息");
}
}
java
package com.spring.dao.impl;
import com.spring.dao.AccountDao;
import org.springframework.stereotype.Repository;
@Repository
public class AccountDaoImplTwo implements AccountDao {
@Override
public void saveAccount() {
System.out.println("two保存了账户信息");
}
}
测试类
java
import com.spring.service.AccountService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext("com.spring");
AccountService accountService = ac.getBean("accountService",AccountService.class);
accountService.saveAccount();
}
}
调试结果
@Resource:在没有指定name属性时是byType自动装配,当指定了name属性之后,采用byName方式自动装配。
@Inject:可以配合@Qualifier或者@Primary注解使用。默认是采用byType装配,当指定@Named注解之后,变成byName装配。属性:无使用场景
在使用@Autowired注解的地方,都可以替换成@Inject。它也可以出现在方法上,构造函数上和字段上
@Autowired注解时spring的ioc容器中的特有注解,只能在spring框架中使用,但是@Inject注解没有特殊限制