📄 day2.txt
字号:
特殊的Bean装配:
1、后处理Bean
接口:org.springframework.beans.factory.config.BeanPostProcessor
示例:所有Bean的字符串属性改成大写
练习:
Spring已经实现该接口的BeanPostProcessor(不用再注册)
ApplicationContextAwareProcessor:
把应用上下文传递给所用实现了 ApplicationContextAware接口的Bean
ApplicationContextAware接口使用举例,可参照事件监听机制
DefaultAdvisorAutoProxyCreator
自动对Bean应用切面
2、Bean工厂后处理(只能在应用上下文中使用)
接口:org.springframework.beans.factory.config.BeanFactoryPostProcessor
示例:统计载入到工厂的Bean的个数
Spring内部接口实现:
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
分散配置(PPT42)
示例:
练习:
写一个数据库的配置
属性编辑
org.springframework.beans.factory.config.CustomEditorConfigurer
示例:
练习:
CustomerInfo("fname-lname-address")
3、事件监听
1)自定义事件,通过继承org.springframework.context.ApplicationEvent
2)自定义监听器,实现 org.springframework.context.ApplicationListener,并注册
3)发布事件,为得到应用上下文,
必须实现org.springframework.context.ApplicationContextAware接口
示例:
练习:
AOP:
几个概念:
(1)目标对象(target)
就是被代理的对象,也就是具体的业务逻辑。比如OrderService
(2)切面 (Aspect)
交叉业务,也就是通用的业务逻辑,比如日志、事务。
(3)连接点 (Jointpoint)
切面可以插入的地点,主要有方法、属性
(4)切入点 (Pointcut)
指定哪些连接点可以应用切面/通知
(5)通知(Advice)
切面的具体实现
也可这样理解:
advice是你想向别的程序内部不同的地方注入的代码。
pointcut定义了需要注入advice的位置,通常是某个特定的类的一个 public方法。
advisor是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码
Advice:
切面的实现
类型:
(1)org.springframework.aop.MethodBeforeAdvice
在方法调用之前,做处理。
不能够改变返回值
不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)
(2)org.springframework.aop.AfterReturningAdvice
在方法调用之后,做处理。
不能够改变返回值
不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)
(3)org.aopalliance.intercept.MethodInterceptor
在方法调用之前以及之后,做处理。
可以改变返回值,也可以改变流程。
(4)org.springframework.aop.ThrowsAdvice
在方法抛出异常后,做处理。
当该通知处理完异常后,会简单地将异常再次抛出给目标调用方法。
内置的创建代理类:
org.springframework.aop.framework.ProxyFactoryBean ppt55
proxyInterfaces,interceptorNames
配置过程:
(1)配置目标对象
(2)配置通知
(3)利用ProxyFactoryBean将通知织入到目标对象,形成一个动态代理对象
(4)客户端使用动态代理来访问目标对象的方法。
在默认情况下,通知会应用到所有的方法之上。
Pointcut: ppt48
根据方法和类决定在什么地方织入通知
Advisor
将Pointcut与Advice结合到一起。
自定义切入点:
步骤:
1)实现org.springframework.aop.ClassFilter
2)实现org.springframework.aop.MethodMatcher
3)实现org.springframework.aop.Pointcut
4)实现org.springframework.aop.PointcutAdvisor
注意:
在此可定义
private Advice advice;
private Pointcut pointcut;
在配置文件中,将自定义的切入点与通知绑订到一起
5)利用ProxyFactoryBean将advisor织入到目标对象
预定义切入点:
静态切入点:
org.springframework.aop.support.NameMatchMethodPointcutAdvisor
根据方法名称的特点进行匹配,不考虑目标对象
mappedName(要匹配的方法的名称),
mappedNames:对个方法进行匹配
advice(ref):要配置的通知
org.springframework.aop.support.RegexpMethodPointcutAdvisor
根据正则表达式来匹配
pattern,advice(ref)
正则表达式:用来匹配字符串的模式
. : 匹配任意单个字符
+ : 匹配前一个字符一次或多次
* : 匹配前一个字符0次或多次
动态切入点:
org.springframework.aop.support.ControlFlowPointcut
切入点的交叉与合并:
Pointcuts.union
Introduction
一种特殊类型的Advice
为类动态增加方法和属性
编程步骤:
1)实现org.springframework.aop.IntroductionInterceptor或
继承org.springframework.aop.support.DelegatingIntroductionInterceptor
2)使用org.springframework.aop.support.DefaultIntroductionAdvisor
自动代理:
Spring在生成代理对象的时候,默认情况下,会使用被代理对象的接口来生成
代理对象。
如果被代理对象没有实现接口,此时,Spring会使用CGLIB生成代理对象,此时
该代理对象是被代理对象的子类。
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
根据类的名称来为符合相应名称的类生成相应代理对象。
beanNames(list),interceptorNames
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
自动将Advisor与匹配的Bean进行绑定
只能与Advisor配合使用
练习:
检测方法执行时间
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -