概述
介绍
1.Spring IOC是Spring核心思想之一
2.Spring是包含众多工具方法的IOC容器
容器:Spring里面装的是对象
IOC:控制反转,对象的控制在意料之外,相当于外包一同创建
Spring 、Spring MVC、Spring boot的关系
Spring 是那个功能齐备的大厨房,提供了所有底层能力。
Spring MVC 是厨房里那套"从接单到上菜"的规矩和动线,专门处理 Web 请求。
Spring Boot 是把厨房、服务员、出餐流程全打包好的快餐车或加盟店,让你省去搭建过程,开箱即用。
就像你现在想开餐馆(开发 Web 应用),Spring Boot 直接给你一辆餐车,厨房(Spring)和点餐屏幕(Spring MVC)都装好了,你只需点火炒菜就行。
三者之间不是互斥的
Spring IOC 和 DI
既然是一个容器,那么就需要具备:(1)存 (2)取,这两个功能.我们就通过注解来解决问题
IOC的注解
概述:将对象交给Spring进行统一管理进行存储,Spring的作用域:默认为单例模式
类注解:@Component,@Controller,@Configuration,@Service,@Repository
方法注解:@Bean
IOC详解
类注解
Q:我们如何知道交给Spring管理是生效的?
java
@RestController
public class UserController {
public String sayHello(){
return "hello";
}
}
java
ApplicationContext context = SpringApplication.run(SpringIcoDemoApplication.class, args);
UserController bean = context.getBean(UserController.class);
System.out.println(bean);
System.out.println(Introspector.decapitalize("UserController"));
UserController bean1 =(UserController) context.getBean("userController");
System.out.println(bean1);
UserController bean2 = context.getBean("userController",UserController.class);
System.out.println(bean2);
方法注解
Why什么使用方法注解:(1)当需要使用第三方提供的类时,想要Spring也对其进行管理,(2)Spring默认为单例模式,只能创建一个对象,但当同一个类,需要多个对象,就需要使用方法注解此时类注解
而且方法注解是开发人员自己创建对象,之后交给Spring进行管理
html
@Configuration
public class BeanConfig {
@Bean
public UserInfo userInfo (){
return new UserInfo("zhangsan",19);
}
@Bean
public UserInfo userInfo2 (){
return new UserInfo("lisi",25);
}
}
bean name的命名规则
五大注解:
(1)如果类名前两个字母为大写,则bean name为类名本身
(2)其他情况:为类名的小驼峰
bean注解:
bean name为方法名
同时也可以给他们起别名
如果已经起了别名,还进行名字查询的话就会报错(DI)
DI的注解
DI详解
java
@RestController
public class UserController {
//属性注入
@Autowired
private UserService userService;
public String sayHello(){
userService.doService();
System.out.println("do...controller");
return "hello";
}
}
IOC:new User Controller,但UserController依赖于UserService,DI:再创建UserController对象时,就把UserService进行赋值.也可以理解为创建UserController对象时,对其进行初始化
DI三种方式
属性注入
java
@RestController
public class UserController {
//属性注入
@Autowired
private UserService userService;
public String sayHello(){
userService.doService();
System.out.println("do...controller");
return "hello";
}
}
构造方法注入
java
@Autowired
public UserController(UserService userService, UserRepository repository) {
System.out.println("执行Use Controller...构造方法");
System.out.println("执行Use Repository...构造方法");
this.userService = userService;
this.repository = repository;
}
当存在一个构造方法时,就默认执行这个构造方法
当存在多个但又有无参的构造方法时,就默认执行无参的构造方法
当存在多个且有多个有参没有无参,则报错
所以有多个构造方法时,有必要,指定默认执行哪一个构造方法
Set方法注入
set方法不想构造方法,必须调用才能够执行
java
//Set方法注入
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired缺点
由于注入的时候是根据类型进行注入的,如果同一个类有多个对象,那么到底注入的是哪一个呢?
此时就需要有注解指定到底使用哪一个对象
@Primary(在类本身之上就是指定)
java
@Configuration
public class BeanConfig {
@Bean({"u1","ui1"})
public UserInfo userInfo (){
return new UserInfo("zhangsan",19);
}
@Bean
//@Primary
public UserInfo userInfo2 (){
return new UserInfo("lisi",25);
}
}
@Qualifier(依赖注入的时候指定,但需要输入名字)
java
@Service
public class UserService {
//@Autowired
//@Qualifier("u1")
@Resource(name = "userInfo2")
private UserInfo userInfo;
public void doService(){
System.out.println(userInfo);
System.out.println("do...service");
}
}
@Resource(依赖注入的时候指定,但需要输入名字)
java
@Service
public class UserService {
@Resource(name = "userInfo2")
private UserInfo userInfo;
public void doService(){
System.out.println(userInfo);
System.out.println("do...service");
}
}
@Resource = @Autowired + @Qualifier