Java 程序員方向太多,且不說移動開發、大數據、區塊鏈、人工智能這些,大部分 Java 程序員都是 Java Web/後端開發。html
那做爲一名 Java Web 開發程序員必須須要熟悉哪些框架呢?前端
今天,北遊給你們講解一下這15個通用的、必須掌握的框架,學會這些,多的不說,拿不到30K你把我頭錘爛!java
同時也給你們整理了一些不錯的資料,須要的話直接點擊領取就行了mysql
歡迎關注個人專欄一頭扎進Java,這個專欄會持續更新Java學習乾貨,期待一塊兒成長!jquery
好了,話很少說,坐穩扶好,發車嘍!git
這個不用多說吧,毫無疑問,Spring 框架如今是 Java 後端框架家族裏面最強大的一個,其擁有 IOC 和 AOP 兩大利器,大大簡化了軟件開發複雜性。而且,Spring 如今能與全部主流開發框架集成,可謂是一個萬能框架,Spring 讓 JAVA 開發變得更多簡單程序員
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在覈心容器之上,核心容器定義了建立、配置和管理 bean 的方式,如圖 1所示。github
組成 Spring 框架的每一個模塊(或組件)均可以單獨存在,或者與其餘一個或多個模塊聯合實現。每一個模塊的功能以下:web
核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。面試
Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
經過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。因此,能夠很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。經過使用 Spring AOP,不用依賴 EJB 組件,就能夠將聲明性事務管理集成到應用程序中。
JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,而且極大地下降了須要編寫的異常代碼數量(例如打開和關閉鏈接)。Spring DAO 的面向 JDBC 的異常聽從通用的 DAO 異常層次結構。
Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部這些都聽從 Spring 的通用事務和 DAO 異常層次結構。
Web 上下文模塊創建在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。因此,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。經過策略接口,MVC 框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
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
<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.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.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
實例化成功
經過調用無參構造器或者無參靜態工廠方法實例化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.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.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]
自動裝配說明成功
因爲篇幅所限後面提到的一些框架我就不一一展開講了,給你們貼一下官網地址和源碼地址,本身弄不明白的朋友能夠進羣領取一下相應框架學習筆記。
iBatis 曾是開源軟件組 Apache 推出的一種輕量級的對象關係映射持久層(ORM)框架,隨着開發團隊轉投Google Code 旗下,ibatis 3.x 正式改名爲 Mybatis,即:iBatis 2.x, MyBatis 3.x。
官網:
源碼:
Hibernate 是一個開放源代碼的對象關係映射框架,它對 JDBC 進行了很是輕量級的對象封裝,它將 POJO 與數據庫表創建映射關係,是一個全自動的 orm 框架。Hibernate 能夠自動生成 SQL 語句,自動執行,使得 Java 程序員能夠爲所欲爲的使用對象編程思惟來操做數據庫。
官網:
源碼:
Dubbo是阿里巴巴開源的基於 Java 的高性能 RPC 分佈式服務框架,現已成爲 Apache 基金會孵化項目。使用 Dubbo 能夠將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,可用於提升業務複用靈活擴展,使前端應用能更快速的響應多變的市場需求。
官網:
源碼:
Netty 是由 JBOSS 提供的一個開源的、異步的、基於事件驅動的網絡通訊框架,用 Netty 能夠快速開發高性能、高可靠性的網絡服務器和客戶端程序,Netty 簡化了網絡應用的編程開發過程,使開發網絡編程變得異常簡單。
官網:
源碼:
Apache Shiro是一個強大而靈活的開源安全框架,它乾淨利落地處理身份認證,受權,企業會話管理和加密。
官網:
源碼:
EhCache 是一個純Java的進程內緩存框架,具備快速、精幹等特色,是 Hibernate 中默認的CacheProvider。它使用的是 JVM 的堆內存,超過內存能夠設置緩存到磁盤,企業版的可使用 JVM 堆外的物理內存。
官網:
源碼:
Quartz 是一個基於 Java 的普遍使用的開源的任務調度框架,作過定時任務的沒有沒用過這個框架的吧?
官網:
源碼:
Velocity 是一個基於 Java 的模板引擎,簡單而強大的模板語言爲各類 Web 框架提供模板服務,來適配 MVC 模型。
官網:
源碼:
jQuery是一個快速、簡潔的 JavaScript 框架,它封裝 JavaScript 經常使用的功能代碼,提供一種簡便的 JavaScript 設計模式,極大地簡化了 JavaScript 編程。
雖然很久沒作 Web 開發了,但哥也未曾忘記,也還記得一些經常使用的寫法,如:
$("#wx").html("javastack");
官網:
源碼:
JUnit 是一個 Java 語言的單元測試框架,絕大多數 Java 的開發環境都已經集成了 JUnit 做爲其單元測試的工具。
官網:
源碼:
Log4j 是 Apache 的一個開源日誌框架,經過 Log4j 咱們能夠將程序中的日誌信息輸出到控制檯、文件等來記錄日誌。做爲一個最老牌的日誌框架,它如今的主流版本是 Log4j2。Log4j2是從新架構的一款日誌框架,拋棄了以前 Log4j 的不足,以及吸收了優秀日誌框架 Logback 的設計。
官網:
源碼:
好了,寫到這裏就差很少了,這些框架你都會用嗎?
不是吧,都看到這裏了也不點個贊加個關注嗎各位看官老爺?
往期熱文:
end