SSM-Spring基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSM-Spring基础相关的知识,希望对你有一定的参考价值。

一:IOC
1.IOC概述
  ①含义:Iversion of Control反转控制——反转资源获取的方向
  ②传统的获取资源的方式
    组件向当前所在的环境主动的去要资源
    ActionContext.getContext().getSession();
 
  ③IOC提倡的方式
    由组件所在的环境负责将资源注入到组件中,组件被动接受即可
    SessionAware接口→setSession()
 
  ④IOC是一种思想,最经典的实现是DI:Dependency Injection依赖注入
 
2.IOC容器细节
  ①使用IOC容器创建对象
  ②使用IOC容器在创建对象的同时,给对象的属性赋值
  ③在创建对象的过程中,实现组件对象之间的自动装配
 
3.搭建Spring IOC容器需要的开发环境
  ①导入IOC容器需要的jar包
    spring-beans-4.0.0.RELEASE.jar
    spring-context-4.0.0.RELEASE.jar
    spring-core-4.0.0.RELEASE.jar
    spring-expression-4.0.0.RELEASE.jar
    commons-logging-1.1.3.jar
 
  ②创建Spring配置文件:Spring Bean Configuration File
 
4.IOC容器创建对象
  ①IOC容器本身对象创建时,会将配置文件中配置好的bean创建出来
  ②默认是单实例的,只创建bean的一个对象
  ③如果设置bean的scope属性为prototype,那么创建bean的对象就是多实例的,在获取的时候创建,每次获取对象都会创建新的
 
5.从IOC容器中获取对象
  ①根据bean的id获取
  ②根据bean的类型获取:要求容器中指定类型的bean是唯一的
 
6.bean的后置处理器
  ①在bean的初始化方法调用前后执行操作的专门的对象
  ②自定义后置处理器:org.springframework.beans.factory.config.BeanPostProcessor
 
7.属性的装配
  ①手动装配
  ②自动装配
 
8.使用注解配置bean
  ①声明bean的注解
    @Component 将当前类声明为IOC容器中的一个普通的组件
 
    @Controller 将当前类声明为IOC容器中的一个控制器组件
 
    @Service 将当前类声明为IOC容器中的业务逻辑层组件
 
    @Repository 将当前类声明为IOC容器中的一个持久化层组件,Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。
 
  ②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
 
  ③需要设置自动扫描的包
    <context:component-scanbase-package="com.atguigu.ioc.bean"/>
 
  ④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略
 
  ⑤使用注解进行自动装配:@Autowired注解
    [1]首先检测标记了@Autowired注解的属性的类型
    [2]根据类型进行装配
    [3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
    [4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id
    [5]如果设置@Autowired注解的required属性为false,则不勉强装配属性,如果能够装配则装配,如果不能装配则不装配。
 
二:AOP
1.AOP概念:Aspect Oriented Programming 面向切面编程
2.作用:本质上来说是一种简化代码的方式
3.情景举例:
  ①数学计算器接口
  ②提供简单实现
  ③在简单实现的基础上让每一个计算方法都能够打印日志
  ④缺陷
    [1]手动添加日志繁琐,重复
    [2]统一修改不便
    [3]对目标方法本来要实现的核心功能有干扰,使程序代码很臃肿,不易于开发维护
  ⑤使用动态代理实现
    [1]创建一个类,让这个类能够提供一个目标对象的代理对象
    [2]在代理对象中打印日志
4.在Spring中使用AOP实现日志功能
  ①Spring中可以使用注解或XML文件配置的方式实现AOP。
  ②导入jar包
      commons-logging-1.1.3. jar
      spring-aop-4.0.0.RELEASE.jar
      spring-aspects-4.0.0.RELEASE.jar
      spring-beans-4.0.0.RELEASE.jar
      spring-context-4.0.0.RELEASE.jar
      spring-core-4.0.0.RELEASE.jar
      spring-expression-4.0.0.RELEASE. jar
  ③开启基于注解的AOP功能:<aop:aspectj-autoproxy/>
  ④声明一个切面类,并把这个切面类加入到IOC容器中
  ⑤在切面类中声明通知方法
    [1]前置通知:@Before
    [2]返回通知:@AfterReturning
    [3]异常通知:@AfterThrowing
    [4]后置通知:@After
    [5]环绕通知:@Around
  ⑥被代理的对象也需要加入IOC容器
5.切入点表达式:execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))
6.统一声明切入点表达式:
  @Pointcut(value="execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))")
     public void myPointCut(){}
7.通知方法的细节
  ①在前置通知中获取目标方法的方法名和参数列表
    [1]在通知方法中声明一个JoinPoint类型的形参
    [2]调用JoinPoint对象的getSignature()方法获取目标方法的签名
    [3]调用JoinPoint对象的getArgs()方法获取目标方法的实际参数列表
  ②在返回通知中获取方法的返回值
    [1]在@AfterReturning注解中添加returning属性:@AfterReturning(value="myPointCut()",returning="result")
    [2]在返回通知的通知方法中声明一个形参,形参名和returning属性的值一致:
showReturnLog(JoinPoint joinPoint, Objectresult)
  ③在异常通知中获取异常对象
    [1]在@ AfterThrowing注解中添加throwing属性:
@AfterThrowing(value="myPointCut()",throwing="throwable")

     [2]在异常通知的通知方法中声明一个形参,形参名和throwing属性值一致:

showExceptinLog(JoinPoint joinPoint, Throwablethrowable)

8.真正放在IOC容器中的对象是代理对象,而并不是目标对象本身

9.切面的优先级
对于同一个代理对象,可以同时有多个切面共同对它进行代理。
可以通过@Order (value=50)注解来进行设置,值越小优先级越高
  

以上是关于SSM-Spring基础的主要内容,如果未能解决你的问题,请参考以下文章

SSM-Spring-19:Spring中JdbcTemplate

SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator

SSM-Spring-16:Spring中一些名词解释

SSM-Spring-09:Spring中jdk动态代理

SSM-Spring-07:Spring基于注解的di注入

SSM-Spring-13:Spring中RegexpMethodPointcutAdvisor正则方法切入点顾问