编辑
阿华代码,不是逆风,就是我疯
你们的点赞收藏是我前进最大的动力!!
希望本文内容能够帮助到你!!
目录
一:什么是IoC
通过前面的学习,我们了解到Spring是一个含有多种工具和方法的IoC容器,那么什么是容器,神什么是IoC容器呢?
1:什么是容器
回想我们学过的集合List<> Map<> 这就是数据存储容器,Tomcat就是Web容器
2:什么是IoC
IoC是 Inversion of Control 的缩写,译为“控制反转”,在以前我们需要某个对象的时候,就new一个对象,但是现在我们可以把对象交给Spring来管理,当我们需要对象的时候,Spring来new,我们只需要注入(DI)即可,所以Spring有时也被成为Spring容器
二:IoC应用举例
在传统的代码中对象创建顺序是:Car->Framework->Bottom->Tire
改进之后解耦的代码的对象创建顺序是:Tire->Bottom->Framework->Car
编辑
1:理解控制反转
改进之后的控制权发⽣反转,不再是使⽤⽅对象创建并控制依赖对象了,⽽是把依赖对象注⼊将当前对象中,依赖对象的控制权不再由当前类控制了.
这样的话,即使依赖类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,
2:理解控制反转容器
这部分代码,就是IoC容器做的⼯作
编辑
3:IoC容器优点
(1)资源集中管理
IoC容器会帮我们管理⼀些资源(对象等),我们需要使⽤时,只需要从IoC容器中去取就可以了
(2)解耦合
我们在创建实例的时候不需要了解其中的细节,降低了使⽤资源双⽅的依赖程度,也就是耦合度.
三:什么是DI
DI:Dependency Injection(依赖注⼊)
程序运⾏时需要某个资源,此时容器就为其提供这个资源
比如我需要Student对象,IoC容器就为我new一个Student对象
IoC是⼀种思想,⽽DI就属于具体的实现
概念清楚了,下面我们来学习一下如何使用IoC和DI吧
四:Bean
1:Bean对象
Spring被称为IoC控制反转容器,(即把对象的控制权交给Spring来管理,这里的控制权包括对象的创建和销毁)它所具备的两个核心功能就是:存和取
我们把存入Spring容器中的对象叫做“Bean”对象。
2 :Bean的存储
通过以前的学习,我们知道比如有一个class Student{}类,我们想要实例化的话需要这么一行代码
Student student = new Student();
但是现在我们只需要引入注解就可以达到这样的目的
这里共有两类注解可以实现
①类注解:@Controller 、 @Service 、 @Repository 、 @Component 、@Configuration
②方法注解:@Bean
3:Bean的名称
我们不需要为bean对象指定名称,Spring会帮我们自动生成
(1)小驼峰命名
Bean命名约定,以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写,⽐如
类名:UserController,Bean的名称为:userController
类名:AccountManager,Bean的名称为:accountManager
(2)原始命名
特殊情况,第⼀个和第⼆个字符都是⼤写时,将保留原始的⼤⼩写,比如
类名:UController,Bean的名称为:UController
类名:AManager,Bean的名称为:AManager
4:Bean的类型
为类名.class 比如
Student.class
5:Bean来源于BeanFactory
ApplicationContext获取bean对象的功能,是父类BeanFactory提供的功能
常⽤的是1,2,4,这三种⽅式,获取到的bean是⼀样的,可以打印地址测试,下面的@Controller注解举例中自行测试哈
public interface BeanFactory { // 1. 根据bean名称获取bean Object getBean(String var1) throws BeansException; // 2. 根据bean名称和类型获取bean <T> T getBean(String var1, Class<T> var2) throws BeansException; // 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的bean Object getBean(String var1, Object... var2) throws BeansException; // 4. 根据类型获取bean <T> T getBean(Class<T> var1) throws BeansException; // 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的bean <T> T getBean(Class<T> var1, Object... var2) throws BeansException; }
6:上下文
ApplicationContext翻译过来就是:Spring上下⽂
因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下⽂
五:类注解
1:@Controller
(1)控制器存储
@Controller // 将对象存储到 Spring 中 public class UserController { public void sayHi(){ System.out.println("hi,UserController..."); } }
(2)根据类型获取对象
如何从Spring容器中获取对象呢?
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { //获取Spring上下⽂对象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); //从Spring上下⽂中获取对象 UserController userController = context.getBean(UserController.class); //使⽤对象 userController.sayHi(); } }
(3)运行结果
编辑
(4)根据bean命名获取Bean对象
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { //获取Spring上下⽂对象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); //根据bean名称, 从Spring上下⽂中获取对象,返回的是Object类型需要强转 UserController userController2 = (UserController)context.getBean("userController"); //使⽤对象 userController.sayHi(); } }
(5)根据bean类型+名称获取Bean对象
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { //获取Spring上下⽂对象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); //根据bean名称+类型, 从Spring上下⽂中获取对象 UserController userController3 = context.getBean("userController",UserController.class); //使⽤对象 userController.sayHi(); } }