IoC与AOP的那点事儿

IoC

控制反转(Inversion of Control)是OOP中的一种设计原则,也是Spring框架的核心.大多数应用程序的业务逻辑代码都需要两个或多个类进行合作完成的,通过IoC则可以减少它们之间的耦合度.

实现方法

IoC的主要实现方法有两种,依赖注入与依赖查找.

依赖注入 : 应用程序被动的接收对象,IoC容器通过类型或名称等信息来判断将不同的对象注入到不同的属性中.

依赖注入主要有以下的方式:

  • 基于set方法 : 实现特定属性的public set()方法,来让IoC容器调用注入所依赖类型的对象.
  • 基于接口 : 实现特定接口以供IoC容器注入所依赖类型的对象.
  • 基于构造函数 : 实现特定参数的构造函数,在创建对象时来让IoC容器注入所依赖类型的对象.
  • 基于注解 : 通过Java的注解机制来让IoC容器注入所依赖类型的对象,例如Spring框架中的@Autowired.
  • 依赖查找 : 它相对于依赖注入而言是一种更为主动的方法,它会在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态.

IoC的思想

在传统实现中,我们都是通过应用程序自己来管理依赖的创建,例如下代码.

1
2
3
4
5
6
7
public class Person {
// 由Person自己管理Food类的创建
public void eat() {
Food food = new Chicken();
System.out.println("I am eating " + food.getName() + "...");
}
}

而IoC则是通过一个第三方容器来管理并维护这些被依赖对象,应用程序只需要接收并使用IoC容器注入的对象而不需要关注其他事情.

1
2
3
4
5
6
7
8
9
10
11
public class Person {
private Food food;
// 通过set注入
public void setFood(Food food) {
this.food = food;
}
// Person不需要关注Food,只管使用即可
public void eat() {
System.out.println("I am eating " + this.food.getName() + "...");
}
}

通过以上的例子我们能够发现,控制反转其实就是对象控制权的转移,应用程序将对象的控制权转移给了第三方容器并通过它来管理这些被依赖对象,完成了应用程序与被依赖对象的解耦.

AOP

AOP(Aspect-Oriented Programming)即面向方面编程.它是一种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想.用于切入到指定类指定方法的代码片段叫做切面,而切入到哪些类中的哪些方法叫做切入点.

AOP是OOP的有益补充,OOP从横向上区分出了一个个类,AOP则从纵向上向指定类的指定方法中动态地切入代码.它使OOP变得更加立体.

Java中的动态代理或CGLib就是AOP的体现.

案例分析

在OOP中,我们使用封装的特性来将不同职责的代码抽象到不同的类中.但是在分散代码的同时,也增加了代码的重复性.

例如,我们需要在两个或多个类中的方法都记录日志或执行时间,可能这些代码是完全一致的,但因为类与类无法联系造成代码重复.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class A {
public void something () {
// 业务逻辑...
recordLog();
}
private void recordLog() {
// 记录日志...
}
}
public class B {
public void something () {
// 业务逻辑...
recordLog();
}
private void recordLog() {
// 记录日志...
}
}

接下来,我们采取两种不同方案来改进这段代码.

将重复代码抽离到一个类中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class A {
public void something () {
// 业务逻辑...
Report.recordLog();
}
}
public class B {
public void something () {
// 业务逻辑...
Report.recordLog();
}
}
public class Report {
public static void recordLog (String ...messages) {
// 记录日志...
}
}

这样看似解决了问题,但类之间已经耦合了.并且当这些外围业务代码(日志,权限校验等)越来越多时,它们的侵入(与核心业务代码混在一起)会使代码的整洁度变得混乱不堪.

使用AOP分离外围业务代码

我们使用AspectJ,它是一个AOP框架,扩展了Java语言,并定义了AOP语法(通过它实现的编译器).

使用AspectJ需要先安装并将lib中aspectjrt.jar添加进入classpath,下载地址.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Something {
public void say() {
System.out.println("Say something...");
}
public static void main(String[] args) {
Something something = new Something();
something.say();
}
}
public aspect SomethingAspect {
/**
* 切入点,切入到Something.say()
*/
pointcut recordLog():call(* com.sun.sylvanas.application.hello_aop.Something.say(..));
/**
* 在方法执行后执行
*/
after():recordLog() {
System.out.println("[AFTER] Record log...");
}
}

AOP解决了代码的重复并将这些外围业务代码抽离到一个切面中,我们可以动态地将切面切入到切入点.

本文作者:SylvanasSun
原文链接:https://sylvanassun.github.io/2017/06/07/2017-06-07-IoC&AOP/
版权归作者所有,转载请注明出处

idea SpringBoot 新特性

前言

Intellij IDEA 2017.2.2版本针对Springboot设置了一些特性,本篇博客给搭建简单介绍一下如何使用这些特性。

Run Dashboard

针对Spring boot提供了Run Dashboard方式的来代替传统的run方法。下面看一下官网提供的面板结构图:
这里写图片描述

是不是很炫,直接可以通过Dashboard看到Springboot的启动项目,并显示相应的端口等信息,同时还能在这里进行相应的操作。下面我们来看看如何调用出Dashboard。

查看更多

MongoDB设置用户名密码及权限

现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)

我们结下来就在admin 库中创建一个admin用户,并给他读写权限。
管理员用户是存在admin中system.users中
./mongo中运行:

1
2
3
4
5
6
> use admin
switched to db admin
> show collections
system.users
system.version
>

查看更多

CentOS-7下安装MongoDB

下载安装包
MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。
下载地址:https://www.mongodb.com/download-center#community

图1 mongodb_download

查看更多

gallery

hexo 图片推荐使用姿势

资源文件夹
资源(Asset)代表 source 文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images 文件夹中。然后通过类似于 ![](/images/image.jpg) 的方法访问它们。

文章资源文件夹
对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组织化的方式来管理资源。这个稍微有些复杂但是管理资源非常方便的功能可以通过将 config.yml 文件中的 post_asset_folder 选项设为 true 来打开。

1
2
_config.yml
post_asset_folder: true

当资源文件管理功能打开后,Hexo将会在你每一次通过 hexo new [layout] <title> 命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个 markdown 文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。

查看更多

大米饭的Blog正式创建公开!

大米饭的博客今天上线了,可以记录自己的小秘密了。

上图

Hexo build blog

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

查看更多

本文总阅读量