doodle
2018-07-12
3307
0
在上一节 从零开始实现一个简易的 Java MVC 框架(四)--实现 AOP 中我们实现了 AOP 的功能,已经可以生成对应的代理类了,但是对于代理对象的选择只能通过指定的类,这样确实不方便也不合理。这一节我们就利用aspectj
来实现功能更强大的切点。
在 spring 初期的时候 AOP 功能使用起来也是很繁琐麻烦的,到了后面整合了aspectj
才有了现在这么方便的 AOP 功能,比如下面这样的代码,很简便并且直观的定义了切点。
@Component
@Aspect
public class LogAspect {
@Pointcut("execution(* com.zbw.*.service..*Impl.*(..)) && @annotation(Log)")
public void logPointcut() {
}
@Before("logPointcut()")
public void before()
{System.out.println("Before");}
}
现在我们也来引入 aspectj 来实现 AOP 切点的功能
doodle
2018-07-10
3944
6
AOP 全称是 Aspect Oriented Programming,叫做面向切面编程,和面向对象编程 (OOP) 一样也是一种编程思想,也是 spring 中一个重要的部分。
其实现基于代理模式,对原来的业务进行增强。比如说原来的功能是增删改查,想要不修改源代码的情况下增强原来的功能,那么就可以对原来的业务类生成一个代理的对象,在代理对象中实现方法对原来的业务增强。
而代理又分静态代理和动态代理,通常我们都是用动态代理,因为静态代理都是硬编码,不适合拿来用在实现框架这种需求里。在 java 中通常有两种代理方式,一个是 jdk 自带的代理,另一个是 cglib 实现的代理方式,这两个代理各有特点,不大了解的话可以自行查找资料看看。
在 spring 的底层这两种代理方式都支持,在默认的情况下,如果 bean 实现了一个接口,spring 会使用 jdk 代理,否则就用 cglib 代理。
在 doodle 框架里用了 cglib 代理的方式,因为这种方式代理的类不用实现接口,实现更灵活
doodle
2018-07-05
4413
6
IoC 全称是 Inversion of Control,就是控制反转,他其实不是 spring 独有的特性或者说也不是 java 的特性,他是一种设计思想。而 DI(Dependency Injection),即依赖注入就是 Ioc 的一种实现方式。关于 Ioc 和 DI 的具体定义和优缺点等大家可以自行查找资料了解一下,这里就不详细赘述,总之 spring 的 IoC 功能很大程度上便捷了我们的开发工作。
在实现我们的 Ioc 之前,我们先了解一下 spring 的依赖注入,在 spring 中依赖注入有三种方式,分别是:
@Component
public class ComponentA {
@Autowired // 1. 接口注入
private ComponentB componentB;
@Autowired // 2. 设值方法注入
public void setComponentB(ComponentB componentB) {
this.componentB = componentB;
}
@Autowired // 3. 构造注入
public ComponentA(ComponentB componentB) {
this.componentB = componentB;
}
}
doodle
2018-06-29
6165
0
首先确保你拥有以下环境或者工具
然后我们创建一个 maven 工程,编写 pom.xml 引入一些需要的依赖
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j-api.version>1.7.25</slf4j-api.version>
<lombok.version>1.16.20</lombok.version>
</properties>
<dependencies>
<!-- SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
目前只需要 lombok 和 log4j 两个依赖就可以完成前面几个功能的实现,其他需要的依赖等到后面需要的时候再加。
doodle
2018-06-26
11487
2
最近在看 spring-boot 框架的源码,看了源码之后更是让我感受到了 spring-boot 功能的强大。而且使用了很多的设计模式,让人在看的时候觉得有点难以下手。
不过仔细了解了一段时候发现,其实他的原理是很简单的,所以想要自己也动手实现一个功能类似的框架。一方面可以让自己在细节部分了解更深入,另一方面也可以给其他和我一样想要了解 spring-boot 原理,但是却被他复杂的设计模式吓到的人提供一些参考。
当然自己动手确实很难做到和 spring-boot 那样强大的功能,而且也为了避免过于使用设计模式而造成代码变得繁杂,我简化了很多过程和功能,使得主要的实现思想更容易得到理解。
本文会一步步讲解这个框架的实现过程,同时也会提及一些 spring 中经典的代码或者问题。
框架代码已经完成,如果不想看文章的话可以直接看我的项目代码,GitHub:doodle
主要实现功能: