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包中放的是一个一个的类 罐子中放的是 咖啡豆