【基础知识】_Spring

Spring

IOC&DI

Spring概念

Spring是分层的Java EE应用的全栈轻量级开源框架,以IOC(反转控制)和AOP(面向切面编程)为内核,提供了web层SpringMVC和dao层Spring JDBCTemplate以及service层事务管理等众多技术。

使用Spring框架开发Web项目时,service层对于dao层方法的调用发生改变:

  • 不用spring框架时直接调用,如下图。

  • 使用spring框架时则通过容器结合配置文件使用反射调用。那么web层对于service层方法的调用也是同理,需要在配置文件中配置service层中类的唯一标识,以便web层中动态资源使用容器来反射调用。

Spring使用步骤

  1. 在pom.xml文件中导入Spring开发所需要的相关jar包
  2. 编写Dao接口及其实现类
  3. 在类路径resources下创建Spring的核心配置文件applicationContext.xml,用于对Spring框架中的相关操作进行配置。
  4. 在核心配置文件applicationContext.xml中配置Dao实现类
  5. 使用Spring框架中ApplicationContext对象通过反射获取Dao实现类的实例对象。

核心配置文件_依赖注入

依赖注入(DI)是反转控制(IOC)的具体实现,具体操作就是指,通过Spring来控制和维护业务层(service层)和持久层(dao层)之间的依赖关系。

我们之前在Spring核心配置文件中配置好了service实现类和dao实现类。如果没有依赖关系,我们通过Spring框架反射创建service实例对象后,使用service实例对象调用dao实现类时,并不会由Spring框架来反射创建dao实例对象,而是直接创建;只有注入了依赖关系,才可以将dao实例对象的创建放入service实例对象中。

核心配置文件_加载配置文件

实际开发中, Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载,来引入其他配置文件。

核心配置文件_重点配置标签

核心配置文件_配置数据源

数据源就是数据库连接池

核心配置文件_加载properties配置文件

IOC&DI注解开发

Spring原始注解

Spring是轻代码而重配置的框架,配置比较繁重,在核心配置文件中完成各种配置比较繁琐,影响开发效率,所以注解开发是一种趋势。注解代替xml配置文件可以简化配置,提高开发效率。

使用注解进行开发时,需要在核心配置文件中配置逐渐扫描,作用是指定哪个包及其子包下的Bean需要进行扫描,以便识别其中使用注解配置的类、字段和方法。

Spring原始注解主要是替代<Bean>的配置

注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入
@Qualifier 结合@Autowired一起使用用于根据名称进行依赖注入
@Resource 相当于@Autowired+@Qualifier,按照名称进行注入
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

Spring新注解

单单使用原始注解还不能全部替代xml配置文件,还需要使用注解代替的配置如下:

  • 非自定义的Bean的配置: <bean>
  • 加载properties文件的配置: <context:property-placeholder>
  • 组件扫描的配置: <context:component-scan>
  • 引入其他文件: <import>

根据这些需求有如下Spring新注解:

注解 说明
@Configuration 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan 用于指定 Spring 在初始化容器时要扫描的包。作用和在 Spring 的 xml 配置文件中的<context:component-scan base-package=”com.itheima”/>一样
@Bean 使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource 用于加载.properties 文件中的配置
@Import 用于导入其他配置类

为了达到提高开发效率的目的,一般不会使用Spring新注解,因为相对来说新注解并没有简化代码编写。尤其是一般并不会用@Configuration来配置一个Spring配置类来代替xml配置文件。

Spring集成Junit

如果不用Spring集成Junit进行测试,就是直接通过@Test来找Junit进行测试;Spring集成Junit之后进行测试,就是通过注解进入Spring容器中找Junit来进行测试。

主要步骤:

  1. 在pom.xml文件中导入spring集成Junit的坐标
  2. 使用@Runwith注解替换原来的运行期
  3. 使用使用@ContextConfiguration指定配置文件或配置类
  4. 使用@Autowired注入需要测试的对象
  5. 创建测试方法,使用@Test进行测试

AOP

AOP概念

AOP面向切面编程是通过预编译方式和运行期动态代理实现程序功能的一种技术,AOP本质上就是动态代理,只不过是将复杂的动态代理代码封装到了Spring中,从而通过Spring框架简化了写法。

AOP的主要作用就是在不修改源码的情况下对方法进行功能增强。

