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约束;
- 配置目标对象;
- 配置通知对象;
- 配置将通知织入目标对象;