跳转至

Spring

https://spring.io/projects/spring-framework

Spring 的核心就是提供了一个 IoC 容器,它可以管理所有轻量级的 JavaBean 组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP 支持,以及建立在 AOP 基础上的声明式事务服务等。

IoC

Inversion of Control,控制反转,即各组件创建和配置等流程的控制权从应用程序(开发者)转移到了 IoC 容器,将组件的创建和配置与组件的使用相分离,应用程序只需要直接使用已经创建好并且配置好的组件,由 IoC 容器负责管理组件的生命周期。

在 Spring 的 IoC 容器中,我们把所有组件统称为 JavaBean,即配置一个组件就是配置一个 Bean

为了能让组件在 IoC 容器中被「装配」出来,需要某种「注入」机制,因此 IoC 又称为依赖注入(DI:Dependency Injection)

通过 application.xml 配置文件告诉容器如何创建组件,以及各组件的依赖关系

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="password" />
    <property name="maximumPoolSize" value="10" />
    <property name="autoCommit" value="true" />
</bean>
public class Main {
    public static void main(String[] args) {
        // 创建一个IoC容器实例,然后加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        // 获取Bean
        UserService userService = context.getBean(UserService.class);
        // 正常调用
        User user = userService.login("bob@example.com", "password");
        System.out.println(user.getName());
    }
}

AOP

Aspect Oriented Programming 面向切面编程

在 OOP 中,除了实现业务逻辑,还需要权限检查、日志记录和事务处理等常用功能,AOP 本质就是一个动态代理,通过某种方式对调用方法进行拦截,并在拦截前后进行处理,每个功能视作一种切面(Aspect),把这些通用功能从每个业务方法中剥离出来

Spring 通过 CGLIB 动态创建子类等方式来实现 AOP 代理模式,大大简化了代码,在 Spring 容器中使用 AOP 只需要定义执行方法,并用注解标注应该在何处触发并执行。

  • @Aspect 注解

比较少用,因为容易导致很多不需要 AOP 代理的 Bean 也被自动代理了

@Aspect
@Component
public class SecurityAspect {
    @Before("execution(public * com.itranswarp.learnjava.service.*.*(..))")
    public void check() {
        if (SecurityContext.getCurrentUser() == null) {
            throw new RuntimeException("check failed");
        }
    }
}
  • 只在希望被标注的地方使用

比如是否在数据库事务中被调用 @Transactional

@Component
public class UserService {
    // 有事务:
    @Transactional
    public User createUser(String name) {
        ...
    }

    // 无事务:
    public boolean isValidName(String name) {
        ...
    }

    // 有事务:
    @Transactional
    public void updateUser(User user) {
        ...
    }
}

访问数据库

  • JDBC(Java Database Connectivity) Java 程序访问数据库的标准 API
  • JPA(Java Persistence API) Oracle 发布的 Java 持久化标准,定义了 ORM 应该怎么做,为了兼容多种数据库,使用 JPQL 查询,然后转换成特定数据库的 SQL,增加了性能开销。
  • Hibernate 是基于 JPA 规范实现的全自动 ORM 框架,使用 HQL 查询。
  • MyBatis 是半自动的 ORM 框架,开发者需要在 XML 文件或注解中自己编写 SQL 语句,MyBatis 负责将这些 SQL 语句的执行结果自动映射到 Java 对象。

JDBC 虽然简单,但代码比较繁琐,Spring 提供了简化的访问 JDBC 的模板类 DAO(Data Access Object),可以方便地集成 Hibernate、JPA 和 MyBatis 这些数据库访问框架