框架
框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。JAVA框架可以分为三层:表示层,业务层和物理层。
-
表示层(struts)
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。
(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action) -
业务层(spring)
Spring是一个业务层框架,整合框架,很好的黏合表示层和持久层。 -
持久层(mybatis)
持久层框架,只负责关系型数据库操作,更注重sql语句的运用。
架构设计
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行(推荐书籍:《淘宝技术这十年》)
- 单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 - 垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。 - 分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。 - 流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
Java主流框架演变之路
1、JSP+Servlet+JavaBean
2、MVC三层架构
3、使用EJB进行应用的开发,但是EJB是重量级框架(在使用的时候,过多的接口和依赖,侵入性强),在使用上比较麻烦
4、Struts1/Struts2+Hibernate+Spring
5、SpringMVC+Mybatis+Spring
6、SpringBoot开发,约定大于配置
核心解释
spring是一个开源框架。
spring是为了简化企业开发而生的,使得开发变得更加优雅和简洁。
spring是一个IOC和AOP的容器框架。
IOC:控制反转
AOP:面向切面编程
容器:包含并管理应用对象的生命周期,就好比用桶装水一样,spring就是桶,而对象就是水
使用spring的优点
1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发
2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL
3、低侵入式设计,代码的污染极低
4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦
6、Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用
7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合,并简化了底层的数据库访问
8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
如何简化开发
1.基于POJO的轻量级和最小侵入性编程
2.通过依赖注入和面向接口实现松耦合
3.基于切面和惯例进行声明式编程
4.通过切面和模板减少样板式代码
spring的模块划分图
- 模块解释:
Test:Spring的单元测试模块
Core Container:核心容器模块
AOP+Aspects:面向切面编程模块
Instrumentation:提供了class instrumentation支持和类加载器的实现来在特定的应用服务器上使用,几乎不用
Messaging:包括一系列的用来映射消息到方法的注解,几乎不用
Data Access/Integration:数据的获取/整合模块,包括了JDBC,ORM,OXM,JMS和事务模块
Web:提供面向web整合特性 - 海燕解释:
每一个绿框都是对应的一个模块,一共8个
黑色框表示模块所需要依赖的jar包
Test模块
Core Container:说白了就是IOC容器,beans对象、core核心包、context上下文、spEL表达式语言,使用IOC只要导这四个包
AOP:面向切面编程
Aspects:切面
Instrumentation:与jdk中的Instrumentation关联,一般不用
Messaging:信息服务,一般不用
Data Access/Integration:数据访问/继承,JDBC数据库连接,transactions事物,ORM,OXM一般不用,JMS一般不用
Web:WebSocket网络通信协议,servlet,web,portlet和系统相关的一般不用
生态
任何一个语言或者任何一个框架想要立于不败之地,那么很重要的就是它的生态。
建立spring项目
1.建立java项目
2.导入jar包(spring所有版本https://repo.spring.io/release/org/springframework/spring/、dist:存放jar包、docs:存放文档、用maven可以用依赖,就可以不手动导入包了)
3.建立person类
4.建立spring配置文件ioc.xml(导入jar包后会有spring config),ioc.xml文件要放在resource资源目录下
<!--bean标签表示要创建的bean对象
id:bean的唯一标识,为了跟其他的bean区分
class:表示要创建的bean的完全限定名
-->
<bean id="person" class="com.petrel.bean.Person">
<!--给属性赋值使用property标签
name:表示属性的名称
value:表示具体的属性值
-->
<property name="id" value="1"></property>//value表示一个具体的属性值
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
<property name="gender" value="男"></property>
</bean>
5.ApplicationContext具体实现子类
/*
* ApplicationContext:表示IOC容器的入口,想要获取对象的话,必须要创建该类
* 该类有两个读取配置文件的实现类
* ClassPathXmlApplicationContext:表示从classpath中读取数据
* FileSystemXmlApplicationContext:表示从当前文件系统读取数据
*
* * */
//容器中的对象在容器创建完成之前就已经把对象创建好了
ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
//获取具体的bean实例对象,需要进行强制类型转换
Person person = (Person) context.getBean("person");
//获取对象的时候不需要强制类型转换(已经自己转了)
// Person person = context.getBean("person", Person.class);
System.out.println(person);
//没有自己new对象,spring容器创建的对象
搭建spring项目需要注意的点:
1、一定要将配置文件添加到类路径中,使用idea创建项目的时候要放在resource目录下
2、导包的时候别忘了commons-logging-1.2.jar包
细节点:
1、ApplicationContext就是IOC容器的接口,可以通过此对象获取容器中创建的对象
2、对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建
3、对象在IOC容器中存储的时候都是单例的,如果需要多例需要修改属性
Person person = context.getBean("person", Person.class);
Person person2 = context.getBean("person",Person.class);
System.out.println(person == person2);//运行结果:true
4、创建对象给属性赋值的时候是通过setter方法实现的
5、对象的属性是由setter/getter方法决定的,而不是定义的成员属性