Spring的总结
Spring 是一款优秀的开源框架 ,他解决的是业务逻辑层和其他各层的耦合问题
谈起Spring必然离不开 IOC 和AOP
IOC–控制反转 核心是DI(依赖注入)
何为反转?
依赖对象的创建和依赖关系的形成,以前是我们主动去new 一个对象,现在 我们把对象交给spring的IOC容器去管理,需要的时候只需注入即可
Bean对象的创建三种方式
1>无参构造
2> 静态工厂 -> factory-method + class
3> 非静态的实例工厂 -> factory-bean + factory-method
<!-- 无参构造方法:<bean class=""> -->
<bean id="stu1" class="com.etoak.Student">
<property name="name" value="JayZhou"></property>
</bean>
<!-- 静态工厂方式:<bean class="" factory-method="" -->
<bean id="stu2" class="com.etoak.Classroom" factory-method="getStudent">
</bean>
<!-- 实例工厂方式:
<bean id="x" class="工厂类的名字" />
<bean factory-bean="x" factory-method="方法名" />
-->
<bean id="cr" class="com.etoak.Classroom"></bean>
<bean id="stu3" factory-bean="cr" factory-method="createStudentWithClassName">
</bean>
Bean的常见属性
id:对象在IOC容器当中的唯一标识
class:指定这是哪个类型的实例
scope:指定一个bean的作用范围,声明周期
singleton:默认单一实例的Singleton是单例类型,就是在创建起容器时就同时自动创建了一个
bean的对象,不管你是否使用,他都存在,每次获取到的对象都是同一个对象。注意Singletoin
作用域是spring的缺省作用域
prototype:原型(每次get()一个不一样的出来)prototype是原型类型,他在我们创建容器的时候并没有实例化,而是在我们获取bean 的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
request:每个请求一个不同实例
session:整个会话一个实例
global-session:全局会话共享一个实例
lazy-init: 指定当前实例是否延迟加载(延迟 到getBean的时候)
init-method: 初始化bean的时候要执行的方法
destory-method:销毁一个bean的时候要执行的方法
Spring bean 的声明周期
bean对象的定义------bean对象的初始化----bean对象的使用—bean对象的消亡
DI依赖注入
给属性赋值
依赖于set方法
依赖于 构造方法
使用注解
AOP:面向切面编程 将核心业务和非核心业务解耦
静态代理
动态代理 JDK CGLIB
反射
AOP的几个概念
pointCut:切入点
Advice:通知 增强
before:MethodBeforeAdvice
after :AfterReturningAdvice
around :MethodInterceptor
throwException:ThrowsAdvice
Advisor:描述切入点 与通知之间的关系
常用注解
AOP @Before@After@Afterturning @AfterThrowing @Pointcut @Aspect@Around
IOC @Controller @Service @Scope @Autowired @Resource @Compoent
关于代理的一些知识:
静态代理模式:需要给被代理的目标类型和代理类型设计一个统一的接口
代理类型当中应当持有一个被代理的目标类型的对象
代理类型只关注非核心业务 被代理的目标类型关注核心业务
在代理类型执行核心方法的 时候 调用目标类型的方法即可
进一步思考 大家会发现
使用静态代理 类的开发会几何倍数的增长
而且如果要代理的是一个类型的n个方法
编码也会非常冗余 复杂~
所以我们需要动态代理~
其核心原理 就是在程序运行时 动态的生成一个代理类的.class文件
然后重新交给类加载器加载
动态代理的两种常用实现:
1.JDK提供的 :Proxy.newProxyInstance(a,b,c);
a> 类加载器对象
b> 要实现的接口
c> 调用执行器 InvocationHandler
2.CGLIB提供的 : Enhancer
setSuperclass();
setCallback();
create();
原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler 来处理。而cgLib动态代理 是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换