主页 > Java问答 > Java三大框架学习教程

2021年初学者学习Java三大框架如何学习?Java三大框架学习教程

  • 更新时间:
  • 编辑:钭冰珍
  • 3477人关注

我们给大家整理了关于Java三大框架学习教程相关问题的精选回答,答案涉及到java、三大框架、java语法基础、Spring、Java框架学习的方面,如果大家想对相关知识点打算深入的了解,可以参阅以下电子资料:

2021年初学者学习Java三大框架如何学习

Java是世界第一编程语言,这已经达成共识,是毋庸置疑的真理。框架是程序员们必学的知识点,而且是十分重要的应用,Spring、Struts、Hibernate也是经典中的经典,最常用的框架类型。

作为Java新手应该如何去学习呢?小编搜集了很多网友的建议,现在为大家总结如下:

第一:对于Spring来说,最应该学习的就是Spring的IOC原理,这在使用过程中是必须要理解的、必会的。用配置文件或者是Annonation的方式来代替New创建实例,可以说这是一个历史性的进步,并且前进了一大步,影响深远。也是间接的促成了接口实现分离的优雅风格。另外,该同学还认为,建议把Hibernate换成Mybatis。

第二:从配置文件开始,理解三个字母各自是如何工作的,以及是如何协同工作的。建议学ssi的时候就这么干,花个一个月左右,使用起来就会很熟练了。然后深入框架的一些高级用法。再接着琢磨它们的原理、思想和设计、实现。最后到能自己重新发明轮子。

更有给力的同学给出了详细的建议,连具体步骤都给出了明确的说明。具体如下:

1. java语法基础,可以看think in java

2. servlet,jsp,jdbc,结合html,css,js实现自己想要的小网站,功能慢慢积少成多。

3. spring,springmvc,springdata,hibernate等框架学习,一上来用这些框架忽略基础,这样会出现只会用xxx框架,换个yyy框架又得重新学习的感觉。

4.设计模式,aop,oop等的学习,当然可以和之前的步骤反复来研究提高。

java学习网
回答:周弘厚

7小时39分钟前补充回答

最新java程序员框架面试题

最新java程序员框架面试题

BeanFactory和ApplicationContext有什么区别

>BeanFactory可以理解为含有bean集合的工厂类。BeanFactory包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。

>BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initializationmethods)和销毁方法(destructionmethods)。

>从表面上看,applicationcontext如同beanfactory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但applicationcontext在此基础上还提供了其他的功能。

>提供了支持国际化的文本消息

>统一的资源文件读取方式

>已在监听器中注册的bean的事件

SpringBean的生命周期

>SpringBean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。

>Springbeanfactory负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(callback)方法组成。

>初始化之后调用的回调方法。

>销毁之前调用的回调方法。

>Spring框架提供了以下四种方式来管理bean的生命周期事件:

>InitializingBean和DisposableBean回调接口

>针对特殊行为的其他Aware接口

>Bean配置文件中的Custominit()方法和destroy()方法

>@PostConstruct和@PreDestroy注解方式

SpringIOC如何实现

>Spring中的org.springframework.beans包和org.springframework.context包构成了Spring框架IoC容器的基础。

>BeanFactory接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与Spring的AOP更容易集成,也提供了处理messageresource的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。

>org.springframework.beans.factory.BeanFactory是SpringIoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是SpringIoC容器的核心接口。

说说SpringAOP

>面向切面编程,在我们的应用中,经常需要做一些事情,但是这些事情与核心业务无关,比如,要记录所有update*方法的执行时间时间,操作人等等信息,记录到日志,

>通过spring的AOP技术,就可以在不修改update*的代码的情况下完成该需求。

SpringAOP实现原理

>SpringAOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。

>如果目标类没有实现接口,那么SpringAOP会选择使用CGLIB来动态代理目标类CGLIB(CodeGenerationLibrary),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

动态代理(cglib与JDK)

>JDK动态代理类和委托类需要都实现同一个接口。也就是说只有实现了某个接口的类可以使用Java动态代理机制。但是,事实上使用中并不是遇到的所有类都会给你实现一个接口。因此,对于没有实现接口的类,就不能使用该机制。而CGLIB则可以实现对类的动态代理。

Spring事务实现方式

>1、编码方式

>所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。

>2、声明式事务管理方式

>声明式事务管理又有两种实现方式:基于xml配置文件的方式;另一个实在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中

Spring事务底层原理

