Spring IOC AOP - 25


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 配置文件中的:     是一样的。     属性:     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对注解事务的支持。