Spring IOC AOP

1. Spring

Q: spring是什么?
A: Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:
反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring
MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多
著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。
官网:http://spring.io/
下载地址:
http://repo.springsource.org/libs-release-local/org/springframework/spring
解压:(Spring 目录结构:)
* docs :API 和开发规范
* libs :jar 包和源码.
* schema :约束
 

2. IOC

控制反转-Inversion Of Control 概念:把创建对象的权力交给框架。包括:依赖注入和依赖查找。
作用:
  削减计算机程序的耦合(解除我们代码中的依赖关系)
 
基于注解的IOC配置:
  1. @Component
    作用:
      把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
    属性:
      value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
  2. @Controller @Service @Repository
    他们的作用及属性都是一模一样的。只不过是提供了更加明确的语义化。
    @Controller:一般用于表现层的注解。
    @Service:一般用于业务层的注解。
    @Repository:一般用于持久层的注解。
    细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。
  3. @Autowired
    作用:
      自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个
      类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
  4.@Qualifier
    作用:
      在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和
    @Autowire 一起使用;但是给方法参数注入时,可以独立使用。
      属性:
      value:指定 bean 的 id。
  5.@Resource
    作用:
      直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
    属性:
      name:指定 bean 的 id。
  6.@Value
    作用:
      注入基本数据类型和 String 类型数据的
    属性:
      value:用于指定值
  7.@Scope
    作用:
      指定 bean 的作用范围。
    属性:
      value:指定范围的值。
    取值:singleton prototype request session globalsession
  8.@PostConstruct
    作用:
    用于指定初始化方法。
  9.@PreDestroy
    作用:
    用于指定销毁方法。
  10.@Configuration
    作用:
    用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用
    AnnotationApplicationContext(有@Configuration 注解的类.class)。
    属性:
    value:用于指定配置类的字节码
  11.@ComponentScan
    作用:
    用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
    <context:component-scan base-package="com.itheima"/>是一样的。
    属性:
    basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。
  12.@Bean
    作用:
    该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
    属性:
    name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)
  13.@PropertySource
    作用:
    用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到
    properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
    属性:
    value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
  14.@Import
    作用:
    用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。
    属性:
    value[]:用于指定其他配置类的字节码。
 

3. Junit

  1. @RunWith
    注解替换原有运行器
  2. @ContextConfiguration
    指定 spring 配置文件的位置
  3.@Autowired
    给测试类中的变量注入数据

4. AOP

  AOP:Aspect Oriented Programming. 面向切面编程。
  作用:
    在程序运行期间,不修改源码对已有方法进行增强。
  优势:
    减少重复代码
    提高开发效率
    维护方便
  相关术语:
    1. Joinpoint(连接点):
      所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
    2. Pointcut(切入点):
      所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
    3. Advice(通知/增强):
      所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
      通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
    4. Introduction(引介):
      引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
    5. Target(目标对象):
      代理的目标对象。
    6. Weaving(织入):
      是指把增强应用到目标对象来创建新的代理对象的过程。
      spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
    7. Proxy(代理):
      一个类被 AOP 织入增强后,就产生一个结果代理类。
    8. Aspect(切面):
      是切入点和通知(引介)的结合。
 
     配置:
      1. @Aspect
        把当前类声明为切面类
      2. @Before
        作用:
        把当前方法看成是前置通知。
        属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Before("execution(* com.itheima.service.impl.*.*(..))")
3.@AfterReturning
作用:
把当前方法看成是后置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterReturning("execution(* com.itheima.service.impl.*.*(..))")
 
4. @AfterThrowing
作用:
把当前方法看成是异常通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")
5.@After
作用:
把当前方法看成是最终通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用
@After("execution(* com.itheima.service.impl.*.*(..))")
6. @Around
作用:
把当前方法看成是环绕通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用
@Around("execution(* com.itheima.service.impl.*.*(..))")
7.@Pointcut
作用:
指定切入点表达式
属性:
value:指定表达式的内容
@Pointcut("execution(* com.itheima.service.impl.*.*(..))")

5. JdbcTemplate

它是 spring 框架中提供的一个对象。
 

6. Spring中的事务控制

 

 传播行为:

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选
择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
1. @Transactional
@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
出现在接口上,表示该接口的所有实现类都有事务支持。
出现在类上,表示类中所有方法有事务支持
出现在方法上,表示方法有事务支持。
以上三个位置的优先级:方法>类>接口
 
2. @EnableTransactionManagement
开启:spring对注解事务的支持。
 
原文地址:https://www.cnblogs.com/alice-bj/p/13180665.html