docker run -d --name nexus3 -p 8081:8081 --restart always -v /home/nexus/data:/nexus-data sonatype/nexus3这里前后两个端口什么意思
-p 8081:8081
:这个选项是用来映射容器内部的端口到宿主机的端口。在这个例子中,容器内部的8081端口被映射到了宿主机的8081端口。这意味着,当你通过宿主机的8081端口访问服务时,实际上是访问到了容器内部的8081端口。格式为-p <宿主机端口>:<容器端口>
,如果两个端口相同,也可以简化为-p <端口>
。:8081
:这是容器内部的端口号,表示容器内部运行的服务监听在8081端口上。
总结一下,这条命令将容器内部的8081端口映射到了宿主机的8081端口,这样可以通过宿主机的8081端口来访问容器内部的Nexus服务。
AOP(让你能够捕捉系统中经常使用的功能,把它转化为组件。)
AOP(Aspect Oriented Programming)面向切面思想,是Spring的三大核心思想之一(AOP-面向切面、IOC-控制反转、DI-依赖注入)
AOP,一般成为面向切面,作为面向对象OOP的一种补充,**用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑**,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),**减少系统中的重复代码**,降低了模块之间的耦合度,提高了系统的可维护性。可用于权限认证,日志和事务处理.
** Java是一个面向对象(OOP)的编程语言,但它有个弊端就是当需要为多个不具有继承关系的对象引入一个公共行为时,例如日志记录、权限校验、事务管理、统计等功能,只能在每个对象里都引用公共行为,这样做不便于维护,而且有大量重复代码,AOP的出现弥补了OOP的这点不足。**
oop和aop的区别
如果没有oop,就要在多个业务里,写很多重复校验权限和记录日志操作的代码, 当然用面向对象的思想,可以把这些重复的代码抽离出来,写成公共方法,就是下面这样
** 代码冗余和可维护性的问题得到了解决,但每个业务方法中依然要依次手动调用这些公共方法,也是略显繁琐。 有没有更好的方式呢?有的,那就是AOP,AOP将权限校验、日志记录等非业务代码完全提取出来,与业务代码分离,并寻找节点切入业务代码中 **
以下是aop的实现过程:
AOP的体系结构
很明显, 写好AOP与主要业务逻辑分离后要做的三件事是:在哪里切入,什么时候切入,切入后做什么事
** 在哪里切入:就是权限校验等非业务操作在哪些业务代码中执行**
** 什么时候切入:就是业务代码执行前还是执行后**
** 切入后做什么事:比如做权限校验,日志记录等等**
类似于数学中的切线。业务代码就是切面,写好的非业务代码就是切线
Pointcut:切点,决定处理如权限校验、日志记录等在何处切入业务代码中(即织入切面)。切点分为execution方式和annotation方式。前者可以用路径表达式指定哪些类织入切面,后者可以指定被哪些注解修饰的代码织入切面。在程序执行流程中,真正织入 切面的方法
Advice:处理,包括处理时机和处理内容。处理内容就是要做什么事,比如校验权限和记录日志。处理时机就是在什么时机执行处理内容,分为前置处理(即业务代码执行前)、后置处理(业务代码执行后)等。
Aspect:切面,即Pointcut和Advice。类似于切点和处理的集合
Joint point:连接点,是程序执行的一个点。例如,一个方法的执行或者一个异常的处理。在 Spring AOP 中,一个连接点总是代表一个方法执行。
在程序的整个执行流程中,可以切入 的位置,方法的执行前后,异常抛出之后等位置。
Weaving:织入,就是通过动态代理,在目标对象方法中执行处理内容的过程
AOP能做啥
Spring声明式事务管理配置 [事务管理]
Controller层的参数校验
使用Spring AOP实现MySQL数据库读写分离案例分析
在执行方法前,判断是否具有权限。
对部分函数的调用进行日志记录。监控部分重要函数,若抛出指定的异常,可以以短信或邮件方式通知相关人员。
信息过滤,页面转发等等功能。
什么是事务?
有一系列动作组成的一个单元,这些动作要么全部执行,要么全部不执行。
例子: 张三给李四转账。[1] 张三减钱 [2]李四加钱。
mysql是支持事务的。
AOP的五大注解
前置通知:
@Before
目标方法执行之前的通知
2后置通知:
@AfterReturning
目标方法执行之后的通知
3.环绕通知:
@Around
目标方法之前添加通知,通知目标方法执行之后添加通知
4异常通知:
@AfterThrowing
发生异常之后执行的通知,没发生异常是不会执行的。
5.最终通知:
@After
放在 finally 语句块当中的通知
最终通知使用: @After(切面表达式)。最终通知:无论是否存在异常都是在最后都会执行的。
是否异常都会显示
AOP示例
准备工作:需要引入依赖
Spring.xml 配置文件中添加
context
命名空间和
aop
命名空间:
先定义一个方法
这就是需要增强的代码(通知)
切点表达式:就是用来定义通知(Advice) 往哪些方法上切入的。
定义切面类
在spring配置文件中启用自动代理
更加完整的方法类
AOP示例二:使用自定义注解
先定义一个注解
在controller里面使用注解
定义切面
** 切面的先后顺序的设置**
我们知道,业务流程当中不一定只有一个切面,可能有的切面控制事务,有的记录日志,有的进安全控制,如果多个切面的话,顺序如何控制:**关于这一点:我们可以使用
@Order
注解来标识切面类,为@Order注解的 value 指定一个整数型的数字,数字越小,优先级越高。**
优化切点表达式的方式
上述的缺点是:
- 第一:切点表达式重复写了多次,没有得到复用。
- 第二:如果要修改切点表达式,需要修改多处,难维护
可以这样做:将切点表达式单独的定义出来,在需要的位置引入即可,如下:
我们可以使用:
@Pointcut
注解来定义独立的切点表达式。 注意这个 @Pointcut 注解标注的方法随意,只是起到一个能够让@Pointcut注解编写的位置
定义一个通用的注解
Spring 全注解式开发ACP (推荐)
就是编写一个类,在这个类上面使用大量注解来代替
spring.xml
的配置文件,spring配置文件消失了,如下
AOP 的实际案例:事务处理:
总结
版权归原作者 kaiwest 所有, 如有侵权,请联系我们删除。