夜光带你走进Spring(三)

时间:2019-04-15
本文章向大家介绍夜光带你走进Spring(三),主要包括夜光带你走进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代理,核心包中已经包含此功能~

  1. JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。
  2.  CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。
  3.  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编程,报错~不能生成代理~