【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【没有在配置文件中注册过】
【Spring】02 过程分析的更多相关文章
- Spring    02多种注入方式和注解实现DI
		一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ... 
- Spring启动过程分析】(1)启动流程简介
		1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ... 
- Spring → 02:开发初步
		一.搭建开发环境 1.1.IDE的安装和配置 1.2.开发包的准备及开发包介绍 二.Hello World 2.1.Bean的编码 2.2.Spring配置文件编写 2.3.测试与运行 三.Sprin ... 
- Spring 02 控制反转
		简介 IOC IOC(Inversion of Control),即控制反转. 这不是一项技术,而是一种思想. 其根本就是对象创建的控制权由使用它的对象转变为第三方的容器,即控制权的反转. DI DI ... 
- Spring 02: Spring接管下的三层项目架构
		业务背景 需求:使用三层架构开发,将用户信息导入到数据库中 目标:初步熟悉三层架构开发 核心操作:开发两套项目,对比Spring接管下的三层项目构建和传统三层项目构建的区别 注意:本例中的数据访问层, ... 
- 02 浅析Spring的AOP(面向切面编程)
		1.关于AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ... 
- DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题
		上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ... 
- Spring IOC小记
		1. What IOC (Inversion Of Control,控制反转)与DI(Dependency Injecion,依赖注入) 用于对象间解耦,如在以前若对象A依赖B则需要在A中负责B的创建 ... 
- Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构
		背景 用注解改造前面Spring博客集里(指 Spring 02)Spring接管下的三层项目架构 对前面Spring博客集里(指 Spring 04)@Controller + @Service + ... 
- 编程从入门到放弃(Java)
		1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ... 
随机推荐
- sort awk 文本处理命令
			sort: 1.将文件的每一行作为一个单位,相互比较 2.默认升序 3.以字符来进行对比,从首字符开始往后,依次按ASCII码值排序 sort 显示文件内容 (类似cat) 选项: -u 去掉重复行 ... 
- 阿里云ECS后台CPU占用100%,top却找不到
			上周公司阿里云服务器后台报警,CPU占用瞬间飙升到100%: 首先想到使用top命令查询CPU占用详情: 发现进程占用CPU都比较低,在CPU占用一栏发现只有ni的占用比较高. 先了解一下CPU相关监 ... 
- 判断是不是ie浏览器 加上ie11
			var b_version = navigator.appVersion; var version = b_version.split(";"); var trim_Version ... 
- 使用WinSW把nginx做成windows服务
			1.下载nginx:http://nginx.org/en/download.html 2.下载win sw:https://github.com/winsw/winsw/releases/tag/v ... 
- 比较 SpringSecurity 和 Shiro
			相比 Spring Security, Shiro 在保持强大功能的同时,使用简单性和灵活性. SpringSecurity: 即使是一个一个简单的请求, 最少得经过它的 8 个Filter.Spri ... 
- 机器学习策略篇:详解清除标注错误的数据(Cleaning up Incorrectly labeled data)
			清除标注错误的数据 监督学习问题的数据由输入\(x\)和输出标签 \(y\) 构成,如果观察一下的数据,并发现有些输出标签 \(y\) 是错的.的数据有些标签是错的,是否值得花时间去修正这些标签呢? ... 
- post请求 restTemplate.postForObject restTemplate.postForEntity  java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx POSTpost请求
			1.restTemplate调用的两种方式及获取字符串转换对象model的处理,统一按接收字符串,然后gson转换为对象的方式. ResponseData对象包含的属性private String r ... 
- Lucene demo演示搜索查询歌手,歌名,歌词
			1.导入pom jar文件 <dependency> <groupId>org.apache.lucene</groupId> <artifactId> ... 
- Python 潮流周刊#58:最快运行原型的语言(摘要)
			本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ... 
- 创建docker
			创建docker 准备实验环境 1. 安装前准备 Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可. 1.1 查看当前的内核版本 uname -r 1.2 使用 root ... 
