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();//根据名称来获取beanUserService 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();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService 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();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService 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();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService 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();//根据名称来获取beanUserService userService1 = (UserService) context.getBean("userService");userService1.doService();//根据名称和类型来获取 beanUserService 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();}}