今天完成的事情:
记录下项目部署到服务器过程
1.执行 mvn package 生成war包

2.然后把war包放到 服务器 tomcat的webapps下

3.编辑tomcat的server.xml文件
添加如下内容
<Context path="/" docBase="tianbo.war" debug="0" privileged="true" reloadable="true"/>

navicat连接服务器 数据库
(服务器放开3306端口)


学习了aop的相关知识
spring aop的主要作用
就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,少写重复代码。
这些其他的事情包括:安全,事物,日志等。
比如下图的绿色公共部分 都可以用aop去实现 减少对核心代码的干扰。

先写一个简单的aop例子
spring aop所需依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
文件头

开启aop注解

扫描切面类所在的包

定义一个一个切面类
记录每个方法运行完毕所消耗的时间
@Component
@Aspect
public class AopAspect {
private static Logger logger = Logger.getLogger(AopAspect.class);
//引入日志配置
/**
* 定义切点函数
*/
@Pointcut("execution(* com.chuilun.controller.*.*(..)) || execution(* com.chuilun.service.*.*(..))")
void time() {
}
@Around("time()")
public Object logTimer(ProceedingJoinPoint thisJoinPoint) throws Throwable {
// 计时并调用目标函数
long start = System.currentTimeMillis();
Object result = thisJoinPoint.proceed();
long time = System.currentTimeMillis() - start;
logger.info("本次运行消耗时间为:" + time + "ms");
return result;
}
运行其中一个方法
自动打印日志

aop里有很多难理解的术语
需要多看几遍 或者理清楚代码 才能慢慢理解

个人理解的AOP:
先说连接点(joinPoint): 类中的每个方法都可以成为一个连接点
步骤:
1. 定义一个切面类(aspect) (里面包含 切入点pointcut 和通知advice)
以刚才的代码为例子 一个简单的切面类
@aspect是用注解方法 也可以在spring xml文件配置 没有注解简单

2. 定义一个切点(ponincut ) (在哪些类下的方法中运行 根据规则可以定义很多)
@Pointcut("execution(* com.chuilun.controller.*.*(..)) || execution(* com.chuilun.service.*.*(..))")
void time() {
}
这里采用的是通配符方法 定义切入点函数
不展开写了 有好几种方式
我这里的意思是
com.chuilun.controller 以及 service包下 任意任意返回值 任意名称 任意参数的方法
3. 编写通知(advice) ( 在某个切点上需要执行的动作,即logTimer中的代码。 以及执行方式around)
@Around("time()")
public Object logTimer(ProceedingJoinPoint thisJoinPoint) throws Throwable {
// 计时并调用目标函数
long start = System.currentTimeMillis();
Object result = thisJoinPoint.proceed();
long time = System.currentTimeMillis() - start;
logger.info("本次运行消耗时间为:" + time + "ms");
return result;
}
5种执行方式
@Before(前置通知 切点方法执行前 执行advice代码
@AfterReturning(后置通知 切点方法执行后 执行advice代码)
@Around(环绕通知 )
@AfterThrowing(抛出通知 切点方法运行出错后 执行advice代码 )
@After (最终通知 切点方法执行后 无论结果如何 都会执行advice代码)
他们的执行顺序

4.织入(weaving) 找到切点定义的方法 (连接点) 把切面应用到目标方法中

spring aop的用途还有很多,我只是知道aop能干嘛,以及简单的应用,还需要不断学习。
任务三总结
一 任务进度是否符合预期,是否延期,如果延期,原因是什么,如何避免下次继续延期
任务总耗时35天 很慢、
原因: 1. 疫情期间没有学习 耽误了学习进度
2.疫情结束后 长时间不学习,之前学的东西有点落下了 重复看又浪费了些时间。
3.遇到问题瞎琢磨,问问题比较少,间歇性划水,耽误时间。
二 脑图分析

三 任务中遇到哪些疑难问题,最终是如何解决的,有哪些值得分享的收获
1. 刚开始任务有些看不懂原型图,主要是不知道自己该干嘛
但后面根据需求建完数据表后,对需求理解就清楚多了。
2.数据库建表前,要先理清表之间1对1 1对多 多对多的关系,然后再建表。
建表过程中多用逻辑外键(通过sql语句增强表之间的联系) 少用物理主键(数据库内设置外键)
3. java实体类字段 和 数据库表字段可以不相同,根据需求自己定义实体类。
我前面因为这个还卡了一段时间
4.添加角色后的的权限设计模块,也卡了一段时间。
经过师兄指引后利用mybatis批量插入完成了功能,主要还是对业务关系理解的不够深入。
5.通过做项目主键逐渐理解了三层架构
以及三层架构的作用
开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用;
6、结构更加的明确;
7、在后期维护的时候,极大地降低了维护成本和维护时间;
8、避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性。
9、有利于系统的分散开发,每一个层可以由不同的人员来开发,只要遵循接口标准,利用相同的对象模型实体类就可以了,这样就可以大大提高系统的开发速度。
明天计划的事情:
深度思考
准备任务4
评论