spring aop思想

spring插件:STS插件

spring整合junit测试

    每一个方法都不需要先获得容器再获得对象了。

//帮我们创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo{
    @Resource(name="user")
    private User u;

    @Test
    public void fun1(){
        System.out.println(u);
    }
} 

 

AOP思想:spring提供了对对象进行aop编程的支持。

    横向重复、纵向抽取。

1.Filter:解决乱码放到filter中,filter放到所有servlet上面;

2.动态代理中,管理事务代码,每次使用事务都要编写事务代码,开启事务关闭事务什么的,InvocationHandler,使用动态代理把事务管理加入所有servlet操作中;

Proxy.newProxyInstance(ClassLoader,Interface[] arr,InvocationHandler handler)

    InvocationHandler里面写的东西就是需要加入到被代理对象中的代码。

通过动态代理把事务管理加入到servlet当中,不需要在servlet中再写。

3.拦截器,很多个Action,参数赋值Action,拦截器可以完成把参数赋值到Action中,这样Action就不用每个都做参数赋值了,比如登陆校验的时候。

 

解释AOP

    面向切面的编程,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

ASPECT

    AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面,根据需求的不同,一个应用程序可以有若干切面。

 

AOP实现原理

    spring能够为容器中管理的对象生成动态代理对象。以前我们要使用动态代理,我们需要自己调用下面这个方法生成代理对象

Proxy.newProxyInstance(ClassLoader,Interface[] arr,InvocationHandler handler)

 spring能帮我们生成代理对象。只需要用配置文件或者注解配一下。

为什么叫spring aop?

    在生成代理的时候,为每一个service都生成代理,这样通用行为只需要写一遍。

spring实现AOP的原理:

1.动态代理:被代理对象必须要实现接口才能产生代理对象。如果没有接口将不能使用动态代理技术。

2.cglib代理:第三方代理技术,cglib代理技术,可以对任何类生成代理,代理的原理是对目标对象进行继承代理。如果目标对象被final修饰,那么该类无法对cglib代理。

    有接口优先使用1,没有就用2。

AOP名词学习

Joinpoint(连接点)

  • 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。目标对象中,所有可以增强的方法;

Pointcut(切入点)

  • 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。目标对象中已经被增强的方法。

Advice(通知/增强)

  • 所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置 通知,异常通知,最终通知,环绕通知(切面要完成的功能)。增强的代码。比如打开事务提交事务等等。

Introduction(引介)

  • 引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类 动态地添加一些方法或 Field.

Target(目标对象)

  • 被代理对象。代理的目标对象 Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.  spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入

Proxy(代理):

  • 将通知织入到目标对象后形成代理的过程。

Weaving(织入)

  • 将通知应用到切入点的过程。

Aspect(切面)

  • 是切入点和通知(引介)的结合。切入点+通知。

AOP步骤

1.导包;

2.准备目标对象;

3.准备通知;

package com.hellodake.aspect;
//通知类
public class MyAdvice {
	
	//前置通知
		//!目标方法运行之前调用
	//后置通知(如果出现异常不会调用)
		//!目标方法之后调用
	//环绕通知
		//!目标方法之前和之后都调用
	//异常拦截通知
		//!如果出现异常,就会调用
	//后置通知(无论是否出现异常都会调用)
		//!在目标方法之后调用

	//前置通知
	public void before(){
		System.out.println("这是前置通知");
	}
	
	//后置通知(如果出现异常不会调用)
	public void afterReturning(){
		System.out.println("这是后置通知");
	}
	
	//环绕通知
	public Object around(ProceedingJoinPoint pjp){
		System.out.println("这是环绕通知之前的通知");
		Object proceed=pjp.proceed();  //这是目标方法代码
		System.out.println("这是环绕通知之后的通知");
		return proceed;
	}
	
	//异常拦截通知
	public void afterException(){
		System.out.println("出现异常");
	}
	
}

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

  • 导入新的约束:aop约束;
  • 配置目标对象;
  • 配置通知对象;
  • 配置将通知织入目标对象;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值