回顾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【没有在配置文件中注册过】

【Spring】02 过程分析的更多相关文章

  1. Spring 02多种注入方式和注解实现DI

    一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...

  2. Spring启动过程分析】(1)启动流程简介

    1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...

  3. Spring → 02:开发初步

    一.搭建开发环境 1.1.IDE的安装和配置 1.2.开发包的准备及开发包介绍 二.Hello World 2.1.Bean的编码 2.2.Spring配置文件编写 2.3.测试与运行 三.Sprin ...

  4. Spring 02 控制反转

    简介 IOC IOC(Inversion of Control),即控制反转. 这不是一项技术,而是一种思想. 其根本就是对象创建的控制权由使用它的对象转变为第三方的容器,即控制权的反转. DI DI ...

  5. Spring 02: Spring接管下的三层项目架构

    业务背景 需求:使用三层架构开发,将用户信息导入到数据库中 目标:初步熟悉三层架构开发 核心操作:开发两套项目,对比Spring接管下的三层项目构建和传统三层项目构建的区别 注意:本例中的数据访问层, ...

  6. 02 浅析Spring的AOP(面向切面编程)

    1.关于AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  7. DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题

    上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ...

  8. Spring IOC小记

    1. What IOC (Inversion Of Control,控制反转)与DI(Dependency Injecion,依赖注入) 用于对象间解耦,如在以前若对象A依赖B则需要在A中负责B的创建 ...

  9. Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构

    背景 用注解改造前面Spring博客集里(指 Spring 02)Spring接管下的三层项目架构 对前面Spring博客集里(指 Spring 04)@Controller + @Service + ...

  10. 编程从入门到放弃(Java)

      1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...

随机推荐

  1. docker——health(容器的健康检查)

    容器的健康检查机制 了解在dockerfile中容器的健康检查 # 在dockerfile中使用healthcheck指令,声明健康检测配置,用于判断容器主进程的服务状态是否正常,反映容器的实际健康状 ...

  2. kettle从入门到精通 第四十八课 ETL之kettle webspoon

    1.kettle自带的客户端spoon工具是cs架构,多人协同办公起来不是特别方便.当然spoon也可以通过文件仓库设置为database模式进行协同办公.每个人在自己电脑上安装&打开spoo ...

  3. INFINI Gateway 与华为鲲鹏完成产品兼容互认证

    何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...

  4. 通过 Helm Chart 部署 Easysearch

    Easysearch 可以通过 Helm 快速部署了,快来看看吧! Easysearch 的 Chart 仓库地址在这里 https://helm.infinilabs.com. 使用 Helm 部署 ...

  5. Android开发基础——真机测试错误,ADB启动不了,程序安装不了,the connection to adb is down,INSTALL_CANCELED_BY_USER...

    在Android开发中,无论是真机测试还是AVD测试,都会报出这些错误.在这里,我会详细说明一下怎么会出现这些错误的,然后要怎么样才能解决这些错误. 错误一: The connection to ad ...

  6. 《DNK210使用指南 -CanMV版 V1.0》第三章 CanMV简介

    第三章 CanMV简介 1)实验平台:正点原子DNK210开发板 2) 章节摘自[正点原子]DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.c ...

  7. Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!

    Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!   想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切 ...

  8. SpringBoot 整合 Sharding-JDBC 分库分表

    导读 分库分表的技术有:数据库中间件Mycat(点我直达),当当网开源的Sharding-JDBC:我们公司用的也是sharding-jdbc,自己也搭建一个完整的项目,直接可以拿来用.下面附源码(C ...

  9. CF2B

    非常恶心的dp题,测试数据也恶心,坑多,特别是0的坑 #include <iostream> #include <utility> #include <string> ...

  10. Java-泛型,枚举,注解

    1 泛型类 package demo; public class FanXingLei { public static void main(String[] args) { // TODO 自动生成的 ...