Spring中被放弃的@Autowired,你会用吗?
创始人
2025-07-13 21:11:00
0

注入方式一:属性(字段)注入

在某个属性(字段)上使用@Autowired注解时,Spring在创建该Bean的过程中,会根据字段的类型或名称从Spring容器中查找到所匹配的Bean对象,并赋值给该熟悉。

@Service
public class UserService {

    // 注入方式一:属性注入
    @Autowired
    private RoleService roleService;

    public void printRoleService() {
        System.out.println(roleService);
    }

}

注入方式二:Setter注入

在某个Setter方法上使用@Autowired注解时,Spring在创建该Bean的过程中,会来调用该Setter方法,并且如果Set方法有入参参数,那么Spring会格局入参参数信息,从Spring容器中找到所匹配的Bean对象赋值给该入参。我们通过再Setter方法中给属性赋值,从而就达到了Setter方法注入的目的。

@Service
public class UserService {

    private RoleService roleService;

    public void printRoleService() {
        System.out.println(roleService);
    }

    public RoleService getRoleService() {
        return roleService;
    }

    // 注入方式二:Setter注入
    @Autowired
    public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }
}

注意:@Autowired注解其实可以添加在任何一个普通方法上,不一定是Setter方法。

注入方式三:构造函数注入

当某个构造方法上使用@Autowired注解时,表示该Bean在创建时会使用这个构造方法来实例化得到一个对象,并且Spring会根据该构造函数的入参参数的类型和名字,从Spring容器中找到所匹配的Bean对象传给该入参,通过在构造函数中给属性赋值,从而就达到了构造函数注入的目的。

@Service
public class UserService {

    private RoleService roleService;

    // 注入方式三:构造函数注入
    @Autowired
    public UserService(RoleService roleService) {
        this.roleService = roleService;
    }

    public void printRoleService() {
        System.out.println(roleService);
    }
}

注入方式四:参数注入

尽管@Autowired注解可以加在普通方法或构造方法的参数之前,但是Spring框架中大部分地方都忽略了这种情况下的@Autowired注解,仅仅在spring-test模块中的对于JUnit Jupiter的支持中,支持了参数前添加@Autowired。

@SpringBootTest(classes = ConstructorAttributeMain.class)
class UserServiceTest {

    @Test
    void printRoleService(@Autowired UserService userService) {
        userService.printRoleService();
    }
}

required属性释义

  • required=true:默认值,必须存在Bean,否则报错
  • required=false:若找不到Bean,则为空
@Service
public class UserService {

    @Autowired(required = true)
    private RoleService roleService;

    @Autowired(required = false)
    private MenuService menuService;

    public void print() {
        System.out.println("role: " + roleService); // print class
        System.out.println("menu: " + menuService); // pint null
    }
}

静态属性(字段)注入

静态属性(字段)或方法是不会进行依赖注入的。

@Service
public class UserService {

    @Autowired
    private static RoleService roleService;


    public void printRole() {
        System.out.println(roleService);
    }
}

但是实际开发中,我们可能会遇到此问题。因此,有两种方式解决此问题:

构造方法注入

@Service
public class UserService {

    private static RoleService roleService;

  // 解决静态导入第一种方式:构造函数注入
    @Autowired
    public UserService(RoleService roleService) {
        UserService.roleService = roleService;
    }

    public void printRole() {
        System.out.println(roleService);
    }
}

Setter方法注入

@Service
public class UserService {

    private static RoleService roleService;

    // 解决静态导入第二种方式:Setter方法注入
    @Autowired
    public void setRoleService(RoleService roleService) {
        UserService.roleService = roleService;
    }

    public void printRole() {
        System.out.println(roleService);
    }
}

小结

综上所述,@Autowired有三种注入方式,分别为:字段(属性)注入,构造函数注入和Setter方法注入。

另外,@Autowired参数注入,仅在单元测试才有意义;静态字段(属性)注入为空问题,需要结合构造函数或Setter方法注入。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...