用于注入数据:
作用和XML配置文件中bean标签property标签作用一样
@Autowired
作用自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就注入成功
出现位置:可以是变量上,(set)方法上,属性上等等
- 如果spring容器中没有任何bean类型和注入的变量类型匹配时则报错
- 如果IOC容器中有多个类型匹配时(包括接口类型):
- 如果注入时接口类型的变量名和给定名称的bean对象不一致时则会报错
- 如果注入接口类型的变量名是给定名称的bean对象中的其中一个名称相对应,则spring容器会和当前bean对象匹配注入
测试:
dao接口类:
public interface AccountDao {
void saveAccount();
}
dao实现类:
//使用注解将对象交给spring来管理
@Repository()
public class AccountDaoImpl implements AccountDao{
public void saveAccount() {
System.out.println("AccountDaoImpl保存了数据");
}
}
service业务接口类:
public interface AccountService {
void saveAccount();
}
service接口实现类:
//将该对象交给spring来管理
@Service
public class AccountServiceImpl implements AccountService{
//使用注解自动注入
@Autowired()
private AccountDao accountDaoImpl;
public void saveAccount() {
accountDaoImpl.saveAccount();
}
}
测试类:
public static void main(String[] args) {
//通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
//获取Spring容器中的bean对象,通过id和类字节码来获取
AccountServiceImpl accountServiceImpl = applicationContext.getBean("accountServiceImpl", AccountServiceImpl.class);
//执行方法
accountServiceImpl.saveAccount();
}
结果:
注意:
例如:
添加一个dao实现类
@Repository()
public class AccountDaoImpl1 implements AccountDao{
public void saveAccount() {
System.out.println("AccountDaoImpl1保存了数据");
}
}
如果存在多个类型时,则要关注的是变量名注入
当注入的数据类型存在多个时,当修改变量名时
结果1:
结果2:
使用@Autowired注解时,set方法不必要了
@Qualifier
按照类中注入的基础上按照名称注入,但是不能在类成员中单独使用(可以和@Autowired结合).但是在给方法参数注入时可以使用
可以使用@Qualifier在参数前面传入一个值,代表使用的是哪个bean中name的唯一标识
属性:value:用于指定注入bean的id
例如存在多个类型相同的bean对象注入时
结果1:
结果2:
@Resource
作用:直接按照bean的id注入,可以独立使用
属性为name,赋值bean的id
测试:
结果1:
结果2:
注意:@Resource默认通过name或者bean的id方式实现,如果找不到对应的name或者bean的id,则通过类型实现注入,如果两个情况都找不到则报错
以上三个注入方式都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现
集合类型的注入只能通过XML配置来实现
@Value
作用:用于注入基本类型和String类型的数据
属性:value 指定数据的值(可以使用el表达式 ${})
测试:
@Component
public class User {
//通过Value注解注入值
@Value("chenhui")
public String name;
public User(){
System.out.println("对象被创建出来了");
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
测试类:
public static void main(String[] args) {
//通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
//获取Spring容器中的bean对象,通过id和类字节码来获取
User user = applicationContext.getBean("user", User.class);
//执行方法
System.out.println(user);
}
结果: