Spring 的IOC 的注解开发(*****)
Spring的IOC的注解开发的入门
创建web项目,引入jar包
- 在Spring4的版本中,除了引入基本的开发包以外,还需要引入aop的包。
引入Spring的配置文件
- 在src下创建一个ApplicationContext.xml
- 引入约束:使用注解开发需要引入context约束。
- 约束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
创建接口和实现类
开启Spring的组件扫描
在类上添加注解
编写测试类
注解方式设置属性的值
- 注解方式:使用注解方式,可以没有set方法的。
- 属性如果有set方法,需要将属性注入的注解添加到set方法
- 属性如果没有set方法,需要将属性注入的注解添加到属性上。
Spring IOC注解的详解
@Component:组件
- 修饰一个类,将这个类交给Spring管理。
- 这个注解有三个衍生注解(功能类似)
- @Controller:web层
- @Service:service类
- @Repository:dao层
属性注入的注解
- 普通属性
- @Value:设置普通属性的值
- 对象类型属性
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
- 我们习惯是按名称完成属性注入:必须让@Autowired注解和@Qualifiter一起使用完成按照名称属性注入。
- @Resource:完成对象类型的属性的注入,按照名称完成属性的注入。
- @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
Bean 的其他的注解
- 生命周期相关的注解(了解)
- @PostConstruct:初始化方法
- @PreDestroy:销毁方法
- Bean的作用范围的注解
- @Scope:作用范围
- singleton:默认单例
- prototype:多例
- request
- session
- globalsession
- @Scope:作用范围
IOC 的 XML 和注解开发的比较
XML 和注解的比较
- 适用场景
- XML:可以适用任何场景
- 结构清晰,维护方便。
- 注解:有些地方用不了,这个类不是自己提供的。纯注解(SSH)
- 开发方便。
- XML:可以适用任何场景
XML 和注解整合开发
- XML 管理Bean,注解完成属性注入。
Spring 的 AOP 的XML开发(*****)
AOP 的概述
AOP:面向切面编程。AOP是OOP的扩展和延伸,解决OOP开发遇到的问题。
Spring 底层的 AOP 实现原理
- 动态代理
- JDK动态代理:只能对实现了接口的类产生代理。
- Cglib动态代理(类似于Javassist第三方代理技术):对没有实现接口的类产生代理对象,生成子类对象。
Spring 的 AOP 底层实现(了解)
JDK 动态代理
Cglib 动态代理
- Cglib:第三方开源代码生成类库,动态添加累的属性和方法。
Spring 的 AOP 的开发(AspectJ 的 XML 的方式)
Spring AOP 的简介
- AOP 思想最早是由AOP联盟组织提出的,Spring使用这种思想最好的框架。
- Spring 的AOP有自己实现的方式(非常繁琐)。AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP的开发。
- Spring 有两套AOP开发方式
- Spring 传统方式(弃用)。
- Spring 基于AspectJ的AOP的开发(使用)。
AOP 开发中相关术语
Spring 的 AOP 的入门(AspectJ 的 XML 的方式)
创建 web 项目,引入 jar 包
- 引入6个基本开发包
- 引入 aop 开发的相关 jar 包
引入 Spring 的配置文件
- 引入 AOP 的约束
编写目标类并完成配置
编写测试类
- Spring 整合 Junit 单元测试
编写一个切面类
- 编写切面类
- 将切面类交给 Spring
通过 AOP 的配置实现
Spring 中通知类型
前置通知:在目标方法执行之前进行操作
- 前置通知:获得切入点信息
后置通知:在目标方法执行之后进行操作
- 后置通知:获得切入点信息、方法的返回值
环绕通知:在目标方法执行之前和之后进行操作
- 环绕通知可以组织目标方法的执行
异常抛出通知:在程序出现异常的到时候,进行的操作
最终通知:无论代码是否有异常,总会执行。
引介通知(不用会)
Spring 切入点表达式写法
切入点表达式语法
- 基于 execution 的函数完成的
- 语法
- [访问修饰符] 方法返回值 包名.类名.方法名(参数)
- public void com.itheima.spring.CustomerDao.save(…)
-
* *.*.*.*Dao.*.save(..)
-
* com.itheima.spring.CustomerDao+.save(..)
-
* com.itheima.spring..*.*(..)