简述基于JavaEE企业级开发技术(Spring)

news2024/11/18 12:21:45

一、绪论

1、学习内容

  • javaEE企业开发技术概述
  • javaEE容器——Spring
  • ORM数据层——MyBatis/JPA
  • Web层——Spring MVC
  • 展现层——JSP/Thymeleaf
  • 整合框架——SSM/SSH
  • 用户模块分析
  • 用户模块+功能模块设计

前端框架:Bootstrap,NodeJS,Vue/React/Angular

2、WEB端开发发展历程(java)

  • CGI——每次请求产生一个进程,重量级。
  • Servlet——每次请求产生一个线程,轻量级。

控制逻辑、页面表现、业务逻辑全部混在一起,前端设计无法介入

  • JSP——编译成Servlet,在HTML中嵌入java代码。前端开发人员可以进行较独立的设计和修改
  • Model1——JSP+Bean
    业务java代码封装到bean中
    通过<jsp:useBean >标签获取/创建javabean
    JSP负责页面表现和控制逻辑
    Javabean负责业务逻辑
  • Model2——Web MVC
    M——Model,模型(业务模型),即Web应用中的数据及对数据的处理,页面要显示的数据,页面要提交的数据,实体数据。还包括对数据的管理和维护。可进一步分层
    V——View,视图,即web页面,对模型的展现
    C——Controller,控制逻辑,接收用户请求转发给相应的模型进行处理,把模型处理结果返回给对应的视图进行展现。

3、JavaEE应用的特点

JavaEE是一套使用Java进行企业级Web应用开发的大家一致遵循的工业标准。在这里插入图片描述

4、开发平台与工具包

  • IntelliJ IDEA(Ultimate 教育版)
  • Apache Tomcat8
  • Mysql5.7
  • Spring5
  • MyBatis3.5
  • JPA/Hibernate5

5、基于maven的java项目开发管理

  • JDK8——Java运行环境
  • IDEA (Eclipse EE)——集成开发环境
  • Maven3——Java项目构建工具
  • GIT/gitee——源代码管理工具
  • Jenkins——持续集成工具(CI)

6、Maven开发配置(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的注释中!)
<localRepository>D:\software\maven\repo</localRepository>
<mirror>
    <id>ali</id>
    <mirrorOf>*</mirrorOf>
    <name>ali maven repo</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

以上是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设置:点击File->Settings菜单,搜maven
    在这里插入图片描述
  • (5)在IDEA中创建maven项目:File->New->project,选择maven
    在这里插入图片描述
  • (6)项目信息完善,maven选择
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • (7)功能开发
    添加依赖:在pom中添加dependency元素即可,输入artifactId自动联想完成添加
    在这里插入图片描述

二、Spring概述

1、Spring简介

Spring是什么:

  • 一个复杂而又简洁的javabean工厂
  • Spring是一种轻量级的、非侵入式的Java/JavaEE应用框架
  • 管理bean的创建和管理bean 的依赖

Spring优点:

  • Spring的DI容器,提高组件之间的解耦
  • SpringAOP提供通用任务的集中统一处理(安全、事务、日志等),实现更好的代码复用

2、IOC与DI

容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫“控制反转”或“依赖注入

Bean容器框架的基本思想就是IOC/DI

IOC(Inversion of Control):由容器来负责控制对象的生命周期和对象间的关系(一种减少类与类之间依赖的设计原则)
DI(Dependency Injection):在系统运行中,由容器动态的向某个对象提供它所需要的其他对象

Spring就是一个IOC容器

IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想

3、DI的两种方式

(1)设值注入
IOC容器使用属性的setter方法来注入被依赖的实例
<property name=“userDao” ref=“userDao”/>
(2)构造注入
IOC容器使用构造器来注入被依赖的实例
<constructor-arg ref=“db”/>
用index属性指定顺序,从0开始

4、两种注入方式对比

(1)设值注入的优点:

  • 对于复杂依赖关系,如采用构造注入,导致构造器过于臃肿,spring在创建bean对象的同时,要同时实例化其依赖的其他所有实例对象,导致性能下降
  • 对于某些属性可选的情况,多参数构造器更加复杂。

