简述基于JavaEE企业级开发技术(Spring)(1)
一、緒論
1、學(xué)習(xí)內(nèi)容
- javaEE企業(yè)開發(fā)技術(shù)概述
- javaEE容器——Spring
- ORM數(shù)據(jù)層——MyBatis/JPA
- Web層——Spring MVC
- 展現(xiàn)層——JSP/Thymeleaf
- 整合框架——SSM/SSH
- 用戶模塊分析
- 用戶模塊+功能模塊設(shè)計
前端框架:Bootstrap,NodeJS,Vue/React/Angular
2、WEB端開發(fā)發(fā)展歷程(java)
- CGI——每次請求產(chǎn)生一個進程,重量級。
- Servlet——每次請求產(chǎn)生一個線程,輕量級。
控制邏輯、頁面表現(xiàn)、業(yè)務(wù)邏輯全部混在一起,前端設(shè)計無法介入
- JSP——編譯成Servlet,在HTML中嵌入java代碼。前端開發(fā)人員可以進行較獨立的設(shè)計和修改
- Model1——JSP+Bean
業(yè)務(wù)java代碼封裝到bean中
通過<jsp:useBean >標簽獲取/創(chuàng)建javabean
JSP負責(zé)頁面表現(xiàn)和控制邏輯
Javabean負責(zé)業(yè)務(wù)邏輯 - Model2——Web MVC
M——Model,模型(業(yè)務(wù)模型),即Web應(yīng)用中的數(shù)據(jù)及對數(shù)據(jù)的處理,頁面要顯示的數(shù)據(jù),頁面要提交的數(shù)據(jù),實體數(shù)據(jù)。還包括對數(shù)據(jù)的管理和維護。可進一步分層
V——View,視圖,即web頁面,對模型的展現(xiàn)
C——Controller,控制邏輯,接收用戶請求轉(zhuǎn)發(fā)給相應(yīng)的模型進行處理,把模型處理結(jié)果返回給對應(yīng)的視圖進行展現(xiàn)。
3、JavaEE應(yīng)用的特點
JavaEE是一套使用Java進行企業(yè)級Web應(yīng)用開發(fā)的大家一致遵循的工業(yè)標準。
4、開發(fā)平臺與工具包
- IntelliJ IDEA(Ultimate 教育版)
- Apache Tomcat8
- Mysql5.7
- Spring5
- MyBatis3.5
- JPA/Hibernate5
5、基于maven的java項目開發(fā)管理
- JDK8——Java運行環(huán)境
- IDEA (Eclipse EE)——集成開發(fā)環(huán)境
- Maven3——Java項目構(gòu)建工具
- GIT/gitee——源代碼管理工具
- Jenkins——持續(xù)集成工具(CI)
6、Maven開發(fā)配置(IDEA)
- (1)下載apache-maven,解壓后放D:\software\maven
- (2)本地maven倉庫:新建目錄D:\software\maven\repo
- (3)Maven配置:修改D:\software\maven\conf\settings.xml
修改maven配置中的localRepository和mirror,如下:(不要放在xml的注釋中!)
以上是windows,若為mac:
<localRepository>/usr/local/repo</localRepository> <mirror><id>ali</id><mirrorOf>*</mirrorOf><name>ali maven repo</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> <mirror><id>maven-default-http-blocker</id><mirrorOf>external:http:*</mirrorOf><name>Pseudo repository to mirror external repositories initially using HTTP.</name><url>http://0.0.0.0/</url><blocked>true</blocked> </mirror>- (4)配置IDEA的maven設(shè)置:點擊File->Settings菜單,搜maven
- (5)在IDEA中創(chuàng)建maven項目:File->New->project,選擇maven
- (6)項目信息完善,maven選擇
- (7)功能開發(fā)
添加依賴:在pom中添加dependency元素即可,輸入artifactId自動聯(lián)想完成添加
二、Spring概述
1、Spring簡介
Spring是什么:
- 一個復(fù)雜而又簡潔的javabean工廠
- Spring是一種輕量級的、非侵入式的Java/JavaEE應(yīng)用框架
- 管理bean的創(chuàng)建和管理bean 的依賴
Spring優(yōu)點:
- Spring的DI容器,提高組件之間的解耦
- SpringAOP提供通用任務(wù)的集中統(tǒng)一處理(安全、事務(wù)、日志等),實現(xiàn)更好的代碼復(fù)用
2、IOC與DI
由容器來管理對象之間的依賴關(guān)系(而不是對象本身來管理),就叫“控制反轉(zhuǎn)”或“依賴注入”
Bean容器框架的基本思想就是IOC/DI
IOC(Inversion of Control):由容器來負責(zé)控制對象的生命周期和對象間的關(guān)系(一種減少類與類之間依賴的設(shè)計原則)
DI(Dependency Injection):在系統(tǒng)運行中,由容器動態(tài)的向某個對象提供它所需要的其他對象
Spring就是一個IOC容器
IOC與DI,說的是一回事,但DI這個名詞更能表達這種設(shè)計模式的思想
3、DI的兩種方式
(1)設(shè)值注入
IOC容器使用屬性的setter方法來注入被依賴的實例
<property name=“userDao” ref=“userDao”/>
(2)構(gòu)造注入
IOC容器使用構(gòu)造器來注入被依賴的實例
<constructor-arg ref=“db”/>
用index屬性指定順序,從0開始
4、兩種注入方式對比
(1)設(shè)值注入的優(yōu)點:
- 對于復(fù)雜依賴關(guān)系,如采用構(gòu)造注入,導(dǎo)致構(gòu)造器過于臃腫,spring在創(chuàng)建bean對象的同時,要同時實例化其依賴的其他所有實例對象,導(dǎo)致性能下降
- 對于某些屬性可選的情況,多參數(shù)構(gòu)造器更加復(fù)雜。
(2)構(gòu)造注入的優(yōu)點
- 如果依賴對注入順序有要求,則可以在構(gòu)造器中決定依賴關(guān)系的注入順序
- 對依賴關(guān)系無須變化的bean
- 使用構(gòu)造注入,組件內(nèi)部的依賴關(guān)系對于組件調(diào)用者完全透明,更符合高內(nèi)聚原則。
設(shè)值注入為主,構(gòu)造注入為輔
三、Spring配置管理
1、XML
標記語言:
(1)Html(非嚴格,容錯)
(2)Xml(可擴展標記語言,嚴格定義,格式良好的)
2、Spring容器
org.springframework.beans.factory.BeanFactory是Spring IoC容器的實際代表者,IoC容器負責(zé)容納bean,并對bean進行管理。
使用XML作為配置元數(shù)據(jù)的描述格式,對那些我們希望通過Spring IoC容器管理的bean進行定義。
ApplicationContext是BeanFactory的擴展,功能得到了進一步增強,比如更易與Spring AOP集成、消息資源處理(國際化處理)、事件傳遞及各種不同應(yīng)用層的context實現(xiàn)(如針對web應(yīng)用的WebApplicationContext)。
ApplicationContext可利用 ContextLoader在 Web應(yīng)用啟動的時候 自動創(chuàng)建 (SSH整合的時候 就是采用這種方式 )
創(chuàng)建 ApplicationContext容器時 ,所有 singleton bean將會被 預(yù)初始化 。
3、Spring包依賴
4、Spring中bean的定義
(1)在beans下添加子元素bean
(2)設(shè)置id屬性:bean對象在容器中的唯一標識,通過這個id的值可以獲取到容器中對應(yīng)的bean對象
(3)設(shè)置class屬性:創(chuàng)建bean對象的類
5、配置依賴
各組件的相互引用實質(zhì)上就是依賴關(guān)系,可以通過Spring的IOC容器完成依賴注入。
(1)設(shè)值注入
在需要配置依賴的組件對應(yīng)的<bean>元素中配置<property>子元素,指定要注入的屬性的名字和值
(2)構(gòu)造注入
在需要配置依賴的組件對應(yīng)的<bean>元素中配置<constructor-arg>子元素,按構(gòu)造函數(shù)參數(shù)順序指定對應(yīng)要注入值
依賴關(guān)系的值可以是一個確定的常量,也可以是容器中其他bean的引用
通常對于普通屬性的值不納入配置管理,主要是配置bean實例之間的依賴關(guān)系
一般依賴配置分四種情況
(1)注入普通屬性
(2)注入bean引用
(3)注入嵌套bean
(4)注入集合類型值
(1)注入普通屬性
(2)注入bean引用(依賴)
(3)使用自動裝配注入bean引用
設(shè)定bean元素的autowire屬性
- no:(默認值)不使用 自動裝配,須顯示指定ref
- byName:根據(jù)名字自動裝配,在容器中找到id屬性與需要注入的屬性(setter方法的名字)同名的bean完成注入
- byType:根據(jù)類型匹配自動裝配
- constructor:與byType類似
- autodetect:根據(jù)bean內(nèi)部結(jié)構(gòu)決定用constuctor還是byType
(4)注入嵌套bean
在bean的property子元素中嵌套一個無id的bean元素
嵌套的bean將不被spring訪問。
(5)注入集合值
在property元素中使用<list><set><map><props>子元素分別這是List、Set、Map、Properties集合屬性值
6、創(chuàng)建Bean實例
<bean id="chinese" class="app.service.impl.Chinese"><property name="axe" ref="steelAxe"/> </bean> <bean id="steelAxe“ class="app.service.impl.SteelAxe"/> ApplicationContext ctx = newClassPathXmlApplicationContext("bean.xml"); Person p = (Person)ctx.getBean("chinese"); //Person p = ctx.getBean("chinese" , Person.class); p.useAxe();7、容器中Bean的作用域-scope
- singleton: 單例模式 ,在整個容器中只有一個實例
- prototype:原型模式 ,每次通過getBean獲取時產(chǎn)生一個新的實例。
- request:每次http請求產(chǎn)生一個新的實例(如action),web應(yīng)用。須在web.xml中配置相應(yīng)的Listener或filter
- Session:每次 http session產(chǎn)生一個新的實例 ,web應(yīng)用
- 默認為singleton
8、容器中bean的生命周期
生命周期:1.創(chuàng)建;2.使用;3.銷毀
prototype bean:每次請求產(chǎn)生一個新的實例,spring無法跟蹤其生命周期
singleton bean:單例對象,每次客戶請求都返回同一個共享實例,spring可以跟蹤其創(chuàng)建和銷毀,實現(xiàn)對其生命周期的管理
生命周期的管理時機:1.注入之后——init-method;2.銷毀之前——destroy-method
(1)依賴注入之后
必要資源的申請
在< bean>的配置中加入init-method屬性指定bean的全部屬性注入/設(shè)值成功后要執(zhí)行的方法
(2)Bean銷毀之前
占用資源的回收
在< bean>的配置中加入destroy-method屬性指定bean在銷毀之前要執(zhí)行的方法
(3)協(xié)調(diào)作用域不同步的bean
√ Singleton bean依賴Singleton bean
√ Prototype bean依賴Prototype bean
√ Prototype bean依賴Singleton bean
X Singleton bean依賴Prototype bean
不同步的根源: Singleton bean只被初始化一次,多次請求獲取同一個共享對象; Prototype bean每次請求都應(yīng)重新創(chuàng)建。
解決方案
放棄容器注入,singleton bean每次使用prototype bean時主動從服務(wù)器請求新的prototype bean。耦合了SpringAPI
利用方法注入:使用lookup方法注入
9、JavaEE中的設(shè)計模式
- 工廠模式
- 單例模式
- 代理模式(用戶代碼不直接調(diào)用目標對象的方法,通過代理對象調(diào)用)
- 靜態(tài)代理:定義實現(xiàn)代理類
- 動態(tài)代理:動態(tài)生成代理類
JDK反射與動態(tài)代理
CGLib動態(tài)代理
10、靜態(tài)代理(編碼實現(xiàn)代理對象)
11、JDK反射
通過類的簽名創(chuàng)建對象
通過方法的簽名調(diào)用方法
12、基于JDK的動態(tài)代理
13、基于cglib的動態(tài)代理
14、基于注解@簡化Springxml配置
目的:消滅Bean的xml配置(大幅減少)
做法:代碼標記,自動掃描
- 在Bean的定義文件中添加注解@
- 容器啟動時自動掃描 context:component-scan
15、基于注解自動掃描的配置
(1)context:component-scan
beans中引入context命名空間/XSD
配置< context:component-scan base-package=“….”/>
(2)Bean的配置:在類定義語句前注解
@Component (“beanName”):將注解類的對象加入容器,id為beanName。beanName缺省時為類名(首字母小寫)
- @Bean
- @Service
- @Repository
@Scope(“scope”):指定對象在容器中的作用域,無該注解時默認為singleton
(3)依賴的配置
- @Autowired:Spring的注解,在屬性定于語句或setter方法前注解,將容器中匹配的對象自動注入,默認是byType方式。如果需要采用byName方式,可以通過添加@Qulifier(“name”)的方式指定
- @Resource:JSR-250標準注解,與@Autowried類似,默認是byName方式。如果要采用byType方式可以添加type參數(shù),如@Resource(type=com.test.ExampleBean)
(4)值的注入(結(jié)合properties文件配置):
resource目錄下創(chuàng)建values.properties文件,填寫key-value
在spring配置文件中:<context:property-placeholder location="classpath:values.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>
@Value(“value”):在屬性定義語句前注解,給對應(yīng)屬性注入常量值
@Value(“${propKey:defaultValue}”):給屬性注入屬性文件文件中propKey對應(yīng)的值,如果propKey不存在,就注入defaultValue
(5)生命周期
@PostConstruct:在類的成員方法定義語句前注解,注解的方法將會在對象完成構(gòu)造且依賴注入完成后被自動調(diào)用?對象初始化的鉤子函數(shù)
@PreDestroy:在類的成員定于語句前注解,注解的方法將在bean對象銷毀之前被自動調(diào)用?對象銷毀的鉤子函數(shù)
16、Java日志配置
擁抱log4j,拋棄System.out.println
(1)在resources目錄下新建log4j.properties
(2)在pom.xml中添加依賴包
(3)為類添加logger靜態(tài)屬性
(4)在方法中用logger輸出日志
- logger.debug
- logger.info
- logger.warn
- logger.error
- logger.fetal
log4j.properties:
17、Spring測試
JUnit:Java語言的單元測試框架
默認添加到生成的模板項目中:版本改到4.12以上
在任意方法前加@Test注解都可測試。實際應(yīng)用中測試用例與項目代碼完全分離,一般scope限定為test
在test/java下的包中添加測試類,在測試方法前添加@Test注解
18、Spring測試(測試容器中的bean)
在pom中添加sprint-test依賴
測試類前添加注解@RunWith和@ContextConfiguration
可以通過@Resource給測試類注入容器中的bean
如果采用注解開發(fā)的方式:
總結(jié)
以上是生活随笔為你收集整理的简述基于JavaEE企业级开发技术(Spring)(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Xamarin实现跨平台移动应用开发
- 下一篇: Bugzilla系统使用规范