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