spring(2)

两个核心的概念
IOC 控制发展 依赖注入
本来是程序员要实例化对象,把这个任务交(Spring 框架)
框架帮我们实例化对象,我们从容器中获取即可
这个就叫做控制反转。
非要用一个词描述spring框架
解耦
怎么降低程序之间的依赖?
controlle ----service --dao
通过案例来看,解耦合
 
解耦合
后面写代码都是 controlle ----service --dao。
servlet -----controller controller对servlet做 进一步的封装,用起来更加的方便
 
控制器
service :业务逻辑,主要写业务逻辑的
dao:基本的简单的数据库的增删改查操作
这个层的额操作讲究是通用的,不会涉及到具体的业务逻辑
一到涉及到具体的业务逻辑,就不同用了。
通用度比较高,那么dao层的代码量就会比较少
认为 Service和dao是重复的,要一个即可?
例如:转账操作
在service层中是一个业务逻辑,定义一个转账方法即可
在dao层中是两个操作
在service层要调用两个dao方法
 
0
 
难道没有复杂的业务逻辑吗?
一般把复杂的操作变成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层的代码,自己调用即可
一句话。能用别人的就用别人的,是在没办法在自己写
0
目前来说是单独的存在的,不存在关联关系
要让userDao作为一个属性值,注入到userService中
重点:代码中我们并没有实例化 userDao,但是可以调用
是因为我们在配置文件中实例化了userDao 并把此对象作为属性注入到了service 中
 
代码写完了 ,考虑一个问题,这样写究竟会带来什么好处?
解耦,让代码更加的灵活
 
例如:随着版本的迭代,发现UserDao写的不够好,想替代它
把当前类表示过时,,写一个新的类替换
我们可以用新的方式
在配置文件中重新配置即可
0
不需要修改代码‘
0
 
 
0
 
0
0
张才说了 设值注入,调用set方法实现对象的注入
 
构造注入
利用构造函数实现对象的注入
 
0
 
在配置文件中
0
 
  • 其实还是比较麻烦,因为你要写很多的东西,例如构造函数 get/set方法
我们能不能只专注与写逻辑呢,而不是大量的写没用的代码
第三种方式使用注解
在配置文件中只配置这一行代码:使用包扫描
直译:组件的扫描
要扫描哪些包
在这里扫描的是com包,以及子包中的类
注意:这里只扫描添加特定的注解的类,把这些类实例化,放在容器中
 
 
 
0
在userDao里面
0
 
在UserServiceimpl里面
 
0
 
 
在这个项目中,这两个类加上注解。所以这两个类会被spring扫描到,并且实例化放在容器中
@Service 用来修改业务了逻辑层的代码
@Reposrioty 用来修改Dao层的代码
@Autowired 想要把那个对象注入,在此接口上添加这个注解
spring 扫描到这个注解后,会从容器中找此接口的实现类,然后把实现类的实例赋值给此属性。从而完成对象的自动注入
 
注意:
0
 
value相当于给此service起一个名字
 
为什么要起一个名字呢
在测试类中,根据名字来获取service实例的
 
0
 
能不能不要名字呢?
可以,要修改测试类的代码
getbean(UserService.class)
这样的话,spring会根据类型找此接口的实现类
但是:如果此接口有多个实现类就会报错
 
 
 
为什么类,对象可以称之为Bean?
我们的包是jar包 jar直译叫做罐子,可以理解为咖啡罐
Bean理解为咖啡豆
jar包放的是一个一个的类
罐中放的是咖啡豆
0
 
怎么解决?
1.在注解上添加名字的
2.根据类型找实例
0
弊端:
如果这个类型有多个实现类,会出问题
0
 
一个接口,有两个实现类。程序不会做选择题 ,如果有多个选项,不会自动选择,框架不知道用哪个实例,所以报错
在工作中,我们只需要稍微注意,一个接口只写一个实现类即可
Bean  类 对象
 
Bean 直译是 豆 。怎么跟类  对象进行关联的?
 
 
我们的包叫做 jar包
0
 
 
 
jar  直译叫做罐子   可以理解为咖啡罐
 
Bean 理解为咖啡豆
 
jar包中放的是一个一个的类
罐子中放的是 咖啡豆
posted @   码农在广场  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示