先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
com.alibaba
druid
1.0.5
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
org.activiti
activiti-spring-boot-starter-basic
5.21.0
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
特别说明:请把mybatis-spring-boot-starter的依赖放在activiti-spring-boot-starter-basic的前面以避免jar包冲突问题。jar包冲突的表现是:java.lang.ClassNotFoundException: org.apache.ibatis.annotations.Mapper。
依赖顺序和依赖传递的关系: mybatis-spring-boot-starter依赖mybatis-3.4.0.jar,而activiti-spring-boot-starter-basic依赖mybatis-3.3.0.jar,对于这种情况,Maven以顺序靠前的为准。现在如果导入的是mybatis-3.3.0.jar就会抛出异常,而mybatis-3.4.0.jar是正确的,所以要让mybatis-spring-boot-starter的依赖放在activiti-spring-boot-starter-basic的前面。
②主启动类
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
③测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProcessTest {
@Autowired
private ProcessEngine processEngine;
@Test
public void createTable() {
System.out.println(processEngine);
}
}
④yml配置
spring:
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/db_activiti
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
⑤特别操作
在src/main/java目录下创建processes目录,否则将抛出异常:java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist。processes目录的作用是存放bpmn流程定义文件,并对bpmn文件进行自动部署。如果创建到src/main/resources目录下则要求processes目录下至少存在一个文件(任意)。
==================================================================
2.流程部署
①Java代码
注意:如果放在processes目录下会被自动部署,下面的Java代码是手动部署。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProcessTest {
@Autowired
private RepositoryService repositoryService;
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
}
②数据库表分析
二进制数据表,存储了流程定义图形的XML文件和图片信息
保存流程定义的xml信息
保存流程定义的图片
部署信息表,存储了部署的相关信息(部署时间)
流程定义数据表,存储了当前流程图形的相关信息(id,name,版本号)
③解决乱码问题
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName(“宋体”);
processEngineConfiguration.setLabelFontName(“宋体”);
}
}
3.流程查询
①第一步:创建ProcessDefinitionQuery对象
@Test
public void test02ProcessDefinitionQuery() {
//1.创建流程定义查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//2.调用对应的方法执行查询
List list = query.list();
//3.遍历集合
for (ProcessDefinition processDefinition : list) {
String key = processDefinition.getKey();
String name = processDefinition.getName();
int version = processDefinition.getVersion();
System.err.println(“key=”+key);
System.err.println(“name=”+name);
System.err.println(“version=”+version);
}
}
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
@Test
public void test03TaskQuery() {
//创建任务查询对象
TaskQuery query = taskService.createTaskQuery();
//根据流程定义key和委托人查询待办任务
List list = query.processDefinitionKey(“MyProcess”).taskAssignee(“zuzu”).list();
for (Task task : list) {
String assignee = task.getAssignee();
String taskId = task.getId();
String taskName = task.getName();
//taskService需要使用@Autowired注解装配
taskService.complete(task.getId());//完成任务,使任务进入下一步
System.err.println(“assignee=”+assignee);
System.err.println(“taskId=”+taskId);
System.err.println(“taskName=”+taskName);
}
}
8.查询流程实例历史
//1.创建流程实例的历史查询对象,historyService使用@Autowired注解注入
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance instance =
query.processInstanceId(“7501”) //流程实例的id
.finished()//调用这个方法后未完成的流程实例会返回null
.singleResult();
System.out.println(instance);
9.将任务指派给一个组
注意1:创建的新的流程定义要指定一个新的id。
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
10.领取任务
@Test
public void test04Claim() {
//1.创建任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//2.根据任务委托组查询任务列表
List list = taskQuery.taskCandidateGroup(“jingli”).list();
//3.遍历
for (Task task : list) {
String taskId = task.getId();
String userId = “jingli”;
//3.指派任务
taskService.claim(taskId, userId);
}
}
提示:可以根据任务委托人在领取任务前和领取任务后分别查询任务,之前没有之后有即为正确。
TaskQuery query = taskService.createTaskQuery();//创建任务查询对象
List list = query.processDefinitionKey(“MyProcess”) //指定流程定义
.taskAssignee(“jingli”)//指定委托人
.list();//执行查询
for (Task task : list) {
System.out.println(task);
}
11.流程变量
①在创建流程定义时指定流程变量
例如:用变量的方式指定委托人
创建MyProcess02.bpmn
创建后正常部署
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess02.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
②启动
@Test
public void test05StartProcessInstance() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//4.打印processInstance对象
System.err.println(processInstance);
}
带有变量的流程启动时,如果第一个任务中就存在变量,那么启动的时候就必须给出变量值。否则将抛出异常:org.activiti.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier ‘erzi’
@Test
public void test06StartProcessInstanceWithVariable() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//※为第一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“erzi”, “zhangsan”);
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
//4.打印processInstance对象
System.err.println(processInstance);
}
③完成任务
如果完成当前任务时,下一个任务中包含变量,那么此时也必须给出下一个任务的变量值
@Test
public void test7CompleteTaskWithVariables() {
List list =
taskService.createTaskQuery() //创建任务查询对象
.processDefinitionKey(“MyProcess02”)//指定流程定义
.taskAssignee(“zhangsan”)//指定委托人
.list();//执行查询
for (Task task : list) {
String taskId = task.getId();
//在完成当前任务时,为下一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“sunzi”, “lisi”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
12.排他网关
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ariables = new HashMap<String, Object>();
variables.put(“sunzi”, “lisi”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
12.排他网关
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:
目录:
[外链图片转存中…(img-zuZgh1Y4-1713595165617)]
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
[外链图片转存中…(img-Jm82sHVr-1713595165618)]
Java面试核心知识点
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-haqgNyLN-1713595165618)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!