Spring 之IOC、动态代理
整理这段时间项目所用到的Spring知识,由前到深的总结一下。
------------Spring infrastructure------------Spring所有开源项目代码都在链接中,本篇只讲Spring Framework
-------------------------
1、Spring Core
Core模块主要的功能是实现了控制反转(IOC)与依赖注入(DI)、Bean配置以及加载。
Core模块中有IOC、DI、Beans、BeanFactory、BeanDefinitions、ApplicationContext等概念。
IOC----Inversion of Control(控制反转)即Spring实现了自己的IOC容器。其利用java最基本的技术
"反射",只通过类名就能生成类的对象。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器
来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到
了外部容器。
@①IOC是一个很大的概念,可以用不同的方式来实现。
其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件<不是很懂哈哈>
<2>依赖注入(Dependency Injection):
DI-----Dependency Injection(依赖注入) 只提供普通的Java方法让容器去决定依赖关系
注入方式有三种:Spring只支持前两种;
①Constructor Injection 即设置私有属性,通过有参构造器,给私有属性注入bean。
栗子:这样Spring在容器启动时会自动生成其bean。当然注解编程或者xml来实现。
1 public class(interface) B{ 2 //接口和类均可 3 } 4 public class A{ 5 private B b1; 6 private B b2; 7 //Spring默认单例模式,即Spring容器只能实例化一个有参构造器。 8 //可以设置Scope来设置其模式; 9 public A(B b1,B b2){ 10 this.b1=b1; 11 this.b1=b1; 12 } 13 }
②Setter Injection 即设置私有属性,通过Setter方法,进行属性注入bean。
栗子:
1 public class(interface) B{ 2 //接口或者类均可; 3 } 4 public class A{ 5 private B b1; 6 public void setB1(B b1){ 7 this.b1=b1; 8 } 9 }
③interface injection 接口注入,Spring不提供暂时不说了。
BeanFactory----工厂模式
BeanFactory是实例化、配置、管理众多bean的容器。
@在Web程序中用户不需要实例化Beanfactory,Web程序加载的时候会自动实例化BeanFactory,
并加载所欲的Beans,将各个Bean设置到Servlet、Struts的Action中或者Hibernate资源中。
@在Java桌面程序中,需要从BeanFactory中获取Bean,因此需要实例化BeanFactory,没用到。。。
2、Spring AOP
AOP----Aspect Oriented Programming面向切面编程。
基本概念:代理模式、静态代理、动态代理、CGLIB。
Proxy Pattern-----代理模式:代理(Proxy)是一种设计模式。
代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象
所谓的代理模式简单理解为:
A和B拥有同样方法名,B不仅实现了A的想做的事情,又把B自己想做事情也完成了;
即B需要继承或者实现A(为了拥有相同的方法),B又重写了这个方法。
Static Proxy------静态代理
栗子:
接口:
1 /** 2 * 接口 3 */ 4 public interface UserDao { 5 6 void save(); 7 }
代理目标对象:
1 /** 2 * 接口实现 3 * 目标对象 4 */ 5 public class UserDaoImpl implements UserDao { 6 public void save() { 7 System.out.println("----已经保存数据!----"); 8 } 9 }
代理对象:
1 /** 2 * 代理对象,静态代理 3 */ 4 public class UserDaoProxy implements UserDao{ 5 //接收保存目标对象 6 private UserDao target;
//对象注入 7 public UserDaoProxy(UserDao target){ 8 this.target=target; 9 } 10 11 public void save() { 12 System.out.println("开始事务..."); 13 target.save();//执行目标对象的方法 14 System.out.println("提交事务..."); 15 } 16 }
Dynamic Proxy————动态代理 也叫做JDK代理,接口代理
动态代理特点:
关于动态代理的代码解释请参照动态代理详解
我这里对此详解进行了图文方式的解说,感谢Rejoy的精彩分享!
首先:java.lang.reflect.Proxy的源码→java.lang.reflect.Proxy
从源码中可知:
1 public class Proxy extends Object implements Serializable{ 2 3 protected InvocationHandler h; 4 5 protected Proxy(InvocationHandler h); 6 7 //其他省略比如newProxyInstance方法 8 9 }
---------------------------------------------------------------------------------------------
--------------------------------------------