Spring框架知识总结(浅显易懂)

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之间转换

你可能感兴趣的:(Java,spring)