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 }

 

---------------------------------------------------------------------------------------------

--------------------------------------------

posted on 2017-08-24 19:47  剑姬  阅读(576)  评论(0编辑  收藏  举报

导航