您的位置:首页 > 编程语言 > Java开发

Spring源码分析--代理模式、工厂模式

2018-03-20 23:27 435 查看
class A{
int a;
int b;
public void execute(){}
}

//实例化以后用一个变量保存下来(匿名对象)
A a = new A();

@autowire A a;//Spring 初始化,实例化(控制权)

//一定要初始化才行,报空指针异常
a.execute();

//IOC容器(存的是java bean)

//Web容器,用来装Servlet的

//实现依赖注入(赋值)  把 = 号右边的东西赋值给左边
@autowire InterfaceA a;//自动把它的实现类注入进来
@Resource("aaa") A b;//IOC容器中类的id为aaa对象自动注入到这里(可以区分父子类的)
@autowire A a; //根据类型自动注入

//依赖链中的所有的对象,ioc容器里面初始化
实例化的先后顺序

Spring的注入方式
1、setter
2、构造方法
3、强制赋值

AOP核心思想:解耦(AOP就是定义规则,解耦的规则是切面,面向切面编程;面向规则编程)
先要把一个整体,给拆了,分别开发
等到发布的时候,再组装到一起运行

这种有规律的东西,就可以认为它就是一个固定的规则,这时候,我们就单独把这个具有一定规律的规则,单独分离出来,作为一个独立模块。

AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。
Authentication 权限认证
Logging 日志
Transactions Manager 事物
Lazy Loading 懒加载
Context Process 上下文处理
Error Handler 错误跟踪(异常捕获机制)
Cache 缓存处理

spring的核心宗旨是简化开发;
AOP的核心思想是解耦;


代理模式(代理模式关心的是过程,每一步操作都是有实时跟踪把控的,我都知道你在做什么)

特点:
1、执行者、被代理人(两个角色:执行者、被代理对象)
2、对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间做,找代理(注重过程,必须要做,被代理对象没时间做或者不想做(怕羞羞),不专业)
3、需要获取到被代理人的个人资料(执行者必须拿到被代理对象的个人资料(执行者持有被代理对象的引用))

原理:
1.拿到被代理对象的引用,然后获取它的接口
2.JDK代理重新生成一个类,同时实现我们给的代理对象所实现的接口
3.把被代理对象的引用也拿到了
4.重新动态生成一个class字节码
5.然后编译

代理模式做了一件什么事情呢?----> 字节码重组。
动态代理可以做一件什么事情?可以在每个方法调用之前加一些代码,在方法调用之后再加一些代码。
AOP:事物代理(申明式事务,在哪个方法需要加事务,哪个方法不需要加事务)、日志监听。
service 方法

开启一个事务(open)

事务的执行(是由我们自己的代码完成的);

监听到是否有异常,可能需要根据异常的类型来决定这个事务是否要回滚还是继续提交。(commit/rollback)
事务要关闭(close)

JDK动态代理:
JDK的动态代理是通过接口来进行强制转换的;
生成以后的代理对象,可以强制转换为接口。

CGlib动态代理:
CGLib的动态代理是通过生成一个被代理对象的子类,然后重写父类的方法
生成以后的对象,可以强制转换为被代理对象(也就是用自己写的类)
子类引用赋值给父类


工厂模式(工厂模式关心的是结果)

//Spring中的工厂模式
//Bean
//BeanFactory(生成Bean)
//单例的Bean
//被代理过的Bean
//最原始的Bean(原型)
//List类型的Bean
//作用域不同的Bean

//getBean
//非常的紊乱,维护困难
//解耦(松耦合开发)

/实现统一管理、专业化管理
//如果没有工厂模式,小作坊,没有执行标准的
//如果买到三无产品(没有标准)
//卫生监督局工作难度会大大减轻


码农就是执行标准的人
系统架构师,就是制定标准的人
不只做一个技术者,更要做一个思考者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: