写点什么

学会这 12 个 Java 开发框架轻松拿到 30K+

用户头像
北游学Java
关注
发布于: 2021 年 05 月 16 日

前言

Java 程序员方向太多,且不说移动开发、大数据、区块链、人工智能这些,大部分 Java 程序员都是 Java Web/后端开发。


那作为一名 Java Web 开发程序员必须需要熟悉哪些框架呢?


今天,北游给大家讲解一下这 15 个通用的、必须掌握的框架,学会这些,多的不说,拿不到 30K 你把我头锤烂!


同时也给大家整理了一些不错的资料,需要的话直接点击领取就好了



欢迎关注我的专栏一头扎进Java,这个专栏会持续更新 Java 学习干货,期待一起成长!


好了,话不多说,坐稳扶好,发车喽!

一、Spring 系列

这个不用多说吧,毫无疑问,Spring 框架现在是 Java 后端框架家族里面最强大的一个,其拥有 IOC 和 AOP 两大利器,大大简化了软件开发复杂性。并且,Spring 现在能与所有主流开发框架集成,可谓是一个万能框架,Spring 让 JAVA 开发变得更多简单


Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。



组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

核心容器

核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文:

Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO

JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

Spring ORM

Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

Spring Web 模块

Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC 框架

MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

实例化 spring 容器

2.1,新建一个 web 项目 spring-demo


2.2,导入 spring 核心包


2.3,将 applicationContext.xml 文件导入 src 下,新建一个包 com.spring.demo


2.4,导入 JUnit,项目右键点击 properties---->java build path---->Libraries----->add library----->Junit4--->next--->finish


2.5,新建一个 Junit Test Case 类,


2.6,实例化容器,获取 applicationContext 配置文件地址,创建 ApplicationContext 对象传入获取的配置地址,控制台打印出实例化容器信息


2.7,控制台打印出信息下面信息说明容器实例化成功


org.springframework.context.support.ClassPathXmlApplicationContext@3c1d332b: startup date [Wed Nov 09 16:23:19 CST 2016]; root of context hierarchy
复制代码

利用 Spring 容器创建 javaBean 对象

1,用构造器实例化

<beanid="calendarObj1"class="java.util.GregorianCalendar"></bean>
复制代码


1.2)TestCase 调用 getBean 获取配置文件 bean,创建 bean**对象实例


Calendar cr = ac.getBean("calendarObj1",Calendar.class);
复制代码


看控制台信息实例化成功


calendarObj1:java.util.GregorianCalendar[time=1478679801551,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=314,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=23,SECOND=21,MILLISECOND=551,ZONE_OFFSET=28800000,DST_OFFSET=0]

2,使用静态工厂方法实例化

2.1) 在配置文件添加


<bean id="calendarObj2" class="java.util.GregorianCalendar" factory-method="getInstance"></bean>*
复制代码


2.2) 在 TestCase 测试类 test 方法中添加


Calendar cr2 = ac.getBean("calendarObj2",Calendar.class);
System.out.println("calendarObj2:"+cr2);
复制代码


2.3**看控制台


calendarObj2:java.util.GregorianCalendar[time=1478679801586,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=314,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=23,SECOND=21,MILLISECOND=586,ZONE_OFFSET=28800000,DST_OFFSET=0]


实例化成功

3,实例工厂实例化

3.1)在 applicationContext.xml 配置文件中添加


<!-- 实例工厂实例化 -->        <bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>        <bean id="dateObj" factory-bean="calendarObj3" factory-method="getTime"></bean>
复制代码


3.2)在测试类 test 方法增加


Date date = ac.getBean("dateObj",Date.class);
System.out.println("calendarObj3:"+date);
复制代码


3.3 junit 测试,控制输出


calendarObj3:Wed Nov 09 16:23:21 CST 2016


实例化成功

容器的 IOC 应用

4.1)Set 注入

通过调用无參构造器或者无参静态工厂方法实例化 bean 之后调用该 bean 的 set 方法,即可实现 set 方式注入


4.1.1)在配置文件添加


<!-- 数据源setter注入 --><bean id="dataSource" class="com.spring.dao.JDBCDataSource"><property name="driver" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"></property><property name="username" value="root"></property><property name="password" value="">123456</property></bean>
复制代码


4.1.2)写 JDBCDataSource 类,这个类封装了管理数据库连接的方法 getConnection(),在这个方法执行前需要数据库连接参数:数据库驱动,连接 URL,用户名和密码,下面是 JDBCDataSource 代码


package com.spring.dao;
import java.io.Serializable;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;
public class JDBCDataSource implements Serializable{ private static final long serialVersionUID = 1L; private String driver; private String url; private String username; private String password; public String getDriver() { return driver; } public void setDriver(String driver) { try{ Class.forName(driver); this.driver = driver; }catch(Exception e){ throw new RuntimeException(e); } } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public static long getSerialversionuid() { return serialVersionUID; } public Connection getConnection() throws SQLException{ Connection cn = DriverManager.getConnection(url,username,password); return cn; } public void close(Connection cn){ if(cn!=null){ try{ cn.close(); }catch(SQLException e){ e.printStackTrace(); } } }}
复制代码


