spring理论知识回顾

spring
第一个核心功能,IOC(Inversion of Control)
控制反转
控制:对象的控制,对象的创建、赋值、关联关系(管理)
反转:我们把对象的管理、创建、赋值,交给代码之外的容器实现,也就是对象的创建有其他外部资源实现。

为什么要使用ioc,主要是为了减少代码的改动,也能实现不同的功能,实现解耦合

DI(Dependency Injection)是IOC的技术实现
依赖注入,只要在程序中指定要使用的对象名称就可以,至于对象如何创建、赋值、管理,则交给容器实现。
spring使用的di来实现了ioc,spring底层是通过反射机制来创建对象。
1. 基于xml的di
<bean id="xx" class="" autowire="byType/byName"> -----自动注入
<property name="" value="">----基于set注入
<property name="" ref="beanid"
<constructor-arg name/index="" value/ref="">---基于构造注入
</bean>
<import resource="classpath:ba06/spring-*.xml;ba05/spring-*.xml"/>
2. 基于注解的di
@Component(value="myStudent")
@Deposity
@Service
@Controller
@Value(value="")
@Autowired===>@Qualifier(value="school"),Autowired默认byType
@Resource(默认byName,匹配不到myType)

<beans>
<context:component-sacn base-package="com.bjpowernode.ba01"
</beans>

ApplicationContext ac = ClasspathXmlApplicationContext(conf)
ac.getbean("id")
第二个核心功能aop(aspect orient programming)
面向切面编程
1. 动态代理
jdk动态代理,使用jdk中的Proxy,Method,InvocationHandler创建代理对象
jdk动态代理要求目标类必须实现接口类

cglib动态代理,第三方工具库,创建代理对象,方式是继承,创建目标子类,子类就是代理对象,要求目标类不能是final,目标类的方法也不能是final。
2. 动态代理的作用
1)不改变源代码的情况下增加功能
2)减少代码重复
3)专注业务逻辑代码
4)解耦合,让你的业务功能和非业务功能(如日志、事务)分离。

3. AOP 面向切面编程,是基于动态代理的,主要使用jdk和cglib两种动态代理。
aop就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发使用一种统一的方式去使用动态代理。
--------AOP实际上是一个规范,是动态代理的规范化

4. 怎么理解面向切面编程
1)在分析项目功能时,找出切面
2)找出切面的执行时间,是在业务功能之前还是之后
3)合理安排切面的执行位置,在哪个类,那个方法上执行切面。
5. 术语
aspect 切面,就是我们要对业务代码增强的功能,如日志,事务
joinpoint 连接点 链接切面和业务代码的位置,就是某个类中的方法
pointcut 切入点 连接点的集合
目标对象:给哪个类增强功能,这个类就是目标对象
advice 切面的执行时间,增强功能的执行是在业务代码之前还是业务代码之后

说一个切面有三个关键的要素
1)切面的功能代码,切面干什么
2)切面的执行位置,使用pointcut表示切面的执行位置
3)切面的执行时间,使用advoice标识时间

6. aop的实现
aop是一个规范,动态代理的标准化
aop及时实现框架:
1. spring:spring本身在内部实现了aop规范,能做aop的工作
spring主要在事务处理时使用aop
项目开发中很少使用spring的aop实现
2. aspectJ 是开源的aop框架,spring框架中集成了aspectJ框架,可以在spring中间接使用aspectJ框架
aspectJ框架实现aop有两种方式
1. 使用xml的配置文件:配置全局事务
2. 使用注解,我们在项目中要做aop功能,一般使用注解,aop有五个注解

7. 学习aspectJ的使用
1)切面的执行时间,这个执行时间在规范中叫advice(时间,增强)
在aspectJ框架中使用注解标识的,也可以使用xml来实现
1)@Before
2)@AfterReturning
3)@Around
4)@AfterThrowing
5)@After
2)切面的执行位置,使用aspectJ的切入点表达式
execution(访问权限类型?返回值类型 包名类名?方法名(参数类型和个数)抛出异常的类型?)
以上表达式访问权限类型、包名类名、抛出异常类型可选

*-->0至多个任意字符 ..-->用在方法参数中标识任意多个参数,用在包名之后包含当前包及子包路径
++-->用在类名之后,标识当前类及子类,用在接口之后,表现当前接口及其实现类

execution(public **(..))
..标识任意参数
第一个*标识返回值类型,第二个*表示方法名
指定切入点为:任意公共方法

execution(* set*(..))
..表示任意参数
第一个*表示返回值类型
第二个*标识以set开头的方法
指定切入点为:任意以set开头的方法

execution(* com.xyz.service.*.*(..))
..表示任意参数
第一个*标识返回值类型
第二个*标识service下的类名
第三个*标识service下的类的方法
指定切入点为:任意com.xyz.service包下的类的方法

execution(* com.xyz.service..*.*(..))
第一个*标识返回值类型
第一个..表示service包及其子包
第二个*标识service包及子包下的类
第三个*标识service包及子包下的类的方法
指定切入点为任意service包及子包下的类的方法

execution(**..service.*.*(..))
第一个*标识返回值类型
第二个*..service之前有多级包
第三个*标识service下的类
第四个*标识service下的类名
指定切入点为所有包下的service子包下的类的方法

posted @ 2021-03-02 20:22  渐行、渐远  阅读(76)  评论(0)    收藏  举报