您现在的位置是:首页 >技术交流 >Spring IOC容器组件依赖注入网站首页技术交流
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项目中,这两个注解一般可以互相替换。






QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结