文章目录
Spring AOP
aop代理模式分两种
- 静态代理
以Aspect aop为代表,其原理是在编译时期,将aspect切面加入到程序字节码文件中,直接修改字节码的内容 - 动态代理,不直接修改字节码的内容,而是生成一个代理对象,此对象包含目标的所有方法,通过代理对象调用目标方法时,就会走代理对象内的方法,完成切面,动态代理又分两种
-
jdk动态代理
只能代理接口,代理类需要通过实现InvocationHandler接口,重写其中的invoke方法实现 -
cglib代理
若代理类没能实现InvocationHandler 接口,spring就使用cglib代理,该代理类通过继承目标类实现,若目标类修饰为final,则无法使用cglib代理
-
//1. jdk动态代理
//吃的接口类
public interface Eat {
void eat();
}
//吃的实现类
public class EatImpl implements Eat {
@Override
public void eat() {
System.out.println("吃饭啦");
}
public static void main(String[] args) {
}
}
//吃的代理类
public class EatProxy implements InvocationHandler {
public Object eatimpl;
public EatProxy(Object eatimpl) {
this.eatimpl = eatimpl;
}
public EatProxy() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("准备吃饭");
Object invoke = method.invoke(eatimpl, args);
System.out.println("我吃完啦");
return invoke;
}
public static void main(String[] args) {
//创建吃的实现类
Eat eat = new EatImpl();
//交给代理类来执行,吃接口类的吃方法
EatProxy eatProxy = new EatProxy(eat);
//通过 生成eat的代理类
Eat instance =(Eat)Proxy.newProxyInstance(Eat.class.getClassLoader(), eat.getClass().getInterfaces(), eatProxy);
instance.eat();
}
}
//打印结果
准备吃饭
吃饭啦
我吃完啦
Spring IOC
IOC概念 : 控制反转,控制指对象的控制权,反转指我们不再负责对象的控制,而是将对象的控制权交给spring容器去处理
-
优点 :
- 不用自己管理对象,降低耦合性,省掉很多麻烦
- 最直观的能降低代码量
-
实现原理 : 利用工厂模式beanFactory及反射,最简单的反射例子
EatImpl o = (EatImpl)Class.forName("poyimima.algorithm.EatImpl").newInstance();
o.eat();
依赖注入概念 :
它是控制反转的实现方式,因为应用程序不负责对象的创建及维护,当需要对象时,就向spring容器请求,由spring通过以下n种方式将实例对象注入到应用程序中(注意 依赖注入和装配的关系要搞明白,依赖注入的本质就是装配,装配就是依赖注入的行为,这两者原来总搞混)
- 注入的几种方式
- Setter方式注入 bean之间的依赖关系要确定好,这样容器可以根据bean标签中的property标签将实例bean注入到类的成员变量中去
- 构造器方法注入 跟setter方法类似,构造器,就是给成员变量赋值的,容器可以通过bean标签中的constructer将实例bean注入到类的成员变量中去
spring beans概念 :
由spring托管的对象
bean的生命周期
spring启动后先实例化bean->填充属性,装配->
- 若bean实现啦BeanNameAware接口,spring会将配置的id通过setBeanName()赋值给bean的BeanName属性
- 若bean实现啦BeanFactoryAware接口,spring会将容器的工厂类通过setBeanFactory()赋值给bean的BeanFactory属性
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文(也是个工厂类,比BeanFactory更加强大)的引用传入进来
- 若bean实现啦很多接口,spring会自动调用这些接口里重写的方法 生命周期
bean的作用域
- singleton 单例模式
- prototype 在容器里可以有多个实例
- request 每次http请求都会生成一个bean
- session
- global session
bean的自动装配
什么叫做装配?
当我们向spring容器请求返回某个对象时,容器需要本身有这个bean,这个bean怎么来?就是要通过装配,1个bean类可能有n多个bean,可以手动指定,也可以自动装配
自动装配概念 由spring通过bean间配置的依赖关系,自动完成bean间的组装,生成实例bean对象
- xml装配方式
- 不使用自动装配,手动装配,由ref标签指定
- byName spring会先去查找该bean类内所需的成员变量,之后再根据成员变量的名字,在srping容器内查找注册的bean(成员变量的名字==容器的id),然后将其装配进该bean中
- byType spring会先去查找该bean类内所需的成员变量,之后再根据成员变量的类型在srping容器内查找注册的bean,然后将其装配进该bean中
- 构造器装配
- 注解装配
使用@autowired标注(成员变量,构造方法)默认使用byType的形式,spring容器会根据标注变量的名字自动去查找对应的bean实例,若没找到,就会报错
使用@Resource标注,默认使用byName的形式,spring容器会会根据标注变量的类型自动去查找对应的bean实例,若没找到,就会报错
spring事务隔离级别
- 共5种,第一种默认与数据库设置的隔离级别一致,其他的读未提交,读已提交等隔离级别跟数据库隔离级别一样 数据库隔离级别传送门
spring事务传播行为
泛指两个事务朝上,一个事务调用另一个事务发生
- propagation_REQUIRED 若当前没有事务,创建新事务,若当前有事务,则加入到当前事务
- propagation_new_REQUIRED 若不管当前是否有事务,都新创建新事务
- propagation_supports 支持当前事务,若当前有事务,加入该事务,否则按照非事务执行
- propagation_mandatory(托管) 支持当前事务,若当前有事务,加入当前事务,否则就抛异常
- propagation_not_supports 以非事务执行,当前有事务的话,就挂起
- propagation_never 不支持事务,若当前有事务就报错
- PROPAGATION_NESTED 若当前有事务,嵌套进该事务执行,否则就按照REQUIRED执行
spring五大通知类型
标注在切面类的方法上 使用方法
- 前置通知@Before 目标方法执行前执行该注解
- 后置通知@After 目标方法执行后执行该,无论方法是否抛异常
- 返回通知@After-returning 目标方法正常执行后执行该通知方法
- 异常通知@After-throwing 目标方法异常执行后执行该通知方法
- 环绕通知@Around 更加强劲的通知