夜光带你走进Spring(三)
夜光序言:
总有一个人,让你明知继续也没有结果,却依旧想为她放弃一切,守护一生。
正文:
1. 简述Spring IOC容器
a. 创建对象
à 构造函数
à 工厂
b. DI 依赖注入
à set方法注入
* 普通字段注入值 、集合属性
* 内部bean注入
* p 名称空间
* 自动装配
* 注解
2. Spring 如何与Struts2整合?
夜光:目标
1.代理模式
2. Aop编程【这是Spring核心点~】
* 手动实现aop编程
* spring Aop 注解方式
* Spring Aop XML 配置
* 切入点表达式语法详解
3. Spring 对jdbc模块的支持
1. 代理模式
概念
Proxy, 表示代理~ 提供了对目标对象另外的访问方式,即通过代理访问目标对象~
Java中代理:
静态代理
动态代理
Jdk 代理
Cglib 代理
Spring默认支持
静态代理
特点:
1. 目标对象必须要实现接口
2. 代理对象,要实现与目标对象一样的接口
需求:
IUserDao.java dao接口
UserDao.java dao实现
Void save(); // 保存实现
UserDaoProxy.java dao代理类,对UserDao中功能进行扩展~
App
缺点:
1. 代理对象,需要依赖目标对象的接口~
如果接口功能变化,目标对象变化,会引入代理对象的变化
2. 对每一个目标对象,都要分别写一个代理类,麻烦~
(代理工厂)
动态代理【帅气~~】
动态代理:
1. 通常说的动态代理,就是指jdk代理
因为是通过jdk的api在运行时期,动态的生成代理对象的~
2. 目标对象一定要实现接口, 代理对象不用实现接口
JDK 生成代理对象的Api
|-- Proxy
static Object |
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) |
参数loader :
当前目标对象使用的类加载器~
参数interfaces :
当前目标对象实现的接口
参数 h:
接口类型,事件处理器.
当执行目标对象方法的时候,会触发事件; 把当前执行的方法(method对象),传入事件处理器方法参数中, 这样就可以根据业务逻辑,判断是否执行目标对象方法或扩展功能~
夜光:Cglib代理
也叫”子类代理”
当目标对象没有实现接口,就不能使用jdk提供的代理,可以以子类的方式实现~
在运行时期动态在内存中构建一个子类对象的方法,从而对目标对象扩展,这种就是cglib代理~
Spring也支持cglib代理,核心包中已经包含此功能~
- JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。
- CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。
- CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
如:
public class UserDao { }
public class $Cglib_my_class extends UserDao {}
总结:
1. 目标对象可以不实现接口
2. 目标类不能为final, 如果为final报错
3. 方法如果为final/static, 不会被代理拦截~ 会直接执行目标对象方法 ~
代理总结
在SpringAop编程中,
如果目标对象有实现接口,spring使用jdk提供的代理生成代理对象~
如果目标对象没有实现接口,使用cglib代理~
如果目标没有实现接口、且为final , 不能进行aop编程,报错~不能生成代理~
- Data Guard高级玩法:通过闪回恢复failover备库 (r10笔记第7天)
- ajax跨域问题-web开发必会
- 在线重定义的补充测试(r10笔记第26天)
- 聊聊Data Guard中的DG Broker(r10笔记第24天)
- stuts2返回json数据简单实现
- Linux命令ssh-copy-id (r10笔记第21天)
- 【Go 语言社区】HTML5 canvas验证码识别
- 迁移式升级的测试(二)(r10笔记第35天)
- Golang实现图片缩放服务器
- mongodb数据结构与基本操作增删改查整理(二)
- 使用在线重定义重构亿级分区表(r10笔记第34天)
- 【Go 语言社区】一个WebSocket的简单Echo例子
- Java基础-day10-代码题-继承&抽象类
- 闪回区空间不足引发的SQL问题分析(r10笔记第32天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- php实现多站点共用session实现单点登录的方法详解
- php实例化一个类的具体方法
- PHP MVC框架中类的自动加载机制实例分析
- smarty模板的使用方法实例分析
- 关于Yii中模型场景的一些简单介绍
- php文件包含的几种方式总结
- 一个基于Laravel5的个人博客系统:Lablog搭建教程
- php快速导入大量数据的实例方法
- Laravel 模型关联基础教程详解
- yunBT:一个基于TP3.1的多用户BT离线下载程序,支持在线播放
- 使用Chihaya搭建一个可以屏蔽迅雷的Tracker
- [jio本]Debian9一键安装各种下载工具
- php实现QQ小程序发送模板消息功能
- 微软自家沙盒 Sandbox公布
- php DES加密算法实例分析