>a、划分处理单元——IOC

>由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring中的IOC划分了事务处理单元。并且将对事务的各种配置放到了ioc容器中(设置事务管理器,设置事务的传播特性及隔离机制)。

>b、AOP拦截需要进行事务处理的类

>Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,事务对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。读取ioc容器事务配置属性,转化为spring事务处理需要的内部数据结构(TransactionAttributeSourceAdvisor),转化为TransactionAttribute表示的数据对象。

>c、对事物处理实现(事务的生成、提交、回滚、挂起)

>spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持、hibernate数据源事务处理支持、JDO数据源事务处理支持,JPA、JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager、AbstractPlatforTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的TransactionManager。

>d、结合

>PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个Spring声明式事务处理的设计体系。

   以上就是“www.javaxue.com”Java培训机构小编介绍的“最新java程序员框架面试题”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


展开阅读
java学习网
回答:戌流苏

9小时33分钟前补充回答

Java三大框架实战视频教程:小白必知基础

Java三大框架实战视频教程:小白必知基础

对于学习Java技术的小伙伴来说,相信或多或少都会听到关于Java编程语言的三大框架。Java作为编程语言界元老级的存在,这么些年来不仅平稳的发展,而且也渐渐成为众多企业首选的编程语言。另外是,优秀的Java程序员的薪资更是随着时间递增!那么,Java三大框架是哪几个呢?

一.Struts框架

Struts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。

流程:服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。

架构:Struts对Model,View和Controller都提供了对应的组件。ActionServlet,这个类是Struts的核心控制器,负责拦截来自用户的请求。

二.Spring框架

Spring是一个解决了许多在J2EE开发中常见的的问题的强大框架。Springle提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类变成的好习惯。Spring的架构基础是基于使用JavaBean属性的InversionofControl容器。然而Spring在使用IoC容器作为构建玩关注所有架构层层的完整解决方案方面是独一无二的。Spring提供了唯一的数据管理抽象包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/Rmapping解决方案。

三.Hibernate框架

Hibernate是一个开源代码的对象关系映射框架,对JDBC惊醒了费城轻量级的的对象封装,使得Java程序员可以随心所欲的使用对象变成思维来操作数据库。Hebernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用最具革命意义的事,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任!

Java的这三大框架各有自己的优缺点,也就意味着是运用在不同的情况下,而不同的企业所要求使用的架构也都不相同。所以,掌握好全面的Java知识点尤为重要!

      以上就是“www.javaxue.com”Java培训机构小编介绍的“Java三大框架实战视频教程:小白必知基础”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

展开阅读
java学习网
回答:苍乐池

13小时17分钟前补充回答

Java实现简单的RPC框架的示例代码

Java实现RPC框架

一、RPC简介

RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现方式。如RMI(远程方法调用)、Hessian、Http invoker等。另外,RPC是与语言无关的。

rpc框架做的最重要的一件事情就是封装,调用者和被调用者的通讯细节,客户端代理负责向调用方法的方法名参数返回值包等信息根据通信协议组织成报文发送给服务端,服务端解析报文,根据客户端传递的信息执行对应的方法,然后将返回值安装协议组织成报文发送给客户端,客户端再解析出来。

RPC示意图

如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回。但从后续调用可以看出Computer1调用的是Computer2中的sayHi()方法,RPC屏蔽了底层的实现细节,让调用者无需关注网络通信,数据传输等细节。

二、RPC框架的实现

上面介绍了RPC的核心原理:RPC能够让本地应用简单、高效地调用服务器中的过程(服务)。它主要应用在分布式系统。如Hadoop中的IPC组件。但怎样实现一个RPC框架呢?

从下面几个方面思考,仅供参考:

1.通信模型:假设通信的为A机器与B机器,A与B之间有通信模型,在Java中一般基于BIO或NIO;。

2.过程(服务)定位:使用给定的通信方式,与确定IP与端口及方法名称确定具体的过程或方法;

3.远程代理对象:本地调用的方法(服务)其实是远程方法的本地代理,因此可能需要一个远程代理对象,对于Java而言,远程代理对象可以使用Java的动态对象实现,封装了调用远程方法调用;

4.序列化,将对象名称、方法名称、参数等对象信息进行网络传输需要转换成二进制传输,这里可能需要不同的序列化技术方案。如:protobuf,Arvo等。

三、Java实现RPC框架

1、实现技术方案

下面使用比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化。