常用术语:

  • Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类 。
  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点,就是可以被增强的方法。
  • Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义 ,就是被增强的方法。
  • Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知 ,也就是对目标方法所要进行的增强。
  • Aspect(切面):是切入点和通知(引介)的结合,就是目标方法被增强后的方法。

AOP开发基本步骤

  1. 导入 AOP 相关坐标

  2. 创建目标接口和目标类(内部有切点)

  3. 创建切面类(内部有增强方法)

  4. 将目标类和切面类的对象创建权交给 spring

  5. 在核心配置文件 applicationContext.xml 中配置织入关系

AOP开发细节

切点表达式的写法

增强的配置语法

切点表达式的抽取

当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref 属性代替 pointcut 属性来引用抽取后的切点表达式。

AOP注解开发

AOP注解开发基本步骤

  1. 创建目标接口和目标类(一定要有接口,且内部有切点)

  2. 创建切面类(内部有增强方法)

  3. 为目标类和切面类添加<bean>注解,将目标类和切面类的对象创造权交给Spring

  4. 为切面类添加织入关系注解

  5. 在核心配置文件中开启组件扫描和AOP的自动代理

AOP注解开发细节

增强注解的写法和类型

切点表达式的抽取

与xml文件配置aop一样,注解配置aop也可以抽取切点表达式。抽取方式是在切面内定义方法,在该方法上使用@Pointcut注解定义切点表达式,然后在增强注解中进行引用。

JdbcTemplate

JdbcTemplate基本使用步骤

  1. 在pom.xml文件中导入spring的jdbc坐标和tx坐标

  2. 在核心配置文件中引入properties配置文件

    1
    <context:property-placeholder location="classpath:jdbc.properties"/>
    • classpath路径在每个Java EE项目中都会用到,即WEB-INF下面的classes目录。所有src目录下的java、xml、properties等文件编译后都会再次。当核心配置文件中需要通过location属性引用classpath路径下的文件时,只需要在文件名前加classpath:即可。

    • jdbc.properties配置文件模板如下:

      1
      2
      3
      4
      5
      jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql://localhost:3306/db1
      jdbc.username=root
      jdbc.password=root
      #非常重要:properties中所有的键值对的键前最好加一个前缀,比如此处的(jdbc.),否则程序执行就会错误,我也不知道为啥。
  3. 在核心配置文件中配置数据源DataSource和JdbcTemplate类对象,并将DataSource对象依赖注入到JdbcTemplate对象中去。

  4. 在dao层中通过Spring反射创建并使用JdbcTemplate实例化对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class SpringJdbcTest {

    @Autowired//通过注解将spring容器中的JdbcTemplate对象依赖注入到该类中,使其在该类中通过反射成为实例化对象,并可以被直接使用。
    private JdbcTemplate jdbcTemplate;

    public void test1() {
    List<Bank> list = jdbcTemplate.query("select * from bank", new BeanPropertyRowMapper<Bank>(Bank.class));
    System.out.println(list);
    }

声明式事务控制

声明式事务控制概念

这里所说的声明,就是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。

这样的话,事务管理就只在Spring配置文件中,而不会侵入到开发组件中,如果想要改变或者关闭事务管理,只需要在Spring配置文件上修改,维护及其方便。

Spring声明式事务控制底层就是AOP。

声明式事务控制基本步骤

  1. 在核心配置文件中引入tx命名空间和约束路径

  2. 在核心配置文件中创建平台事务管理器对象,并依赖注入数据库连接池datasource。

  3. 在核心配置文件中配置事务增强切面类

  4. 在核心配置文件中配置事务AOP织入

    事务控制AOP的切点一般就是业务管理层(service层)对象中的方法,一般这些方法中会有多个dao层中的方法,事务控制的目的也就是使这几个dao层的方法共进退,入下图。

事务增强切面类的配置参数细节

声明式事务控制注解开发

还是一样的道理,使用注解进行配置时,一般不使用Spring新注解,比如容器创建非自定义类的对象时,还是在xml配置文件中创建。

声明式事务控制注解开发基本步骤

  1. 在核心配置文件中引入tx命名空间和约束路径

  1. 在核心配置文件中创建平台事务管理器对象,并依赖注入数据库连接池datasource。

  2. 在需要添加事务控制的业务管理层(service层)类中和方法上添加事务管理相关注解

  3. 在核心配置文件中配置开启组件扫描注解和事务的注解驱动