spring(2)
两个核心的概念
IOC 控制发展 依赖注入
本来是程序员要实例化对象,把这个任务交(Spring 框架)
框架帮我们实例化对象,我们从容器中获取即可
这个就叫做控制反转。
非要用一个词描述spring框架
解耦
怎么降低程序之间的依赖?
controlle ----service --dao
通过案例来看,解耦合
解耦合
后面写代码都是 controlle ----service --dao。
servlet -----controller controller对servlet做 进一步的封装,用起来更加的方便
控制器
service :业务逻辑,主要写业务逻辑的
dao:基本的简单的数据库的增删改查操作
这个层的额操作讲究是通用的,不会涉及到具体的业务逻辑
一到涉及到具体的业务逻辑,就不同用了。
通用度比较高,那么dao层的代码量就会比较少
认为 Service和dao是重复的,要一个即可?
例如:转账操作
在service层中是一个业务逻辑,定义一个转账方法即可
在dao层中是两个操作
在service层要调用两个dao方法

难道没有复杂的业务逻辑吗?
一般把复杂的操作变成n个简单的操作
之前学的是。尽量用一个复杂sql实现复杂的功能,做题
复杂的逻辑没拆成n个简单的操作,为了实现底层的代码的通用性 工作
等到后期,dao层代码基本不需要写,苞米豆已经帮我们写完了
我们只需要写极个别的复杂的需求的代码即可
具备拆的能力
例子:查询三年二班 所有学生的成绩
一步:
select*from stu,grade where stu.gid=grade.gid and gname="三年二班"
二步
根据班级字查询id
select gid from grade where gname = “三年级二班”
根据gid查询学生表中所有学生的成绩
select*from stu where stu.gid="刚才查询的id";
1.为什么要拆?
后期要用别人的代码,实现数据库的各种操作。
然后翻看人家的代码发现基本都是单张表按操作,
所以我们为了能少写代码,多用别人的代码,我们把复杂的逻辑变成
n个简单的数据库单表操作,顺便提高代码的执行效率
2.为什么不写多张表的操作,这样我们程序员用起来更加的方便
只要涉及多张表的操作,一般会存在对应的业务逻辑
人家是没法预测具体的业务逻辑的,所以之中代码不好实现
人家苞米豆团队写的代码一定是通用的,不只是只对你自己的代码jie'ou
如果真的需要多张表的,而且我们假设没法再拆分,一定是多表操作,怎么办
老老实实的自己写dao层的代码,自己调用即可
一句话。能用别人的就用别人的,是在没办法在自己写

目前来说是单独的存在的,不存在关联关系
要让userDao作为一个属性值,注入到userService中
重点:代码中我们并没有实例化 userDao,但是可以调用
是因为我们在配置文件中实例化了userDao 并把此对象作为属性注入到了service 中
代码写完了 ,考虑一个问题,这样写究竟会带来什么好处?
解耦,让代码更加的灵活
例如:随着版本的迭代,发现UserDao写的不够好,想替代它
把当前类表示过时,,写一个新的类替换
我们可以用新的方式
在配置文件中重新配置即可

不需要修改代码‘




张才说了 设值注入,调用set方法实现对象的注入
构造注入
利用构造函数实现对象的注入

在配置文件中

- 其实还是比较麻烦,因为你要写很多的东西,例如构造函数 get/set方法
我们能不能只专注与写逻辑呢,而不是大量的写没用的代码
第三种方式使用注解
在配置文件中只配置这一行代码:使用包扫描
直译:组件的扫描
要扫描哪些包
在这里扫描的是com包,以及子包中的类
注意:这里只扫描添加特定的注解的类,把这些类实例化,放在容器中

在userDao里面

在UserServiceimpl里面

在这个项目中,这两个类加上注解。所以这两个类会被spring扫描到,并且实例化放在容器中
@Service 用来修改业务了逻辑层的代码
@Reposrioty 用来修改Dao层的代码
@Autowired 想要把那个对象注入,在此接口上添加这个注解
spring 扫描到这个注解后,会从容器中找此接口的实现类,然后把实现类的实例赋值给此属性。从而完成对象的自动注入
注意:

value相当于给此service起一个名字
为什么要起一个名字呢
在测试类中,根据名字来获取service实例的

能不能不要名字呢?
可以,要修改测试类的代码
getbean(UserService.class)
这样的话,spring会根据类型找此接口的实现类
但是:如果此接口有多个实现类就会报错
为什么类,对象可以称之为Bean?
我们的包是jar包 jar直译叫做罐子,可以理解为咖啡罐
Bean理解为咖啡豆
jar包放的是一个一个的类
罐中放的是咖啡豆

怎么解决?
1.在注解上添加名字的
2.根据类型找实例

弊端:
如果这个类型有多个实现类,会出问题

一个接口,有两个实现类。程序不会做选择题 ,如果有多个选项,不会自动选择,框架不知道用哪个实例,所以报错
在工作中,我们只需要稍微注意,一个接口只写一个实现类即可
Bean 类 对象
Bean 直译是 豆 。怎么跟类 对象进行关联的?
我们的包叫做 jar包

jar 直译叫做罐子 可以理解为咖啡罐
Bean 理解为咖啡豆
jar包中放的是一个一个的类
罐子中放的是 咖啡豆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话