spring IoC-注解依赖注入(@Autowired)

上接:

  1. spring IoC 依赖注入
  2. spring @Controller、@Service、@Repository、@Component总结

概述

本文介绍,使用 @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)


原文出处:/show_1IX243u3GHh.html