(2)构造注入的优点

  • 如果依赖对注入顺序有要求,则可以在构造器中决定依赖关系的注入顺序
  • 对依赖关系无须变化的bean
  • 使用构造注入,组件内部的依赖关系对于组件调用者完全透明,更符合高内聚原则。

设值注入为主,构造注入为辅

三、Spring配置管理

1、XML

标记语言
(1)Html(非严格,容错)
(2)Xml(可扩展标记语言,严格定义,格式良好的)
在这里插入图片描述

2、Spring容器

org.springframework.beans.factory.BeanFactorySpring IoC容器的实际代表者,IoC容器负责容纳bean,并对bean进行管理

使用XML作为配置元数据的描述格式,对那些我们希望通过Spring IoC容器管理的bean进行定义。

ApplicationContextBeanFactory的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。

ApplicationContext可利用 ContextLoader在 Web应用启动的时候 自动创建 (SSH整合的时候 就是采用这种方式 )
创建 ApplicationContext容器时 ,所有 singleton bean将会被 预初始化 。

3、Spring包依赖

在这里插入图片描述

4、Spring中bean的定义

在这里插入图片描述
(1)在beans下添加子元素bean
(2)设置id属性:bean对象在容器中的唯一标识,通过这个id的值可以获取到容器中对应的bean对象
(3)设置class属性:创建bean对象的类

5、配置依赖

各组件的相互引用实质上就是依赖关系,可以通过Spring的IOC容器完成依赖注入。

(1)设值注入
在需要配置依赖的组件对应的<bean>元素中配置<property>子元素,指定要注入的属性的名字和值

(2)构造注入
在需要配置依赖的组件对应的<bean>元素中配置<constructor-arg>子元素,按构造函数参数顺序指定对应要注入值

依赖关系的值可以是一个确定的常量,也可以是容器中其他bean的引用
通常对于普通属性的值不纳入配置管理,主要是配置bean实例之间的依赖关系

一般依赖配置分四种情况
(1)注入普通属性
(2)注入bean引用
(3)注入嵌套bean
(4)注入集合类型值

(1)注入普通属性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)注入bean引用(依赖)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)使用自动装配注入bean引用

设定bean元素的autowire属性

  • no:(默认值)不使用 自动装配,须显示指定ref
  • byName:根据名字自动装配,在容器中找到id属性与需要注入的属性(setter方法的名字)同名的bean完成注入
  • byType:根据类型匹配自动装配
  • constructor:与byType类似
  • autodetect:根据bean内部结构决定用constuctor还是byType

在这里插入图片描述
(4)注入嵌套bean
在bean的property子元素中嵌套一个无id的bean元素
嵌套的bean将不被spring访问。

<bean id="chinese" class="app.service.impl.Chinese">
<!-- 将stoneAxe注入给axe属性 -->
<property name="axe">
	<bean 	class="app.service.impl.StoneAxe"/>
</property>
</bean>

(5)注入集合值
在property元素中使用<list><set><map><props>子元素分别这是List、Set、Map、Properties集合属性值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、创建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 = new
			ClassPathXmlApplicationContext("bean.xml");
Person p = (Person)ctx.getBean("chinese");
//Person p = ctx.getBean("chinese" , Person.class);
p.useAxe();

7、容器中Bean的作用域-scope

  • singleton: 单例模式 ,在整个容器中只有一个实例
  • prototype:原型模式 ,每次通过getBean获取时产生一个新的实例
  • request:每次http请求产生一个新的实例(如action),web应用。须在web.xml中配置相应的Listener或filter
  • Session:每次 http session产生一个新的实例 ,web应用
  • 默认为singleton

8、容器中bean的生命周期

在这里插入图片描述
生命周期:1.创建;2.使用;3.销毁

prototype bean:每次请求产生一个新的实例,spring无法跟踪其生命周期
singleton bean:单例对象,每次客户请求都返回同一个共享实例,spring可以跟踪其创建和销毁,实现对其生命周期的管理

