Spring 是包含众多工具的 IoC 容器,存的是对象,对象这个词在 Spring 的范围内,称之为 bean
IoC 是控制反转
控制权进行了反转,比如对某一个东西的控制权在 A 手上,结果变成了 B ,Spring 管理的是 bean ,所以这里的控制权指的是 bean 的控制权,也就是对象的控制权进行了反转
之前我们依赖的一些对象,我们需要自己去创建,通过 new 来进行创建,有了 Spring 之后我们就不再进行创建了,而是由 Spring 帮助我们进行创建,这就叫控制反转
控制反转的一个优点主要是解耦
耦合度高就说明两个事务的关联性密切,我们项目开发软件设计的原则是高内聚,低耦合
高内聚 : 是指一个模块内部的关系(比如一个班级)
低耦合 : 是指各个模块之间的关系(比如各个班级)
高内聚低耦合就是,一个班级内需要团结协作,但是各个班级之间的相互影响要小,一个班级的问题对别的班级的影响要降低
Spring MVC 和 Spring Boot 都属于 Spring ,Spring MVC 是基于 Spring 的一个 MVC 框架 ,而 Spring Boot 是基于 Spring 的一套快速开发整合包
IoC 是思想, DI(依赖注入) 是是一种实现方式
IoC 就是依赖的象的创建的控制权交给了 Spring 进行管理(存对象), DI 就是如何将依赖对象取出来,并赋给该对象的属性(取对象)
IoC 提供了两类注解 :
1.类注解 : @Controller(控制器存储) , @Service(服务存储) , @Repository(仓库存储) , @Component(组件存储) , @Configuration(配置存储)
2.方法注解 : @Bean
接下来我们使用一下这些注解
① @Controller
先创建一个 controller 包,在里面创建一个 UserController 类,用 @Controller 告诉 Spring 帮我们管理这个对象
package com.example.ioc.controller;
import org.springframework.stereotype.Controller;
//用 @Controller 告诉 Spring 帮我们管理这个对象
@Controller
public class UserController {
public void doController(){
System.out.println("do Controller...");
}
}
然后在启动类 DemoApplication 中查看 Spring 有没有把上面这个 Controller 存进来呢
package com.example.ioc;
import com.example.ioc.controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
}
}
运行出来了,说明存进去了
bean 一般使用这三个方法
② @Service
package com.example.ioc.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void doService(){
System.out.println("do service....");
}
}
依旧在启动类 DemoApplication 中查看
package com.example.ioc;
import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
}
}
成功拿到
根据名称来获取 UserService 的 bean
(名称为类名转换为小驼峰,特殊情况就是如果类名前两位都是大写,那么bean的名称就是类名)
package com.example.ioc;
import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
//根据名称来获取bean
UserService userService1 = (UserService) context.getBean("userService");
userService1.doService();
}
根据名称+类型来拿 bean
package com.example.ioc;
import com.example.ioc.controller.UserController;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
//根据名称来获取bean
UserService userService1 = (UserService) context.getBean("userService");
userService1.doService();
//根据名称和类型来获取 bean
UserService userService2 = context.getBean("userService",UserService.class);
userService2.doService();
}
③ @Repository
package com.example.ioc.repo;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
public void doRepository(){
System.out.println("do repo...");
}
}
package com.example.ioc;
import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
//根据名称来获取bean
UserService userService1 = (UserService) context.getBean("userService");
userService1.doService();
//根据名称和类型来获取 bean
UserService userService2 = context.getBean("userService",UserService.class);
userService2.doService();
UserRepository userRepository = context.getBean(UserRepository.class);
userRepository.doRepository();
}
④ @Component
package com.example.ioc.component;
import org.springframework.stereotype.Component;
@Component
public class UserComponent {
public void doComponent(){
System.out.println("do component");
}
}
package com.example.ioc;
import com.example.ioc.component.UserComponent;
import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
//根据名称来获取bean
UserService userService1 = (UserService) context.getBean("userService");
userService1.doService();
//根据名称和类型来获取 bean
UserService userService2 = context.getBean("userService",UserService.class);
userService2.doService();
UserRepository userRepository = context.getBean(UserRepository.class);
userRepository.doRepository();
UserComponent userComponent = context.getBean(UserComponent.class);
userComponent.doComponent();
}
}
⑤ @Configuration
package com.example.ioc.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserConfig {
public void doConfig(){
System.out.println("do configurarion...");
}
}
package com.example.ioc;
import com.example.ioc.component.UserComponent;
import com.example.ioc.config.UserConfig;
import com.example.ioc.controller.UserController;
import com.example.ioc.repo.UserRepository;
import com.example.ioc.service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring 上下文
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
//返回的就是 Spring 的运行环境
UserController bean = context.getBean(UserController.class);
bean.doController();
UserService userService = context.getBean(UserService.class);
userService.doService();
//根据名称来获取bean
UserService userService1 = (UserService) context.getBean("userService");
userService1.doService();
//根据名称和类型来获取 bean
UserService userService2 = context.getBean("userService",UserService.class);
userService2.doService();
UserRepository userRepository = context.getBean(UserRepository.class);
userRepository.doRepository();
UserComponent userComponent = context.getBean(UserComponent.class);
userComponent.doComponent();
UserConfig userConfig = context.getBean(UserConfig.class);
userConfig.doConfig();
}
}