This website requires JavaScript.

从零开始实现一个简易的 Java MVC 框架(五)--引入 aspectj 实现 AOP 切点

前言

在上一节 从零开始实现一个简易的 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 切点的功能

Read more

从零开始实现一个简易的 Java MVC 框架(四)--实现 AOP

前言

AOP 全称是 Aspect Oriented Programming,叫做面向切面编程,和面向对象编程 (OOP) 一样也是一种编程思想,也是 spring 中一个重要的部分。

其实现基于代理模式,对原来的业务进行增强。比如说原来的功能是增删改查,想要不修改源代码的情况下增强原来的功能,那么就可以对原来的业务类生成一个代理的对象,在代理对象中实现方法对原来的业务增强。

而代理又分静态代理和动态代理,通常我们都是用动态代理,因为静态代理都是硬编码,不适合拿来用在实现框架这种需求里。在 java 中通常有两种代理方式,一个是 jdk 自带的代理,另一个是 cglib 实现的代理方式,这两个代理各有特点,不大了解的话可以自行查找资料看看。

在 spring 的底层这两种代理方式都支持,在默认的情况下,如果 bean 实现了一个接口,spring 会使用 jdk 代理,否则就用 cglib 代理。

在 doodle 框架里用了 cglib 代理的方式,因为这种方式代理的类不用实现接口,实现更灵活

Read more

从零开始实现一个简易的 Java MVC 框架(三)--实现 IOC

Spring 中的 IOC

IoC 全称是 Inversion of Control,就是控制反转,他其实不是 spring 独有的特性或者说也不是 java 的特性,他是一种设计思想。而 DI(Dependency Injection),即依赖注入就是 Ioc 的一种实现方式。关于 Ioc 和 DI 的具体定义和优缺点等大家可以自行查找资料了解一下,这里就不详细赘述,总之 spring 的 IoC 功能很大程度上便捷了我们的开发工作。

在实现我们的 Ioc 之前,我们先了解一下 spring 的依赖注入,在 spring 中依赖注入有三种方式,分别是:

  1. 接口注入 (Interface Injection)
  2. 设值方法注入 (Setter Injection)
  3. 构造注入 (Constructor Injection)
@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;
    }
}
Read more

从零开始实现一个简易的 Java MVC 框架(二)--实现 Bean 容器

项目准备

首先确保你拥有以下环境或者工具

  • idea
  • java 8
  • maven 3.3.X
  • lombok 插件

然后我们创建一个 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 两个依赖就可以完成前面几个功能的实现,其他需要的依赖等到后面需要的时候再加。

Read more

从零开始实现一个简易的 Java MVC 框架(一)--前言

前言

最近在看 spring-boot 框架的源码,看了源码之后更是让我感受到了 spring-boot 功能的强大。而且使用了很多的设计模式,让人在看的时候觉得有点难以下手。

不过仔细了解了一段时候发现,其实他的原理是很简单的,所以想要自己也动手实现一个功能类似的框架。一方面可以让自己在细节部分了解更深入,另一方面也可以给其他和我一样想要了解 spring-boot 原理,但是却被他复杂的设计模式吓到的人提供一些参考。

当然自己动手确实很难做到和 spring-boot 那样强大的功能,而且也为了避免过于使用设计模式而造成代码变得繁杂,我简化了很多过程和功能,使得主要的实现思想更容易得到理解。

本文会一步步讲解这个框架的实现过程,同时也会提及一些 spring 中经典的代码或者问题。

框架代码已经完成,如果不想看文章的话可以直接看我的项目代码,GitHub:doodle

主要实现功能:

  • Bean 容器
  • IOC
  • AOP
  • MVC
Read more