生命周期的管理时机:1.注入之后——init-method;2.销毁之前——destroy-method

(1)依赖注入之后
必要资源的申请
在< bean>的配置中加入init-method属性指定bean的全部属性注入/设值成功后要执行的方法

<bean id="chinese" class="app.service.impl.Chinese" init-method="init">
	<property name="axe" ref="steelAxe"/>
</bean>

(2)Bean销毁之前
占用资源的回收
在< bean>的配置中加入destroy-method属性指定bean在销毁之前要执行的方法

<bean id="chinese" class="app.service.impl.Chinese" destroy-method=“destroy">
	<property name="axe" ref="steelAxe"/>
</bean>

(3)协调作用域不同步的bean
√ Singleton bean依赖Singleton bean
√ Prototype bean依赖Prototype bean
√ Prototype bean依赖Singleton bean
X Singleton bean依赖Prototype bean

不同步的根源: Singleton bean只被初始化一次,多次请求获取同一个共享对象; Prototype bean每次请求都应重新创建。

解决方案
放弃容器注入,singleton bean每次使用prototype bean时主动从服务器请求新的prototype bean。耦合了SpringAPI
利用方法注入:使用lookup方法注入

public abstract Axe getAxe();
public void useAxe() {
	System.out.println("正在使用 " + getAxe()+ "砍柴!");
	System.out.println(getAxe().chop());
}
<bean id="steelAxe" class="app.service.impl.SteelAxe" scope="prototype"/>
<bean id="chinese" class="app.service.impl.Chinese">
	<!-- 指定getAxe方法返回steelAxe-->
	<lookup-method name="getAxe" bean="steelAxe"/>
</bean>

9、JavaEE中的设计模式

  • 工厂模式
  • 单例模式
  • 代理模式(用户代码不直接调用目标对象的方法,通过代理对象调用)
  • 静态代理:定义实现代理类
  • 动态代理:动态生成代理类
    JDK反射与动态代理
    CGLib动态代理

10、静态代理(编码实现代理对象)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11、JDK反射

通过类的签名创建对象
通过方法的签名调用方法
在这里插入图片描述

12、基于JDK的动态代理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13、基于cglib的动态代理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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参数,如@Resource(type=com.test.ExampleBean)

(4)值的注入(结合properties文件配置):
resource目录下创建values.properties文件,填写key-value
在spring配置文件中:<context:property-placeholder location="classpath:values.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>
@Value(“value”):在属性定义语句前注解,给对应属性注入常量值
@Value(“${propKey:defaultValue}”):给属性注入属性文件文件中propKey对应的值,如果propKey不存在,就注入defaultValue

(5)生命周期
@PostConstruct:在类的成员方法定义语句前注解,注解的方法将会在对象完成构造且依赖注入完成后被自动调用对象初始化的钩子函数
@PreDestroy:在类的成员定于语句前注解,注解的方法将在bean对象销毁之前被自动调用对象销毁的钩子函数

16、Java日志配置

拥抱log4j,抛弃System.out.println

(1)在resources目录下新建log4j.properties
(2)在pom.xml中添加依赖包
(3)为类添加logger静态属性
在这里插入图片描述

(4)在方法中用logger输出日志

  • logger.debug
  • logger.info
  • logger.warn
  • logger.error
  • logger.fetal
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.25</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

log4j.properties:
在这里插入图片描述
在这里插入图片描述

17、Spring测试

JUnit:Java语言的单元测试框架
默认添加到生成的模板项目中:版本改到4.12以上
在这里插入图片描述

在任意方法前加@Test注解都可测试。实际应用中测试用例与项目代码完全分离,一般scope限定为test
在test/java下的包中添加测试类,在测试方法前添加@Test注解

18、Spring测试(测试容器中的bean)

在pom中添加sprint-test依赖
在这里插入图片描述
测试类前添加注解@RunWith@ContextConfiguration
可以通过@Resource给测试类注入容器中的bean
在这里插入图片描述
如果采用注解开发的方式:
在这里插入图片描述
在这里插入图片描述

四、Spring AOP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊一聊世界杯的半自动越位技术

一、前言 11 月 22 日&#xff0c;在卡塔尔卢赛尔球场进行的 2022 卡塔尔世界杯足球赛 C 组比赛中&#xff0c;阿根廷队以 1 比 2 不敌沙特阿拉伯队&#xff0c;我相信哥很多人都不敢相信&#xff0c;阿根廷居然又输了&#xff0c;而沙特取得亚洲球队在本届世界杯的首场胜利。…

【Pytorch】第 9 章 :Capstone 项目——用 DQN 玩 Flappy Bird

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

一文了解瀑布式项目管理和敏捷项目管理的区别!

众所周知&#xff0c;项目管理起源于软件开发行业&#xff0c;而目前已广泛应用于各行各业&#xff0c;完整的项目管理包含五个部分&#xff0c;分别是&#xff1a;项目启动、项目规划、项目执行、项目监控、项目收尾。随着行业的发展&#xff0c;传统的瀑布式项目管理模式&…

海外跨境电商5大关键趋势,Starday带你先发制人

受新冠疫情的影响&#xff0c;海外市场需求总体而言有所下降&#xff0c;然而随着我国跨境出口产品向更大出口量级、更多出口品类以及更高客单价的趋势发展&#xff0c;跨境出口电商行业却有着快速发展&#xff0c;基于主流跨境电商平台相关数据和中国卖家调研&#xff0c;报告…

卓越工程之单元测试在行权鉴权中的实践

前言 在去年的时候就读过《重构&#xff1a;改善既有代码的设计》这本在代码重构领域里的经典&#xff0c;当时在读的时候就苦于有这么两点导致只停留在了“读”上面&#xff0c;而缺少实践。 1.全书内容比较枯燥乏味&#xff0c;虽然有部分代码示例&#xff0c;但是语言并不…

新能源车的火烧到了二手车市场

今年以来&#xff0c;新能源二手车市场有明显回暖的迹象。据中国汽车流通协会数据显示&#xff0c;今年上半年&#xff0c;新能源二手车交易量达15.6万辆&#xff0c;同比增长36.4&#xff05;&#xff0c;比传统燃油车增速高出24.5个百分点。另据瓜子二手车大数据显示&#xf…

Android平台GB28181设备接入端预置位查询(PresetQuery)探讨和技术实现

之前blog介绍了GB28181云台控制&#xff08;PTZCmd&#xff09;相关&#xff0c;本文主要是介绍下GB28181预置位查询。 预置位这块&#xff0c;在处理带云台的设备非常必要&#xff0c;我们主要是做Android平台的GB28181的设备接入端&#xff0c;也可以转发RTSP摄像头接入到国…

F3--FPGA读写EEPROM实例2022-12-12

1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入式控制系统中常常用来保存设备初始化所需数据。发展过程&#xff1a;ROM – > PROM –> EPROM –> EEPROM&…

移动Web基础知识点大全

移动Web基础知识点大全移动Web1、字体图标2、平面转换3、渐变4、空间转换5、动画6、移动端特点7、百分比布局8、Flex布局9、移动适配9.1 rem9.2 less9.3 vw/vh10、媒体查询11、BootStrap移动Web 1、字体图标 目标&#xff1a;使用字体图标实现网页中简洁的图标效果字体图标 字…

数据技术篇之实时技术

第5章 实时技术 在大数据系统中&#xff0c;离线批处理技术可以满足非常多的数据使用场景需求&#xff0c;但在 DT 时代&#xff0c; 每天面对的信息是瞬息万变的&#xff0c;越来越多的应用场景对数据的时效性提出了更高的要求。数据价值是具有时效性的&#xff0c;在一条数据…

霸榜,这本《程序员如何向架构师转型》在Github已持续置顶两月

前言 企业架构在过去十年中取得了长足的进步。随着越来越多新技术出现&#xff0c;充分利用这些因素来将企业架构创建得更好十分重要。通过将新技术集成到企业架构中&#xff0c;即使在困难时期&#xff0c;也能取得丰硕的成果。 现代企业架构师的 5 个特征&#xff1a; 1. …

