spring是什么?
spring是一个容器,容器中存放的是java对象,用来创建对象,管理对象,给对象赋值,底层是反射创建对象,存放到map中
spring中的对象默认是单例的
核心技术
- IOC 控制反转
ioc技术实现使用的是di(依赖注入),开发人员在项目中只需要提供对象的名称,对象的创建、查找、赋值都由容器内部实现。di包含(1)set注入(2)构造方法
ioc能够实现业务对象之间的解耦合,例如service和dao对象之间的解耦合 - AOP 面向切面编程
spinrg目的?
实现解耦合,即使得类和类之间解绑,容易修改
spring把创建好的对象放到map中,spring框架中有map存储对象
map的key是唯一的对象的id值,value是对象
在创建spring的容器时,会创建配置文件中的所有对象
什么样的对象放入到容器中?
dao类、service类、controller类、util类
【怎么放入】
- 使用XML配置文件
- 注解
不放到容器类的对象?
servlet、listener、filter
使用spring框架的步骤
常用注解
@Component 创建对象(创建下面三个以外的其他对象)
@Repository 创建dao对象,用来访问数据库的
@Service 创建Service对象,用来处理业务逻辑的,可以有事务功能
@Controller 创建控制器对象的,用来接收请求,显示处理结果
@Value 简单类型的属性赋值
@Autowired spring框架中引用类型的赋值注解,支持byName,byType,默认是byType
@Resource jdk中的注解,使用自动注入给引用类型赋值,支持byName,byType,默认是byType
注解的使用步骤
- 加入依赖:spring-context,间接加入spring-apo
- 在类中加入注解
- 在配置文件中加入组件扫描器 <context: component-scan base-package=“包名”>
byName按名称注入,java类中引用类型的属性名和spring容器中的bean的id一样,这样的bean赋值给引用类型
byType按类型注入,java引用类型是数据类型和spring容器中的bean的class是
代理 proxy
代理对象是目标对象的拓展,并会调用目标对象
动态代理实现方式:jdk 、 cglib
动态代理的作用:
- 在目标类源代码不改变的情况下,增加功能
- 减少代码重复
- 专注业务逻辑代码
- 解耦合,让你的业务功能和日志,事务非业务功能分离
AOP Aspect Orient Programming
AOP的底层就是动态代理,采用了两种代理方式:JDK的动态代理、CGLIB的动态代理,可以理解为AOP就是动态代理
jdk动态代理:使用jdk反射包中的类实现创建代理对象的功能(要求目标类必须实现接口)
cglib:使用第三方工具库,实现代理对象的创建(要求目标类必须继承)
目标类没有接口,用的cglib动态代理
(或者有接口,加上proxy-target-class="true"
)
【AOP即动态代理的规范化】把动态代理的实现步骤,方式都定义好了,让开发人员用统一的方式使用动态代理
Aspect:切面,给你的目标类增加的功能,就是切面
切面的特点,一般都是非业务方法,独立使用
常见的切面:日志、事务、统计信息、参数检查、权限验证
怎么理解面向切面编程?
1.需要在分析项目功能时,找出切面
2.合理的安排切面的执行时间(在目标方法前还是目标方法后)
3.合理安排切面的执行位置,哪个类、哪个方法增加功能
一些术语
- joinPoint:连接点【一个方法】,连接业务方法和切面位置,就是某个类中的业务方法
- pointcut:切入点【多个方法】,多个连接点方法的结合
- 目标对象:给哪个类增加功能,这个类就是目标对象
- advice:通知,通知表示切面功能执行的时间
切入表达式语法
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
【以下的点 都是两个点】
*表示:0至多个任意字符
…表示:【1】用在方法参数中,表示任意多个参数【2】用在包名后,表示当前包以及其子包路径
execution(public * *(..))
**任意公共方法**
execution(* set*(..))
**任何一个以set开始的方法**
execution(* com.xyz.service.*.*(..))
**service 包下面的所有类 所有方法**
execution(* *..service.*.*(..))
**所有包下面的service子包下所有类 所有方法为切入点**