2、RPC框架架构

RPC架构分为三部分:

1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。

2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。

3)服务消费者,运行在客户端,通过远程代理对象调用远程服务。

3、 具体实现

服务提供者接口定义与实现,代码如下:

public interface HelloService { 

  String sayHi(String name); 

} 

HelloServices接口实现类:

public class HelloServiceImpl implements HelloService { 

  public String sayHi(String name) {

    return "Hi, " + name;

  } 
} 

服务中心代码实现,代码如下:

public interface Server {

  public void stop(); 

  public void start() throws IOException; 

  public void register(Class serviceInterface, Class impl);

  public boolean isRunning(); 

  public int getPort();

} 

服务中心实现类:

public class ServiceCenter implements Server {

  private static ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

 

  private static final HashMap<String, Class> serviceRegistry = new HashMap<String, Class>();

 

  private static boolean isRunning = false;

 

  private static int port;

 

  public ServiceCenter(int port) {

    this.port = port;

  }

 

  public void stop() {

    isRunning = false;

    executor.shutdown();

  }

 

  public void start() throws IOException {

    ServerSocket server = new ServerSocket();

    server.bind(new InetSocketAddress(port));

    System.out.println("start server");

    try {

      while (true) {

        // 1.监听客户端的TCP连接,接到TCP连接后将其封装成task,由线程池执行

        executor.execute(new ServiceTask(server.accept()));

      }

    } finally {

      server.close();

    }

  }

 

  public void register(Class serviceInterface, Class impl) {

    serviceRegistry.put(serviceInterface.getName(), impl);

  }

 

  public boolean isRunning() {

    return isRunning;

  }

 

  public int getPort() {

    return port;

  }

 

  private static class ServiceTask implements Runnable {

    Socket clent = null;

 

    public ServiceTask(Socket client) {

      this.clent = client;

    }

 

    public void run() {

      ObjectInputStream input = null;

      ObjectOutputStream output = null;

      try {

        // 2.将客户端发送的码流反序列化成对象,反射调用服务实现者,获取执行结果

        input = new ObjectInputStream(clent.getInputStream());

        String serviceName = input.readUTF();

        String methodName = input.readUTF();

        Class<?>[] parameterTypes = (Class<?>[]) input.readObject();

        Object[] arguments = (Object[]) input.readObject();

        Class serviceClass = serviceRegistry.get(serviceName);

        if (serviceClass == null) {

          throw new ClassNotFoundException(serviceName + " not found");

        }

        Method method = serviceClass.getMethod(methodName, parameterTypes);

        Object result = method.invoke(serviceClass.newInstance(), arguments);

 

        // 3.将执行结果反序列化,通过socket发送给客户端

        output = new ObjectOutputStream(clent.getOutputStream());

        output.writeObject(result);

      } catch (Exception e) {

        e.printStackTrace();

      } finally {

        if (output != null) {

          try {

            output.close();

          } catch (IOException e) {

            e.printStackTrace();

          }

        }

        if (input != null) {

          try {

            input.close();

          } catch (IOException e) {

            e.printStackTrace();

          }

        }

        if (clent != null) {

          try {

            clent.close();

          } catch (IOException e) {

            e.printStackTrace();

          }

        }

      }

 

    }

  }

} 

客户端的远程代理对象:

public class RPCClient<T> {

  public static <T> T getRemoteProxyObj(final Class<?> serviceInterface, final InetSocketAddress addr) {

    // 1.将本地的接口调用转换成JDK的动态代理,在动态代理中实现接口的远程调用

    return (T) Proxy.newProxyInstance(serviceInterface.getClassLoader(), new Class<?>[]{serviceInterface},

        new InvocationHandler() {

          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

            Socket socket = null;

            ObjectOutputStream output = null;

            ObjectInputStream input = null;

            try {

              // 2.创建Socket客户端,根据指定地址连接远程服务提供者

              socket = new Socket();

              socket.connect(addr);

 

              // 3.将远程服务调用所需的接口类、方法名、参数列表等编码后发送给服务提供者

              output = new ObjectOutputStream(socket.getOutputStream());

              output.writeUTF(serviceInterface.getName());

              output.writeUTF(method.getName());

              output.writeObject(method.getParameterTypes());

              output.writeObject(args);

 

              // 4.同步阻塞等待服务器返回应答,获取应答后返回

              input = new ObjectInputStream(socket.getInputStream());

              return input.readObject();

            } finally {

              if (socket != null) socket.close();

              if (output != null) output.close();

              if (input != null) input.close();

            }

          }

        });

  }

} 