移动端插件-IScroll列表滑动、区块滑动

iScrol l是一个高性能&#xff0c;资源占用少&#xff0c;无依赖&#xff0c;多平台的javascript滚动插件(4kb)。 官方&#xff1a; iScroll 访问不了 (iscrolljs.com) iScroll github (https://github.com/cubiq/iscroll) -> build 文件夹 包含各个版本 iScroll 中文…

国内智能手表行业数据浅析

大家好&#xff0c;这里是小安说网控。 智能手表&#xff0c;作为智能穿戴的一种&#xff0c;大大方便了人们的生活。 2022年9月份&#xff0c;我国智能手表产量当期值695.6万个&#xff0c;同比增长21.4%&#xff1b;10月份当期值为552.6万个&#xff0c;同比下滑16.5%。1-10月…

宝塔面板打不开怎么登录进入宝塔页面

浏览器新建标签页&#xff0c;输入服务器公网地址ip&#xff0c;后面加:8888&#xff0c;例如 1.2.3.4:8888 &#xff08;服务器公网地址IP可在云服务器 → 实例→公网IP 查看&#xff09; 删除默认用户名&#xff0c;创建设置你的用户名和密码&#xff0c;确定&#xff0c;登陆…

基于不可否认技术的珍贵古籍线上交易系统设计与实现(JavaWeb的图书商城系统)

目 录 摘 要 I ABSTRACT I 引言 1 1 绪论 1 1.1 课题背景与意义 1 1.2 本文的总体结构 1 2 开发工具及技术 2 2.1 开发工具 2 2.1.1 前台使用技术 2 2.1.2 后台使用技术 2 2.1.3 后端使用技术 3 2.2 B/S架构 3 2.3 软硬件需求 3 3 系统的需求分析和概要设计 3 3.1 可行性分析 3…

IPv6升级转换最新消息,全在这一篇了!-中科三方

工信部部长苗圩&#xff1a;加快“双千兆”建设&#xff0c;提升IPv6网络服务能力 工信部部长苗圩在第19届中国互联网大会上指出&#xff0c;过去一年&#xff0c;互联网行业扎实推进各项工作&#xff0c;在基础设施建设、产业实力提升、融合应用深化等方面不断取得新的…

JavaSE03

Idea中自动生成构造器和get,set的快捷键&#xff1a;altinsert 关于继承的访问&#xff1a; this和super的用法&#xff1a; 子类中的所有构造方法默认都会访问父类中无参构造方法 重写&#xff1a; 重写注意&#xff1a;1.父类中的私有方法&#xff0c;子类不能重写。2.子…

火遍全网的chatGPT(文末有彩蛋)

最近网上非常火爆的CHATGPT&#xff0c;它是OpenAI开发的一款开源的自然语言处理 (NLP) 模型&#xff0c;用于实现对话生成和语言模型预测。CHATGPT 模型基于 GPT-3 (Generative Pretrained Transformer 3) 模型构建&#xff0c;拥有语言理解和文本生成能力。CHATGPT 模型可以用…

分库分表、Memory引擎、代理逐渐、主从复制、IP直连问题

文章目录几千万数据量大表做MySQL主从崩了&#xff0c;该如何优化&#xff1f;为啥禁用IP直连为啥主键使用代理主键&#xff0c;而不是业务主键报表分析使用ESExplain 可视化Visual_Explain一致性Hash解决MySQL分库库容问题不建议在 Docker 中跑 Mysql优雅地进行数据归档倒排索…

《自己动手写CPU》学习记录(8)——第7章/Part 1

目录 引言 致谢 指令说明 add、addu、sub、subu、slt、sltu addi、addiu、slti、sltiu clo、clz multu、mult、mul 设计 宏定义 译码模块 指令执行模块 仿真 仿真程序 仿真结果 引言 随章节进度继续推进&#xff0c;本章继续实现 算术运算 指令等其他操作指令。…