文章目录
spring工程特性
工厂创建之后,会将Spring配置文件中的所有对象都创建完成(饿汉式)。
提高程序运行效率。避免多次IO,减少对象创建时间。(概念接近连接池,一次性创建好,使用时直接获取)。
生命周期方法
- 自定义初始化方法:添加“init-method”属性,Spring则会在创建对象之后,调用此方法。
- 自定义销毁方法:添加“destroy-method”属性,Spring则会在销毁对象之前,调用此方法。
- 销毁:工厂的close()方法被调用之后,Spring会毁掉所有已创建的单例对象。
- 分类:Singleton对象由Spring容器销毁、Prototype对象由JVM销毁。
生命周期阶段
单例bean:singleton
随工厂启动创建 ==》 构造方法 ==》 set方法(注入值) ==》 init(初始化) ==》 构建完成 ==》随工厂关闭销毁
多例bean:prototype
被使用时创建 ==》 构造方法 ==》 set方法(注入值) ==》 init(初始化) ==》 构建完成 ==》 JVM垃圾回收销毁
代理设计模式
将核心功能 和 辅助功能分离
为什么要有辅助类?
1.添加的代码不能重用,代码冗余
2.添加日志等代码会使代码不纯粹,即代码入侵
静态代理设计模式
通过代理类对象,为原始类对象添加辅助功能, 通常是一个业务就有一个代理类.
代理类:实现原始类的相同接口+添加辅助功能+调用原始类业务方法.
从Servlet---->ServletImpl
到Servlet---->代理类---->ServletImpl
通过代理类反射创建对象
动态代理设计模式
JDK动态代理(基于接口)
CGlib动态代理(基于继承)
面向切面编程AOP
概念
- 连接点 joinpoint
程序中客观存在的方法 - 切入点 pointcut
需要添加辅助功能的方法 - 通知(增强)advice
辅助功能 - 切面 aspect
通知与切入点的关系(那个切入点上执行那个功能)
在配置文件中:
<!--原始对象-->
<bean id="us" class="com.xx.UserServiceImpl" />
<!--辅助对象-->
<bean id="myAdvice" class="com.xx.MyAdvice" />
<aop:config>
<!--切点-->
<aop:pointcut id="myPointCut" expression="execution(* save())" />
</aop:config>
<aop:config>
<!--组装切面 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPointCut" />
</aop:config>
特点
- 通过AOP提供的编码流程,更便利的定制切面,更方便的定制了动态代理。
- 进而彻底解决了辅助功能冗余的问题;
- 业务类中职责单一性得到更好保障;
- 辅助功能也有很好的复用性。
通知类
前置通知:MethodBeforeAdvice
后置通知:AfterAdvice //有异常执行
返回通知:AfterReturningAdvice //有异常不执行,方法会因异常而结束,无返回值
异常通知:ThrowsAdvice
环绕通知:MethodInterceptor
切面类Aspect类
before 前置通知
after 后置通知
after-returing 返回通知
after-throwing 异常通知
around 环绕通知
注解版本
<!--开启AOP注解:-->
<aop:aspectj-autoproxy />
@Pointcut("execution(* com.qianfeng.service.UserService.add())")
public void m1(){}
@Before("m1()")
@After("m2()")
@AfterReturning("m3()")
@AfterThrowing("m4()")
@Around("m5()")
public void around(ProceedingJoinPoint pjd){
System.out.println("环绕通知前置执行");
try {
pjd.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("环绕通知后置执行");
}