zoukankan      html  css  js  c++  java
  • 【Spring】02 过程分析

    回顾JavaWeb三层架构设计:

    UserDao接口

    public interface UserDao {
        void getUser();
    }

    实现类

    public class UserDaoImpl implements UserDao{
        public void getUser() {
            System.out.println("获取用户数据");
        }
    }

    UserService接口

    public interface UserService {
        void getUser();
    }

    实现类

    public class UserServiceImpl implements UserService{
    
        UserDao userDao = new UserDaoImpl();
    
        public void getUser() {
            userDao.getUser();
        }
    }

    最后测试执行

    这就是我们JavaWeb调用的样子

    业务实现类实现接口,组合Dao接口,

    调用Dao接口实现类的实现方法完成功能

    public class ModelLayerTest {
        @Test
        public void mlt(){
            UserService userService = new UserServiceImpl();
            userService.getUser();
        }
    }

    如果需求变更,客户玩Oracle的,我们要写一个Oracle的Dao实现类

    然后再Service实现类去newOracle的实例

    public class UserServiceImpl implements UserService{
        
        UserDao userDao = new UserDaoOracleImpl();
    
        public void getUser() {
            userDao.getUser();
        }
    }

    这反复更改硬编码的方式它不累吗?

    每一次需求的变更,就变成对既定设计的破坏,这很不GOF23.jpg

    对象的获取写死在new的硬编码中,这不就成了程序控制了对象?

    我们不应该关注是谁实现的Dao接口,

    而是关注实现的抽象

    public class UserServiceImpl implements UserService{
    
        UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public UserServiceImpl() {
        }
    
        public UserServiceImpl(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void getUser() {
            userDao.getUser();
        }
    }

    对于实例,现在我们可以更加灵活的实现接口

    对象的控制实现变成我们来操作了

    IOC【Inversion of Control】

    控制反转,即对象的控制权反转交给了我们,不再是程序控制对象

    这是一种设计的思想,大多采用组合,聚合的方式实现

    DI 【Dependency Injection】

    依赖注入是反转控制实现IOC的一种方法

    XML方式配置Bean的时候,Bean的定义信息和实现分离,注解可将二者合为一体

    Bean定义的信息直接以注解方式定义在实现类中,达到零配置的目的

    我们对实例的控制从硬编码程序的new,交给了Spring统一管理,

    获取这个对象,只需要在Bean容器中注册,然后通过一个管理对象获取

        <!--
        普通生成对象的过程
        cn.dai.pojo.Hello hello = new cn.dai.pojo.Hello();
        hello.setName("这是Hello类的name属性的值");
        
        这个过程交给Spring处理了
        -->

    IOC是什么?

    全称Inverse Of Control 反转控制

    控制的什么?是对象的创建控制从硬编码中反转给了Spring容器

    - 没有Spring容器,我们创建对象是通过在硬编码中new出一个来

    - 其次还有反序列化、克隆、反射,这些都需要一些条件来实现

    - 现在使用Spring容器,对象通过在容器中注册,统一交给容器来调取

    DI 是什么?

    全称Dependency Injection 依赖注入

    - 指构筑对象创建所需要的依赖,这其中存在基本属性,也存在引用类型

    - 例如我们的JavaWeb三层架构中,Service依赖Dao,这个Dao就是Service的依赖

    Spring所要求的四个依赖组件

    - Spring-Beans

    - Spring-context

    - Spring-core

    - Spring-expression

    【这四个组件必须要求同一个版本,否则无法使用】

    为什么在快速入门时,直接使用了MVC包?

    因为MVC默认涵盖了这些东西,不需要手动一个个单独导入

    Config 容器配置 

    Application-Context.xml实际上是Spring容器的配置文件

    这是最原始的SpringBean注册方式

    Container 容器

    Spring容器是一个叫做ApplicationContext的接口,这个接口具有极其众多的实现类

    而通过上述的XML配置文件来实现注册,其调用的容器实现类是这个类:

    ClassPathXmlApplicationContext

    至少要求一个参数,参数注入的是我们的容器配置文件的名称路径

    【这个路径是从类路径作为根路径寻找的,在Maven里面就是resources目录下】

    另外,构造器还支持多个参数注入,也就是说支持多个容器配置文件注册Bean

    GetBean 从容器中获取对象

    调用自Spring容器的方法,getBean方法

    其参数有两种主要用的重载

    第一种:只注入Bean的ID名字即可获取对象

    获取的对象所属类型是Object,可以通过强制转型处理【我感觉多写这个强转都会累死了】

    第二种:注入Bean的ID名字 + 所属类的字节对象

    不需要强转,通过注入的字节对象来实现原型获取

    Bean对象在什么时候被创建出来?

    同创建容器实例一样,同期创建

    找不到Bean对象异常的几种问题:

    - 注册了两个以上相同的Bean

    - 容器找不到这个Bean【没有在配置文件中注册过】

  • 相关阅读:
    有向无环图
    2016
    Permutation Descent Counts(递推)
    Rikka with Subset
    hihoCoder 1549 或运算和
    Young Maids
    1925: [Sdoi2010]地精部落
    Problem H. Hotel in Ves Lagos
    改变presentModalView大小
    no such file to load -- bundler/setup
  • 原文地址:https://www.cnblogs.com/mindzone/p/12827301.html
Copyright © 2011-2022 走看看