4.1.3)利用 spring 实现 JDBCDataSource 对象的创建,再使用 set 注入方式将数据库参数注入给 JDBCDataSource,这样就可以正常的调用 getConnection()方法获得数据库连接了。


4.1.4)TestCase 测试连接方法


@Test    public void testJDBCDataSource() throws SQLException{        String conf = "applicationContext.xml";        ApplicationContext ac = new ClassPathXmlApplicationContext(conf);        JDBCDataSource jds = ac.getBean("dataSource",JDBCDataSource.class);        Connection cn = jds.getConnection();        System.out.println(cn);    }
复制代码


4.1.5)控制台输出


com.mysql.jdbc.JDBC4Connection@1a7244ca


说明已经获得数据库连接了

4.2)利用构造器参数实现依赖属性的注入

4.2.1)先建一个 user 表


CREATE TABLE `user` (  `id` int(18) NOT NULL AUTO_INCREMENT,  `name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,  `phone` varchar(20) DEFAULT NULL,  `password` varchar(50) CHARACTER SET utf8 DEFAULT NULL,  `gender` varchar(10) CHARACTER SET utf8 DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
复制代码


4.2.2)创建 user 实体类


package com.spring.entity;
public class User { private String id; private String name; private String phone; private String password; private String gender; public User(String id, String name, String phone, String password, String gender) { super(); this.id = id; this.name = name; this.phone = phone; this.password = password; this.gender = gender; } public User() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", phone=" + phone + ", password=" + password + ", gender=" + gender + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((gender == null) ? 0 : gender.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); result = prime * result + ((phone == null) ? 0 : phone.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (gender == null) { if (other.gender != null) return false; } else if (!gender.equals(other.gender)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; if (phone == null) { if (other.phone != null) return false; } else if (!phone.equals(other.phone)) return false; return true; }
}
复制代码


4.2.3)创建接口 UserDao,写一个通过用户名查询用户的方法 findUserByName(String name)


package com.spring.dao;
import com.spring.entity.User;
public interface UserDao { public User findUserByName(String name);}
复制代码


4.2.4)创建 MySqlUserDao 实现 UserDao,


package com.spring.dao;
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;
import com.spring.entity.User;
public class MysqlUserDao implements UserDao{ private JDBCDataSource dataSource; public JDBCDataSource getDataSource() { return dataSource; } public void setDataSource(JDBCDataSource dataSource) { this.dataSource = dataSource; } public MysqlUserDao(JDBCDataSource dataSource) { super(); this.dataSource = dataSource; } @Override public User findUserByName(String name) { // TODO Auto-generated method stub System.out.println("-----------查询用户信息-------------"); String sql = "select * from user where name = ?"; Connection con = null; try{ String url = dataSource.getUrl(); System.out.println(url); con = dataSource.getConnection(); PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, name); ResultSet rs = ps.executeQuery(); User user = null; while(rs.next()){ user = new User(); user.setId(rs.getString("id")); user.setName(rs.getString("name")); user.setGender(rs.getString("gender")); user.setPassword(rs.getString("password")); user.setPhone(rs.getString("phone")); } rs.close(); ps.close(); return user; }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); }finally{ dataSource.close(con); } }
}
复制代码


4.2.5)Spring 支持利用构造器注入参数实例化 bean 方式,只要在配置文件增加构造器参数 constructor-arg,Spring 就会自动的调用有参的构造器创建 bean 对象实例。


<bean id="userDao" class="com.spring.dao.MysqlUserDao">            <constructor-arg index="0" ref="dataSource"></constructor-arg>        </bean>
复制代码


4.2.6)在测试类写个 testFindUserByName 方法


@Test    public void testFindUserByName(){        String con = "applicationContext.xml";        ApplicationContext ac = new  ClassPathXmlApplicationContext(con);        UserDao userDao = ac.getBean("userDao",UserDao.class);        User user = userDao.findUserByName("lisi");        System.out.println(user);            }
复制代码


4.2.7)控制台正确输出用户信息说明构造器注入成功


User [id=2, name=lisi, phone=110, password=321654, gender=1]


4.2.8)失败可能没在 mysqluserdao 增加有参构造器

4.3.利用自动装配实现自动属性注入

4.3.1)创建一个 UserLoginService 类,写一个登录方法 login(),该方法依赖 finfUserByName()方法


package com.spring.service;
import com.spring.dao.UserDao;import com.spring.entity.User;
public class UserLoginService { private UserDao userDao;
public UserDao getUserDao() { return userDao; }

public void setUserDao(UserDao userDao) { this.userDao = userDao; } public User login(String name,String password){ try{ User user = userDao.findUserByName(name); if(user.getPassword().equals(password)){ return user; } return null; }catch(Exception e){ e.printStackTrace(); return null; } }}
复制代码


4.3.2)autowire 属性有四种方式默认是 no,(1).byName(2)byType,(3)constuctor,(4)autodetect,



4.3.3)修改配置文件,添加配置


<!-- 自动装配 -->         <bean id="userLoginService" class="com.spring.service.UserLoginService" autowire="byName"></bean> 
复制代码


4.3.4)写测试方法 testUserLogin()


@Test    public void testUserLogin(){        String con = "applicationContext.xml";        ApplicationContext ac = new ClassPathXmlApplicationContext(con);        UserLoginService us = ac.getBean("userLoginService",UserLoginService.class);        User user = us.login("lisi", "321654");        System.out.println(user);    }
复制代码


4.3.5)控制台输出


User [id=2, name=lisi, phone=110, password=321654, gender=1]


自动装配说明成功




由于篇幅所限后面提到的一些框架我就不一一展开讲了,给大家贴一下官网地址和源码地址,自己弄不明白的朋友可以进群领取一下相应框架学习笔记。

二、Mybatis/ iBatis

iBatis 曾是开源软件组 Apache 推出的一种轻量级的对象关系映射持久层(ORM)框架,随着开发团队转投 Google Code 旗下,ibatis 3.x 正式更名为 Mybatis,即:iBatis 2.x, MyBatis 3.x。


官网:


http://www.mybatis.org/mybatis-3/


源码:


https://github.com/mybatis

三、Hibernate

Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 orm 框架。Hibernate 可以自动生成 SQL 语句,自动执行,使得 Java 程序员可以随心所欲的使用对象编程思维来操作数据库。


官网:


http://hibernate.org/


源码:


https://github.com/hibernate

四、Dubbo

Dubbo 是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。


官网:


http://dubbo.apache.org


源码:


https://github.com/apache/incubator-dubbo

五、Netty

Netty 是由 JBOSS 提供的一个开源的、异步的、基于事件驱动的网络通信框架,用 Netty 可以快速开发高性能、高可靠性的网络服务器和客户端程序,Netty 简化了网络应用的编程开发过程,使开发网络编程变得异常简单。


官网:


https://netty.io/


源码:


https://github.com/netty/netty

六、Shiro

Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。


官网:


http://shiro.apache.org/


源码:


https://github.com/apache/shiro

七、Ehcache

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。它使用的是 JVM 的堆内存,超过内存可以设置缓存到磁盘,企业版的可以使用 JVM 堆外的物理内存。


官网:


http://www.ehcache.org/


源码:


https://github.com/ehcache/ehcache3

八、Quartz

Quartz 是一个基于 Java 的广泛使用的开源的任务调度框架,做过定时任务的没有没用过这个框架的吧?


官网:


http://www.quartz-scheduler.org/


源码:


https://github.com/quartz-scheduler/quartz

九、Velocity

Velocity 是一个基于 Java 的模板引擎,简单而强大的模板语言为各种 Web 框架提供模板服务,来适配 MVC 模型。


官网:


http://velocity.apache.org/


源码:


https://github.com/apache/velocity-engine

十、jQuery

jQuery 是一个快速、简洁的 JavaScript 框架,它封装 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计模式,极大地简化了 JavaScript 编程。


虽然好久没做 Web 开发了,但哥也不曾忘记,也还记得一些常用的写法,如:


$("#wx").html("javastack");
复制代码


官网:


http://jquery.com/


源码:


http://jquery.com/download/

十一、JUnit

JUnit 是一个 Java 语言的单元测试框架,绝大多数 Java 的开发环境都已经集成了 JUnit 作为其单元测试的工具。


官网:


https://junit.org


源码:


https://github.com/junit-team/

十二、Log4j

Log4j 是 Apache 的一个开源日志框架,通过 Log4j 我们可以将程序中的日志信息输出到控制台、文件等来记录日志。作为一个最老牌的日志框架,它现在的主流版本是 Log4j2。Log4j2 是重新架构的一款日志框架,抛弃了之前 Log4j 的不足,以及吸取了优秀日志框架 Logback 的设计。


官网:


https://logging.apache.org/log4j/2.x/


源码:


https://logging.apache.org/log4j/2.x/source-repository.html




好了,写到这里就差不多了,这些框架你都会用吗?


不是吧,都看到这里了也不点个赞加个关注吗各位看官老爷?


往期热文



end

发布于: 2021 年 05 月 16 日阅读数: 1129
用户头像

北游学Java

关注

进群1044279583分享学习经验和分享面试心得 2020.11.16 加入

我秃了,也变强了

评论

发布
暂无评论
学会这12个Java开发框架轻松拿到30K+