麻绳先生

做一些记录性的工作

AOP相关概念

动态代理

特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
分类:基于接口的动态代理和基于子类的动态代理

基于接口的动态代理

使用Proxy类中的newProxyInstance方法创建代理对象,被代理类至少实现一个接口,否则不能使用。newProxyInstance方法有三个参数,

  • ClassLoader:用于加载代理对象字节码,和被代理对象使用相同的类加载器,固定写法;
  • Class[]:用于让代理对象和被代理对象有相同的方法,固定写法;
  • InvocationHandler:用于增强的代码,一般都是写一个接口的实现类,通常情况下是匿名内部类,但不是必须的,此接口的实现类都是谁用谁写;

基于子类的动态代理

使用Enhancer类中的create方法,要求 被代理类不能是最终类。该create方法有两个参数,

  • class:用于指定被代理对象的字节码
  • callback:用于提供增强代码

AOP(Aspect Oriented Programming)

通过预编译方式和运行期动态代理实现程序功能的统一维护。是函数式编程的一种衍生范型。利用AOP可以对业务逻辑各个部分进行隔离,从而使业务逻辑各部分耦合度降低,提高程序可重用性,提高开发效率。

作用:在程序运行期间,不修改源码对已有方法进行增强;
优势:

  • 减少重复代码
  • 提高开发效率
  • 维护方便

实现方式:动态代理技术

相关术语

  • Joinpoint连接点:指那些被拦截到的点
  • Pointout切入点:要对哪些joinpoint进行拦截的定义,被增强的连接点成为切入点
  • Advice通知或增强:通知是指拦截到joinpoint之后所要做的事情就是通知。通知的类型有前置通知、后置通知、异常通知、最终通知、环绕通知。环绕通知中有明确的切入点方法调用。
  • Introduction引介:是一种特殊的通知在不修改类代码的前提下,introduction可以再运行期为类动态地添加一些方法或field
  • Target目标对象:代理的目标对象
  • Weaving织入:指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而aspectj采用编译期织入和类装载期织入。、
  • Proxy代理:一个类被AOP织入增强后,被产生一个结果代理类。
  • Aspect切面:是切入点和通知(引介)的结合

安装程序不支持配置安装通过usb或IEEE 1394端口链接的磁盘

无意中得到一台外星人Alpha,不过并没有硬盘,于是拆了一个1T机械作为系统盘,这个机械硬盘只能通过USB的方式连接到电脑,所以也只能通过USB安装系统到硬盘,于是发生了上述错误“安装程序不支持配置安装通过usb或IEEE 1394端口链接的磁盘”,这个问题并没有找到太多解决办法,网上大多采用“windows to go”的解决办法,我试了一试,很方便,不过和安装介质有些关系,一开始的u盘总是出错,换成硬盘就好了。

参考链接:https://bbs.luobotou.org/thread-2427-1-1.html

spring整合junit

测试人员和开发人员关注的内容是不同的。例如junit测试人员并不会关注他将要测试的程序是否是由Spring框架搭建的,所以开发人员不应该期望测试程序能够存在对开发框架的依赖性代码。而Spring框架需要IOC核心容器,junit如何处理这个问题呢?

配置方法

  1. 导入spring整合junit的jar文件
1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
  1. 使用junit提供的一个注解@RunWith把原有的main方法替换,替换为spring提供的
1
2
@RunWith(SpringJUnit4ClassRunner.class)
@ContentConfiguration(classes = SpringConfiguration.class)
  1. 告知spring运行器,spring和ioc创建是基于文件还是注解,并说明位置信息

@ContextConfiguration

  • locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
  • classes:指定注解类所在位置

当Spring版本为5.x版本时,要求junit版本不低于4.12

spring中的注解二

前文中的注解能够对自己实现的类进行处理,但是对第三方的类则无法处理,只能使用XML的方式,为了解决这个问题,有必要提出新的注解。

创建一个新类,它是一个配置作用的类,作用与applicationcontent.xml一致。

@Configuration

作用:指定当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象创建时的参数时,该注解可以省略

@ComponentScan

作用:用于通过注解指定spring在创建容器时需要扫描的包路径
属性:value,它和basePackages的作用一致,都是用于指定创建容器时扫描的包路径,它替代了xml配置文件中的

1
<context:component-scan base-package="com.zkalan"></context:component-scan>
1
2
3
@Configuration
@ComponentScan(basePackages = "com.zkalan")
public class SpringConfigurtaion{}

@Bean

作用:用于把当前方法的返回值作为bean对象存入到spring中的ioc容器中
属性:name,用于指定bean的id,当不写时,默认值是当前方法的名字
细节:当我们使用注解配置方法时,如果方法有参数,spring矿建回去容器中查找有没有可用的bean对象,查找方式和@AutoWired注解一样

使用纯注解方式时,使用AnnotationConfigApplicationContext方法获取容器对象。

@Scope

设置bean对象的实现模式,例如singleton、prototype

@Import

作用:用于导入其他的配置类
属性:value,用于指定其他配置类的字节码;有Import注解的类是父配置类,被import的是子配置类

@PropertySource

1
@PropertySource("classpath:config.properties")

在实际中,自己写的类使用注解更方便,第三方类使用XML配置更方便。