上接:
概述
本文介绍,使用 @Autowired 注解实现依赖注入
如:由spring容器实例化 dao 和 service,并将 dao 注入到 service中
@Autowired
使用
- 放在成员变量上 (不需要
setXXX()方法) - 放在方法上
作用
默认根据 类型 注入:
当spring容器中,如果只有一个 bean对象类型,与要注入的 变量类型 匹配,就自动注入
如果 没有匹配 的 会报错
如果 有多个匹配 的 会报错
例子:有一个匹配
在 spring @Controller、@Service、@Repository、@Component总结 基础上修改
dao 实现类
@Repository
public class UserDao implements IUserDao {
public UserDao(){
System.out.println("UserDao默认构造方法!");
}
public void save(String username,String password){
System.out.println("UserDao 保存 "+username+","+password+" 成功!");
}
}
修改 UserSrvImpl
由于 UserSrvImpl 需要调用 UserDao ,那么在 UserSrvImpl 类中声明成员变量 IUserDao dao,并在上面使用 @Autowired 注解
@Service
public class UserSrvImpl implements IUserService {
@Autowired
private IUserDao dao;
public UserSrvImpl(){
System.out.println("UserSrvImpl构造方法");
}
public void save(String username,String password){
dao.save(username,password);
}
}
当spring容器中,如果只有一个 bean对象类型,与要注入的 变量类型 匹配,就自动注入
执行
public class Main {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
IUserService srv=(IUserService)ac.getBean("userSrvImpl");
srv.save("lilei","123456");
}
}
执行结果:
UserDao默认构造方法!
UserSrvImpl构造方法
UserDao 保存 lilei,123456 成功!
spring IoC-注解依赖注入(@Autowired)图解(只有一个类型匹配)
例子:有多个匹配
如果有多个 bean对象类型,与要注入的 变量类型 匹配,会报错
增加 UserDao2
@Repository
public class UserDao2 implements IUserDao {
public UserDao2(){
System.out.println("UserDao2默认构造方法!");
}
public void save(String username,String password){
System.out.println("UserDao2 保存 "+username+","+password+" 成功!");
}
}
执行
报错如下:
expected single matching bean but found 2: userDao,userDao2
提示中 userDao、userDao2 是哪来的?
因为定义 UserDao 如下:
//没有指定value属性,那么spring容器中默认id是 userDao(与类同名,首字母小写)
@Repository
public class UserDao implements IUserDao
所以 spring容器中,UserDao类对象的 id 是 userDao
定义 UserDao2 如下:
//没有指定value属性,那么spring容器中默认id是 userDao2(与类同名,首字母小写)
@Repository
public class UserDao2 implements IUserDao
所以 spring容器中,UserDao2 类对象的 id 是 userDao2
解决见 spring IoC-注解根据id依赖注入(@Qualifier)