最后为测试类:

public class RPCTest { 

  public static void main(String[] args) throws IOException {

    new Thread(new Runnable() {

      public void run() {

        try {

          Server serviceServer = new ServiceCenter(8088);

          serviceServer.register(HelloService.class, HelloServiceImpl.class);

          serviceServer.start();

        } catch (IOException e) {

          e.printStackTrace();

        }

      }

    }).start();

    HelloService service = RPCClient.getRemoteProxyObj(HelloService.class, new InetSocketAddress("localhost", 8088));

    System.out.println(service.sayHi("test"));

  }

} 

运行结果:

regeist service HelloService

start server

Hi, test 

四、总结

RPC本质为消息处理模型,RPC屏蔽了底层不同主机间的通信细节,让进程调用远程的服务就像是本地的服务一样。

五、可以改进的地方

这里实现的简单RPC框架是使用Java语言开发,与Java语言高度耦合,并且通信方式采用的Socket是基于BIO实现的,IO效率不高,还有Java原生的序列化机制占内存太多,运行效率也不高。可以考虑从下面几种方法改进。

1.可以采用基于JSON数据传输的RPC框架;

2.可以使用NIO或直接使用Netty替代BIO实现;

3.使用开源的序列化机制,如Hadoop Avro与Google protobuf等;

4.服务注册可以使用Zookeeper进行管理,能够让应用更加稳定。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持java学习网。

展开阅读

相关问题

更多回答

回答:阚三姗 23小时48分钟前编辑补充

2020年都在学习的Java ssh框架教程

2020年都在学习的Java ssh框架教程: Java框架一直以来都是面试必备的知识点,而掌握Java框架,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能对当前正在开发中的系统有整体的认知,从而更好的熟悉和学习技术,这篇文章胖达就打算给大家介绍几款现阶段流行的框架组合,不管是在传统企业开发还是在互联网开发领域,这几种框架应该都是比较常用的。 SSH框架组合主要包括Struts 、Spring、Hibernate三大框架,用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,同时用Spring来管理Struts和Hibernate,框架具体解释如下: Struts框架 Struts框架是一个基于……

回答:辛迎秋 20小时22分钟前编辑补充

Java开发SSM框架微信退款的实现

Java 微信退款: 这篇文章是Java微信退款的教程,退款之前用户需要先进行支付,支付之后才可以使用退款。做到退款的同学应该已经是完成了支付了,我写的退款和支付的流程很相似只是所需的参数有所不同。 String outTradeNo = request.getParameter("outTradeNo");// 获取商户订单号 Integer totalFee = Integer.parseInt(request.getParameter("totalFee"));// 获取支付金额 MapString, String getMap = new HashMapString, String(); // 获得当前目录 String path = request.getSession().getServletContext().getRealPath("/"); Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");// 可以方便地修改日期格式 String outRefundNo = "NO" + dateFormat.format(now); 提供的参数有订单号这个是支付……

回答:连俊贤 11小时9分钟前编辑补充

最流行的java web框架有哪些?

最流行的java web框架有哪些?: Java是开源的,框架很多,这些框架都能解决特定的问题,提高开发效率、简化我们的代码复杂度,现在除了很多大家通用的一些主流框架外,很多公司针对自己的业务会自定义一些公司内部的框架,当然作为学习者我们首先要清楚 最流行的java web框架有哪些 ? 回答这个问题首先要看我们的项目规模,对于”体量”较小的单应用项目,和需要处理海量数据、高并发的分布式项目所学习使用的框架还是不同的。 对于“体量”较小的单应用项目: ORM型框架,很多Javaweb程序都需要使用关系数据库来进行数据的持久化,所以对于这种需要进行数据库操作的框架,也就是对JDBC进行封装的ORM框架是需要学习的,……

回答:焦曼妮 19小时26分钟前编辑补充

今年流行的Java框架你学习了吗

今年流行的Java框架你学习了吗: 一.springmvc框架 简介:SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。 优点: 1.调理清晰,控制器(controller)、验证器(validator)、命令对象(commandobect)、表单对象(formobject)、模型对象(modelobject)、Servlet分发器(DispatcherServlet)、处理器映射(handlermapping)、试图解析器(viewresoler)等等,让你学习时能层次分明。 2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要; 3、由于命令对象就是一个PO……