您现在的位置是:首页 >技术交流 >Spring IOC容器组件依赖注入网站首页技术交流

Spring IOC容器组件依赖注入

zNiniGo 2026-02-26 00:01:04
简介Spring IOC容器组件依赖注入

1.@Autowired

@Autowired注解是Spring框架中的一种依赖注入方式。通过@Autowired注解,可以自动装配一个bean到需要它的属性上,而不需要手动编写代码进行显式的依赖注入。是Spring框架中实现依赖注入的核心之一,可以帮助简化代码的编写,提高开发效率。 

1.1自动装配流程

先按照类型,再按照名称

a.容器中没有该类型的组件,报错:NoSuchBeanDefinitionException;

b.容器中有且仅有一个该类型的组件,直接注入;

c.若容器中有多个该类型的组件,再按照名称去找(变量名称),有则注入,无则报错。

//容器中注册UserService 组件
@Service
public class UserServiceImpl implements UserService {
    //...
}

//controller中自动注入UserService组件
@Controller
@ToString
public class UserController {
    @Autowired
    private UserService userService;
    //....
}

//测试代码
public static void main(String[] args) {
        //获取IOC容器
        ConfigurableApplicationContext ioc = SpringApplication.run(SpringIocApplication.class, args);
        UserController userController = ioc.getBean(UserController.class);
        System.out.println("===="+userController);
 }

输出结果:

1.2@Autowired的required属性

当容器中没有注册 UserService 组件时,在 UserController 中自动注入UserService会报错(NoSuchBeanDefinitionException),如果不想报错在使用@Autowired时可添加属性required = false

//controller中自动注入UserService组件
@Controller
@ToString
public class UserController {
    @Autowired(required = false)
    private UserService userService;
    //....
}

此时输出结果为

当容器中有多个需要注入的组件时会报错NoUniqueBeanDefinitionException,@Autowired注解可以与其他注解一起使用,如@Qualifier@Primary来确定自动装配的具体实现。

1.3@Autowired与@Qualifier搭配

//当容器中有两个UserService类型的组件 UserServiceImpl 和 UserServiceImpl1 时
@Service
public class UserServiceImpl implements UserService {
    //...
}

@Service
public class UserServiceImpl1 implements UserService {
    //...
}


//controller中使用@Qualifier指定注入UserService组件的名字
@Controller
@ToString
public class UserController {
    @Autowired
    @Qualifier("userServiceImpl")
    private UserService userService;
    //....
}

1.4@Autowired与@Primary搭配

容器中注册了多个同一类型的组件时,可以在注册时使用@Primary注解指定主组件(默认组件)

//指定UserServiceImpl1为默认组件
@Primary
@Service
public class UserServiceImpl1 implements UserService {
    //...
}

@Controller
@ToString
public class UserController {
    @Autowired
    private UserService userService;
    //....
}

1.5@Autowired构造器注入

@Controller
@ToString
public class UserController {
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        System.out.println("UserController的有参构造方法执行了...");
        this.userService = userService;
    }
}

1.6@Autowired Setter方法注入

@Controller
@ToString
public class UserController {
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        System.out.println("UserController的set方法执行了...");
        this.userService = userService;
    }
}

2.@Resource

2.1@Resource注解的用法

@Resource注解是Java EE中的一种依赖注入方式,与@Autowired注解功能相似。name属性可以指定注入的组件名称,若没有指定name属性,则按照类型注入。

@Controller
@ToString
public class UserController {
    @Resource(name = "userServiceImpl1")
    private UserService userService;
}

2.2@Resource和@Autowired的区别

@Resource和@Autowired注解都可以实现依赖注入,但它们之间有一些区别:

1. 来源
   - @Autowired:是Spring框架提供的注解,它依赖于Spring框架。
   - @Resource:是Java自带的注解,在javax.annotation包中,不仅限于Spring框架。

2.注入策略和顺序

   - @Autowired‌:默认按类型(byType)进行依赖注入。如果容器中有多个相同类型的bean,它会先按类型查找,如果找到多个,再根据名称(byName)进行匹配。如果没有指定具体的bean名称,可以使用@Qualifier注解来指定。
‌    - @Resource‌:默认按名称(byName)进行依赖注入。如果找不到与名称匹配的bean,它会回退到按类型(byType)进行查找。如果没有指定类型,可以通过设置@Resource注解的type属性来实现。

3. 常见用法和属性
   - ‌@Autowired‌:可以用于构造函数、setter方法、字段等。它有一个required属性,默认为true,表示依赖是必需的,可以设置为false来允许null值。‌可以结合@Qualifier、@Resource注解来指定具体的bean。
‌   - @Resource‌:通常用于setter方法和字段。它有一个name属性用于指定依赖的名称,还可以有type属性用于指定依赖的类型。

总的来说,@Autowired是Spring更强大和灵活的注解,可以灵活地根据类型进行自动装配,支持@Qualifier注解等方式进一步精确匹配,通常在Spring应用中使用较多。而@Resource是Java EE标准提供的注解,通配性更高,一般在Java EE应用中使用较多。在Spring项目中,这两个注解一般可以互相替换。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。