依赖注入能够让相互协作的软件组件保持松散耦合,而面向切面编程AOP允许你把遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使软件系统实现关切点的分离的一项技术。系统由很多不同的组件构成,每一个组件各负责一块特定的功能。除了实现自身核心的功能之外,这些组件还经常承担这额外的职责。诸如日志,事务管理和安全的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为他们会跨越系统的很多个组件中。
如何将这些关注点分散到多个组件中去,代码将会带来双重的复杂性。
1:实现系统关注点功能的代码将会重复出现在多个组件中,这意味这如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用他的方法,但方法的调用还是会重复出现在各个模块中。
2:组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何增加地址,而不应该关注他是不是安全的或者是否需要支持事务。
面向切面编程往往被定义为促使软件系统实现关切点的分离的一项技术。系统由很多不同的组件构成,每一个组件各负责一块特定的功能。除了实现自身核心的功能之外,这些组件还经常承担这额外的职责。诸如日志,事务管理和安全的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为他们会跨越系统的很多个组件中。
如何将这些关注点分散到多个组件中去,代码将会带来双重的复杂性。
1:实现系统关注点功能的代码将会重复出现在多个组件中,这意味这如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用他的方法,但方法的调用还是会重复出现在各个模块中。
2:组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何增加地址,而不应该关注他是不是安全的或者是否需要支持事务。
AOP能够使这些服务模块化,并以声明的方式将他们应用到他们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。AOP能够确保POJO的简单性。
我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层,这些层以声明的方式灵活的应用到系统中,你的核心应用甚至根本不知道他们的存在。这是一个强大的理念,可以将安全,事务和日志关切点和核心业务逻辑相分离。
接下来我们看一个样板代码案例。通常为了实现通用的和简单的任务,我们不得不一遍一遍的重复写这样的代码。
当然,这样的因素基本上是因为使用JAVAAPI而导致的样板式代码。
当然,这样的因素基本上是因为使用JAVAAPI而导致的样板式代码。
package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectData {
public static void main(String[] args) {
String URL = "jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
String USER = "root";
String PASSWORD = "tiger";
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 2.获得数据库链接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
st = conn.createStatement();
rs = st.executeQuery("select * from user");
// 4.处理数据库的返回结果(使用ResultSet类)
while (rs.next()) {
System.out.println(rs.getString("user_name") + " " + rs.getString("user_password"));
}
// 关闭资源
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
为了实现一个简单的查询,我们需要穿件数据库连接,创建语句,如果是非查询操作,还需要事务控制,并且还要捕捉SQL异常,虽然即使捕捉后也做不了什么事情。最后还要关闭数据库连接。
Spring旨在通过模板封装来消除样板式代码,Spring的JdbcTemplate使得执行数据库操作时,避免了传统的JDBC样板代码成为了可能。