后端学习(一)
几个相关概念
J2EE
J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应用过程中的产物。Sun推出J2EE的目的是为了克服传统Client/Server模式的弊病,迎合Browser/Server架构的潮流,为应用Java技术开发服务器端应用提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是一个标准,而不是一个现成的产品。各个平台开发商按照J2EE规范分别开发了不同的J2EE应用服务器,J2EE应用服务器是J2EE企业级应用的部署平台。由于它们都遵循了J2EE规范,因此,使用J2EE技术开发的企业级应用可以部署在各种J2EE应用服务器上。
- Java 有三个版本,分别为 J2SE、J2EE和J2ME
- J2EE是功能最丰富的一个版本,主要用于开发高访问量、大数据量、高并发量的网站,例如美团、去哪儿网的后台都是J2EE。通常所说的JSP/Servlet 开发就是J2EE的一部分。
- J2EE包含J2SE中的类,它是一个开发的平台,是多种技术的集合,主要有13种核心的技术,包括:Servlet、JSP、JDBC、JNDI、EJB、RMI、Java IDL/CORBA、XML、JMS、JTA、JavaMail、JTA和JTS。
Spring
spring是一个开放源代码的J2EE应用程序框架,为了解决企业应用开发的复杂性而创建的。是一个轻量级的控制反转(IoC)和面向切面的(AOP)的容器框架。
- 基于POJO的轻量级和最小侵入性编程
- 通过控制反转(IOC-应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护)、依赖注入(DI-创建对象并组装对象之间的关系)和面向接口实现松耦合的技术达到松耦合的目的
- 基于切面(AOP)和惯例进行声明式编程;
- 通过切面和模版减少样式代码;
假设一个场景:目前有三个角色,买水果的人(用户),卖水果的人(业务层),水果(持久化层)
先写一个接口
public interface Fruit {
public void get();
}
现在实现3种水果的类,为了方便展示,把它们先写在一起,
// Apple.java
public class Apple implements Fruit{
public void get() {
System.out.println("get an apple");
}
}
// Orange.java
public class Banana implements Fruit{
public void get() {
System.out.println("get a banana");
}
}
// Banana.java
public class Orange implements Fruit{
public void get() {
System.out.println("get a organe");
}
}
然后,实现一个用户类
// User.java
public class User {
public static void main(String[] args) {
UserService user = new UserService();
user.getFruit();
}
}
上述就是我们实现一个程序的惯用方式,这样看上去没有什么问题,目前我们调用业务层UserService获取到苹果,那么试想一下,如果现在我想获取橘子怎么办?这样就需要修改业务层代码,
// UserService.java
public class UserService {
private Fruit fruit = new Orange();
public void getFruit() {
fruit.get();
}
}
也许很多同学会认为这样没什么问题,那就修改一下业务层代码啊?显然,这不是一个优秀的程序员做的事情,每当用户需求做出改变时,我们的代码都要做出相应的修改,那么有两个问题,如果工程量较大,修改的内容较多怎么办?如果我们修改代码对其他业务造成影响怎么办?所以,一个好的设计思路就应该在不改变原代码的基础上实现我们想要的功能。那么,接下来就应该转变思维,考虑一下,目前的控制权在业务层,所以每次用户需求改变时,业务层也要跟着改变,既然这样,我们把控制权交给用户不就行了吗?下面来修改一下业务层的代码实现控制权的转换,
public class UserService {
private Fruit fruit;
public void setFruit(Fruit fruit) {
this.fruit = fruit;
}
public void getFruit() {
this.fruit.get();
}
}
细心的同学应该可以看得出改变,我在加了一个set方法,使得用户层可以注入不同的对象,这样我们在用户层传入哪个对象,就会获得哪个结果,
// 1. 获取橘子
public class User {
public static void main(String[] args) {
UserImpl user = new UserImpl();
user.setFruit(new Orange()); //在这里注入对象
user.getFruit();
}
}
//2. 获取香蕉
public class User {
public static void main(String[] args) {
UserImpl user = new UserImpl();
user.setFruit(new Banana());
user.getFruit();
}
}
如此实现了控制权的反转,之前主动权在业务层,每次用户提出需求业务层就需要跟着做出改变,现在我们把主动权交给了用户,它传进什么,就得到什么样的结果,这样业务代码就不用跟着改变了。这就是IOC(控制反转)的核心思想。
Spring boot
- spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc。
spring mvc 是只是spring 处理web层请求的一个模块。 因此他们的关系大概就是这样: spring mvc < spring < springboot。 - Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring
应用程序并且尽可能减少你的配置文件。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,springboot整合了所有的框架。 - Spring在组件注入和装配过程中需要大量的配置,那么,随着项目的增大,那么就需要很多庞大的配置项,显然,这与Spring的初衷是相悖的。所以,Spring Boot就以“习惯优于配置”的理念在Spring的基础上扩展而来,它不仅继承了Spring的优点,还实现了自动配置Spring,进一步简化了开发过程,这就是Spring Boot的优点之一,当然,它还有诸多其他优点,例如,创建独立的Spring应用程序嵌入的Tomcat,无需部署WAR文件简化Maven配置自动配置Spring提供生产就绪型功能,如指标,健康检查和外部配置绝对没有代码生成和对XML没有要求配置
Tomcat
Tomcat是web容器,做web项目时,多数需要http协议,也就是基于请求和响应,比如在百度输入一行内容搜索,那么百度服务器如何处理这个请求呢,他需要创建servlet来处理,servlet其实就是java程序,只是在服务器端的java程序,servlet通过配置文件拦截你的请求,并进行相应处理,然后展示给你相应界面,那么servlet如何创建? 这时候tomcat用到了,它就是帮助你创建servlet的东西,所以也称web容器,没有它,没法运行web项目。相对应的web容器有很多,比如JBOSS,WEBLOGIC等。
- Tomcat是一个应用服务器。他可以运行你按照J2EE中的Servlet规范编写好的Java程序。
- 简单的说它是一个Web网站的运行容器,把你写好的网站放进去就可以运行。
- Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,处理动态网页部分。Eclipse+tomcat=网络应用,如JSP类应用
参考:
https://www.zhihu.com/question/53729800/answer/1217542529