一、传统Javaweb开发的困惑
传统Javaweb开发代码分析-用户模块
困惑一:
困惑二:
传统Javaweb开发困惑以及解决方案
关于困惑一:层与层之间紧密耦合在了一起,接口与具体实现紧密耦合在了一起
解决思路:程序代码中不要动手new对象,第三方根据要求微程序提供需要bean对象
关于困惑二:通用的事务功能耦合在业务代码中,通用的日志功能耦合在业务代码中
解决思路:程序代码中不要手动new对象,第三方根据要求为程序提供需要的Bean对象的代理对象,代理对象内部动态结合业务和通用功能。
二、IoC、DI和AOP思想提出
(1)IoC控制反转思想的提出
实际开发中,对象之间的耦合关系,就类似手表内部的齿轮, 每个齿轮都紧密啮合在一起,一旦某个齿轮发生故障 ,那么整个系统也意味着崩溃。尽可能让对象之间的关系保持松耦合状态是我们期望的。
IoC思想: Inversion of Control,翻译为“控制反转”或“反转控制”,强调的是原来在程序中创建Bean的权利反 转给第三方。
例如:原来在程序中手动的去 new UserServiceImpl(),手动的去new UserDaoImpl(),而根据IoC思想的指导,寻求一个第三方去创建UserServiceImpl对象和UserDaoImpl对象。这样程序与具体对象就失去的直接联系。
(2)谁去充当第三方角色?
工厂设计模式,BeanFactory来充当第三方的角色,来生产Bean实例。
BeanFactory怎么知道产生那些Bean示例呢?
可以使用配置配件配置Bean的基本信息,BeanFactory根据配置文件来产生Bean实例。
例如,用IoC思想去反转UserServicelmpl的创建权,由原来程序中创建反转给通过BeanFactory去创建。
(3)Dl依赖注入思想的提出
上面使用BeanFactory的方式已经实现的"控制反转",将Bean的创建权交给了BeanFactory,如果我们想将 、UserDao的创建权也反转给BeanFactory,与此同时UserService内部还需要用到UserDao实例对象,那应该怎样操作呢?
- (1)在程序中,通过BeanFactory获得UserService
- (2)在程序中,通过BeanFactory获得UserDao
- (3)在程序中,将UserDao设置给UserService
思考,该方式是否存在一些问题?
UserService存在于BeanFactory中, UserDao也存在于BeanFactory中, 可以在BeanFactory内部进行结合。
将UserDao在BeanFactory内部设置 给UserService的过程叫做“注入” ,而UserService需要依赖UserDao 的注入才能正常工作,这个过程叫做 “依赖注入” 。
(4)面试题:loC和DI的关系?
首先,先回答loC和Dl是什么:
IoC: Inversion of Control,控制反转,将Bean的创建权由原来程序反转给第三方
DI:Dependency Injection,依赖注入,某个Bean的完整创建依赖于其他Bean(或普通参数)的注入
其次,在回答loC和Dl的关系
第一种观点:IoC强调的是Bean创建权的反转,而DI强调的是Bean的依赖关系,认为不是一回事
第二种观点:IoC强调的是Bean创建权的反转,而DI强调的是通过注入的方式反转Bean的创建权,认为DI 是IoC的其中一种实现方式
(5)AOP面向切面思想的提出
IoC和DI思想主要是解决前面我们的困惑一,困惑二还没有解决
困惑二的解决方案是,借助于loC思想,将Bean的创建权反转给BeanFactory,而BeanFactoy产生的Bean是目标Bean的代理对象,这样就可以在代理对象中对目标对象方法进行相应的增强。
AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程。
三种思想总结
(1)loC控制反转,是将程序创建Bean的权利反转给第三方
(2)DI依赖注入,某个完整Bean需要依赖于其他Bean(或属性)的注入
(3)AOP面相切面编程,用横向抽取方法(属性、对象等)思想,组装成一个功能性切面
三、框架概念的出现
上面提出了一些思想来解决遇到的问题,而这些思想的显示就是需要通过编码区落地,往往我们把具备一定业务领域解决方案的“工具”称为框架。
框架的基本特点:
- 框架(Framework)是基于基础技术之上,从众多业务中抽取出的通用解决方案;
- 框架是一个半成品,使用框架规定的语法开发可以提高开发效率,可以用简单的代码就能完成复杂的基础业务
- 框架内部使用大量的设计模式、算法、底层代码操作技术,如反射、内省、xml解析、注解解析等
- 框架一般都具备扩展性
- 有了框架,我们可以将经理尽可能的投入在纯业务开发上而不用去费心技术实现以及一些辅助业务
Java中常用的框架:
不同语言,不同领域都有属于自己的框架,使用框架开发是作为程序的最基础的底线,Java语言中的框架可以分为基础框架和服务框架。
- - 基础框架:完成基本业务操作的框架,如MyBatis、Spring、SpringMVC、Struts2、Hibernate等
- - 服务框架:特定领域的框架,一般还可以对外提供服务框架,如MQ、ES、Nacos等
思想、框架和编码的关系
- - 架构师(高级程序员):把思想落地变为实现的人,例如上面的设计和BeanFactory的编写,即框架的设计和现实者。
- - 程序员:使用框架完成业务的人,其中UserServiceImpl、beanss.xml、测试类都是我们编写的。