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