• 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)


    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求。而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码。

    1.spring中的aop演示

    aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理)  
        切面:实现的交叉功能.  
        通知:切面的实际实现(通知要做什么,怎么做).  
        连接点:应用程序执行过程期间,可以插入切面的地点.  
        切入点:真正的将通知应用到目标程序中的地点,一定是连接点.切入点是连接点的子集.  
                切入点决定了一个特定的类的特定方法是否满足一定的规则  
        引入:为类增加新的属性和方法. (引入通知)  
        目标对象:被通知的对象.  
        代理:把通知应用到目标对象以后,产生新的对象,该对象就称为代理对象.  
        织入:创建代理对象过程.  
            编译期织入:.java  --> .class,需要特殊的编译器.  
            类装载期织入:将java字节码载入到jvm时,将通知织入.需要特殊的classloader.  
            运行期(runtime):  
      
        cglib:  
      
        aop alliance:aop联盟.  
      
    spring代理方案:  
        1.接口代理:jdk动态代理,创建更加松耦合的系统.  
        2.对类代理:cglib代理,final方法无法被代理.  
    

    1.1步骤(XML配置)

    1.导包(4+2+2+2+1) 基础包+日志包+aop、aspects+test+weaver+aopalliance

    下面两个是spring需要的第三方aop包
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    com.springsource.org.aopalliance-1.0.0.jar

    一共是11个jar包

    2.准备目标对象

    3.准备通知

    前置通知(Before Advice):在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程(除非该通知抛出异常,该异常将中断当前方法链的执行而返回)。 后置通知(After Advice):在切入点选择的连接点处的方法之后执行的通知,包括如下类型的后置通知: 后置返回通知(After returning Advice):在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没抛出任何异常正常返回时才调用后置通知。 后置异常通知(After throwing Advice): 在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常返回时才调用异常通知。 后置最终通知(After finally Advice): 在切入点选择的连接点处的方法返回时执行的通知,不管抛没抛出异常都执行,类似于Java中的finally块。 环绕通知(Around Advices):环绕着在切入点选择的连接点处的方法所执行的通知,环绕通知可以在方法调用之前和之后自定义任何行为,并且可以决定是否执行连接点处的方法、替换返回值、抛出异常等等。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

    五种通知的执行顺序为: 前置通知→环绕通知→正常返回通知/异常返回通知→后置通知。

    appilcationContext.xml中添加aop的约束文件

    4.配置进行织入,将通知织入目标对象中


    JoinPoint(连接点):目标对象,所有可以增强的方法。
    PointCut(切入点):目标对象。已经增强的方法
    Advice(通知/增强):增强的代码
    Target(目标对象):被代理对象
    Weaving(织入):将通知应用到切入点的过程
    Proxy(代理):将通知织入到目标对象之后,形成代理对象
    aspect(切面):切入点*通知
    

    https://yq.aliyun.com/ziliao/425722

    1.2 步骤(注解配置)

    前面几步是一样的,

    代码优化

    总结

    一.注解代替xml配置
    准备工作:
    4+2 + spring-aop包
    xml中导入context约束
    在xml中开启扫描包中类的注解
    注解:
    @Component("BeanName") 将对象注册到spring容器
    |- @Controler
    |- @Service
    |- @Repository

    	@Scope	指定对象的作用范围
    		|- singleton
    		|- prototype
    		
    	@Value 值类型属性注入
    		
    	@Autowired 自动属性注入.根据类型注入.
    	@Qulifier 指定注入的对象的名称
    	
    	@Resource 指定对象的名称注入
    	
    	@PostConstruct 初始化方法
    	@PreDestory    销毁方法
    

    二.spring AOP开发

    	aop思想: 纵向重复,横向抽取.
    		|- filter中
    		|- 动态代理
    		|- interceptor中
    		
    	spring AOP: 封装了动态代理技术.来体现aop.
    	
    	
    	springaop实现: 	可以对所有对象进行代理
    			|- 动态代理	 代理需要实现接口.
    			|- cglib代理 对目标对象继承代理.
    	
    	springaop名词:
    			join point: 连接点.所有可以织入通知的方法.
    			point cut : 切入点.需要|已经织入通知的方法.
    			advice:		需要增强的代码.
    			weaving:	动词.将通知应用的切点的过程.
    			target: 目标对象.
    			proxy:	代理对象
    			aspect: 切面. 切入点+通知
    			
    	步骤:
    		1.导包
    			4+2
    			2 aop+aspect
    			2 aop联盟+weaving
    		2.准备目标对象
    
    		3.准备通知类
    			 前置通知
    			 后置通知 方法正常结束
    			 环绕通知
    			 异常拦截通知
    			 后置通知 无论如何都执行
    	
    		4.配置文件中配置,导入aop约束
    			1>目标对象
    			2>通知对象
    			3><aop:config>
    					<aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
    					<aop:aspect ref="通知对象名称" >
    						<aop:before method="" ponintcut-ref=""  />
    						<aop:after-returning method="" ponintcut-ref=""  />
    						<aop:around method="" ponintcut-ref=""  />
    						<aop:after-throwing method="" ponintcut-ref=""  />
    						<aop:after method="" ponintcut-ref=""  />
    					</aop:aspect>
    	
    	扩展:使用注解完成aop
    		1.导包
    			4+2
    			2 aop+aspect
    			2 aop联盟+weaving
    		2.准备目标对象
    
    		3.准备通知类
    		4.配置文件中配置,导入aop约束
    			1>目标对象
    			2>通知对象
    			3><aop:aspect-autoproxy> 开启注解aop
    			
    		5.注解
    			@Aspect 指定当前类是通知类
    			
    			@Before 前置通知方法
    			@after-returning 后置通知方法
    			@around 环绕通知方法
    			@after-throwing 异常拦截通知方法
    			@after 后通知方法
    			
    			@PointCut 抽取切点表达式
  • 相关阅读:
    js对象Array —— 使用.操作符和用['xxx']访问对象的区别
    JavaScript为字符串提供的一些常用方法
    ES6新增属性——,模板字符串`` 中可使用${ }代替‘+’字符串拼接
    【vue】使用vue+element搭建项目,Tree树形控件使用
    vue循环遍历List,Map,Array
    解决分页查询只能查到本页信息的问题
    vue之 js字符串驼峰和下划线互相转换
    PHP中的对象遍历技巧
    php类的复制(克隆)
    php类的自动加载
  • 原文地址:https://www.cnblogs.com/qichunlin/p/10171430.html
Copyright © 2020-2023  润新知