1)依次构建这个相关的类:我们的这个汽车类,车身类,底盘类,以及我们的这个轮胎类;
2)我们的这个car类里面就是进行这个构造函数编写,以及我们的这个run方法的日志输出;
3)因为我们的这个car依赖于这个framework,因此这个里面就是需要new这个framwork对象,因此我们需要创建车身这个类,然后以此类推,我们的这个车身依赖于这个底盘,我们需要去构建这个底盘这个类,然后我们的这个底盘依赖于这个轮胎,这个时候我们去构建这个轮胎这个类;
4)在我们的这个轮胎这个类里面,我们规定这个轮胎的尺寸大小,在这个main里面调用这个car的构造方法,我们的这个小车就可以跑起来了;
我们上面的这个car里面的这个tire的尺寸大小就是写死的,这样写并不好,如果我们想要把这个参数进行传递,就需要进行下面的这个修改;
这个时候因为这个参数传递的原因,我们的这个里面的每一个文件都需要进行修改,正所谓牵一发而动全身,这个就说明我们的这个项目里面的这个不同文件之间的这个耦合度太高了,以至于我们的一个细节需要每一个文件都进行修改,基于这个原因,我们引入下面的这个IOC的写法;
上面说了,这个传统写法想要进行这个参数的传递的时候,需要去对于每一个文件都进行相应的修改,因此这个就显得耦合度很高,下面的这个写法就是我们的这个IOC的思想;
这个时候,我们造车的时候需要车身,我们直接让这个car的构造函数里面的这个参数就是我们的这个车身,以此类推,我们的这个车身需要底盘,我们就让这个车身的这个构造方法的参数就是我们的底盘;
我们的这个底盘需要轮胎,我们就让这个底盘里面的这个构造方法的参数就是轮胎:
因为这个轮胎没有什么需要依赖的,因此这个时候我们的这个Tire里面的这个代码基本上保持不变:
我们接下来在这个主方法的里面进行这个调用的过程:
这个时候,如果我们想要给这个轮胎添加上这个颜色,只需要在两个文件里面进行修改:就是在这个time自己的这个类里面去添加上这个对应的成员变量,我们的这个主方法进行这个调用的时候加上这个对应的参数就可以了其他的都是不需要进行修改的;
下面的这个就是我们的这个IOV的一个逻辑:
1)存对象:@component
2)取对象:@autowired
有了这个依赖注入的这个语法,我们就可以直接去吧我们的这个对象存到我们的这个spring容器里面去,而不需要使用这个new的方式去进行这个对象的创建;
我们的这个bookservice里面的这个代码,可以看到是使用这个new的方式创建了一个这个bookdao对象,这个时候我们可以在这个bookservice上面加上这个component,这个就意味着我们的这个bookservice就会让我们的这个spring容器进行管理;
我们的这个原来的这个new对象的这个方式就可以修改为这个autowored的方式,这个表示的就是我们从这个容器里面吧这个对象拿出来(前提是我们的这个bookdao也是在这个容器里面的);
我们在这个bookdao上面也是添加上这个component,表示我们的这个bookdao也是使用这个spring容器进行管理的;
下面的这个就是我们原来使用的是这个new bookservice的方式,这个时候我们的这个bookservice已经加上了这个spring容器里面了,因此我们就可以使用这个autowired这个方式对于我们的这个对象,从容器里面拿出来;
这个时候,我们直接运行登录查看这个效果,没有出现问题说明我们的这个对象的存和取都是正确的;
首先我们需要了解一下这个启动类和上下文的概念:
1)启动类:就是下面的这个上面带有我们的这个@springbootapplication的这个类,我们的这个项目的运行就是从这个启动类开始的;
2)上下文:我们的这个程序的运行相关的这个信息就是存储在我们的这个上下文里面的,例如我们的这个线程之间的这个并发执行,我们的这个线程1执行之后轮到这个线程2,线程2执行之后又回到这个线程1,这个时候我们如何知道这个线程1上次离开的时候这个线程执行到什么位置,这个时候我们就可以把这个程序的运行的相关的信息存储到我们的这个上下文里面;
bean就是我们的这个spring进行管理的对象;我们使用这个getbean取出来这个对象,这个是使用的我们的这个对象的类型的方式;
当我们使用这个注解的时候:需要在这个启动类里面使用我们的这个getbean方法获取这个容器里面的对象,这个参数是使用的这个类的名字获取这个对象,调用这个对象的方法;(我们上面的那个注释是使用的我们的这个类的类型获取的这个对象);
因为我们的这个使用名字获取这个对象的方式获取的这个对象的这个默认类型就是我们的这个object类型的,因此这个时候我们需要使用我们的这个自定义类型进行强制类型转化;
下面的这个就是我们对于这个component这个注解的使用进行演示:
在我们的这个启动类里面:我们使用的是对象名+对象的类型的方式获取这个对象;
上面的这个情况,前面的两个注解进行使用的时候,我们的这个名字其实是让我们的这个spring直接进行管理的,我们自己是在默认知道了这个规则,才可以在这个getBean里面进行使用的,下面的这两个箭头指向的内容就是我们的这个名字(根据这个spring命名规范起的名字);
下面我们介绍一下这个spring对于我们的这个创建的这个类里面的这个对象的命名规则
1)小驼峰,遵循我们的这个java里面的命名规范;
2)当这个类的名字的前面的两个字母都是大写的时候,我们的这个spring命名就是大写的,如果是第一个字母大写,我们的这个spring就会按照自己的这个小驼峰进行处理;
具体的这个演示如下:
根据这个打印结果,我们可以看到,这个spring进行处理的时候,这个具体的名字是怎么样的,这个就是命名规则,我们的前面的两个字母都是大写的时候,这个spring进行处理的时候才会和我们自己写的这个一样,否则其他的这个情况下都是按照这个小驼峰的规则进行的;
我们可以具体查看这个decapitalize查看这个具体的命名逻辑:和我们上面说的是一样的
这个时候,就是我们不是用这个spring默认给的这个名字,而是在这个component这个后面加上参数,改变这个默认的名字,然后我们再这个启动类里面可以使用我们自己写的这个名字;
其实上面的介绍已经覆盖了大部分情况,因此下面的这个我们选取任何一个方式获取这个spring里面的对象
首先还是定义这个类,里面写上我们的这个方法,类的上面加上这个注解:
我们在这个启动类里面可以使用任意的一个方法获取这个spring里面的对象,下面的这个选择的是第二个方式,就是直接使用名字,这个时候我们需要进行强制类型转换;
使用第三种方式也是可以的,这个时候第一个参数就是我们的对象名字,第二个参数就是我们的这个对象的类型,这个时候不需要进行这个强制类型转换;
我们在这个启动类使用的是第一个方法取出来我们的这个对象,使用这个对象调用我们的这个里面的成员方法,打印结果也是正常输出的;
下面的这个展示的就是我们的这个不同的注解之间的关联:我们的这个controller调用我们的这个service里面的这个内容,我们的这个service继续对于这个repository里面的这个内容进行调用;
上面介绍的五个注解都是我们的类注解,下面介绍的这个@Bean是我们的这个方法注解:
1)类注解:修饰我们的这个自定义类的;
2)方法注解:对于我们的类里面的这个方法进行修饰的;
下面的这个就是我们的这个@Bean注解修饰我们的这个方法,因为我们的这个方法的返回值是一个对象,我们想让这个spring对于我们的这个返回的对象进行管理;
我们在这个启动类里面还是使用这个相关的方法对于这个对象进行获取,调用我们的这个里面的方法,获取这个对象的相关的属性值;
通过这个例子可以发现,我们的这个@Bean方法注解需要结合上面的这些类注解进行使用,我们可以自己进行测试,我们的这个@configuration注解去掉之后,运行的时候我们是无法获取这个内容的;
因此,我们的这个@Bean需要结合我们的这个类注解进行使用
我们的注解,无论是类注解还是方法注解都需要在这个扫描路径下面才可以生效;
扫描路径默认就是:我们的这个启动类所在的这个 路径下面,如果我们挪动这个启动类的位置,这个时候我们的这个代码是会报错的;
默认情况下,我们的这个启动类和我们的这个项目里面的各种包的路径是一样的,因此我们就可以直接运行;
@Bean注解默认的这个方法的名字就是我们的这个定义的方法的名字:可以按照下面的这个方法进行修改
们的这个启动类所在的这个 路径下面,如果我们挪动这个启动类的位置,这个时候我们的这个代码是会报错的;
默认情况下,我们的这个启动类和我们的这个项目里面的各种包的路径是一样的,因此我们就可以直接运行;
@Bean注解默认的这个方法的名字就是我们的这个定义的方法的名字:可以按照下面的这个方法进行修改
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有