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

Spring IOC & AOP

2017-09-21 16:19 295 查看
IOC(DI):

Java中每个业务逻辑至少需要啷个或以上的对象来协同完成,通常每个对象在使用其他合作对象的时候,都需要使用想new Object()这样的方式来完成合作对象的申请,当业务繁多时,对象之间的耦合性就会很高。而Ioc就是通过Spring容器来实现这些相互依赖的对象间的创建和协调工作,对象只需要关心业务逻辑本身就可以了,从这方便将,对象如何得到他的协作对象的责任就被反转了(IOC,DI).

简单讲解,Spring就是通过工厂 + 反射将业务bean放到它的容器中,当需要使用某个bean的时候,只需要调用context.getBean(“beanId”)的方法即可使用。

Spring容器的原理:就是通过解析xml,读取到用户配置的bean,申明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有节点,并通过反射将这些bean挨个放到Map中,然后对外提供一个getBean()方法,客户端通过ClassPathXmlApplicationContext.xml根据bean的Id来获得这些bean。

1、首先就是applicationContext.xml配置对应业务的bean对象

2、然后spring容器加载配置文件xml里面读取bean对象信息,保存在一个HashMap中,HashMap的key就是Bean的id,Value就是这个bean,这样就可以通过context.getBean(“*“)这个方法获得对应的业务bean。

3、Spring的注入核心思想就是通过反射机制实现的,在实例化一个类时,它通过反射调用类中的set方法将事先保存在HashMap中的类属性注入到类中

4、最后将这个类的实例返回给我们,即可使用

参考 http://wiki.jikexueyuan.com/project/ssh-noob-learning/container-ioc-resolution.html

AOP

IOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁的效果,

而AOP则让容器中的对象都享有容器中的公共服务,核心内容就是动态代理。

动态代理就是利用反射和动态编译将代理模式变成动态的,原理跟动态注入一样,代理模式在编译的时候就已经确定代理类将要代理谁,而动态代理在运行的时候才知道自己要代理谁。

Spring的动态代理有两种:

一是JDK的动态代理,主要就是通过反射和动态编译来实现的;

二是cglib动态代理(通过修改字节码来实现代理)。

比如要对用户管理进行打印管理,

1、首先定义一个接口和实现类,实现方法addUser()和delUser();

2、利用反射接收被代理类,通过反射可以获取到被代理类的类型、方法等;

3、JDK动态代理有两个核心分别是InvocationHandler和Proxy;

4、共用的打印方法实现InvocationHandler接口,通过构造器获取被代理的类;

5、实现动态代理的关键部分就是通过Proxy来动态生成具体的代理类。利用反射获取被代理类的所有方法并组装生成Java源文件,然后再将Java文件编译成class文件加载到内存并实例化,返回生成我们想要的代理类了;

6、生成的代理类即可调用被代理类的相应方法,同时在生成的代理类中,会调用共同的打印方法;

7、这样就完成了一个面向切面编程的整个过程

参考:

http://blog.csdn.net/it_man/article/details/4402245

http://wiki.jikexueyuan.com/project/ssh-noob-learning/dynamic-proxy.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring ioc aop