对象创建和依赖注入
一个demo
public interface SQLDao { public void insert(); } public class DoSomeThingsMysqlDao implements SQLDao{ public void insert(){ System.out.println("do insert"); } } public class DoSomeThingsService { DoSomeThingsMysqlDao dao = new DoSomeThingsMysqlDao(); public void add(){ System.out.println("service do insert"); dao.insert(); } } public class Test { public static void main(String[] args) { DoSomeThingsService service = new DoSomeThingsService(); service.add(); } }
service do insert
do insert
在这个例子中,Test 中使用 new 新建了 DoSomeThingsService ,
DoSomeThingsService 类中使用 new 新建了 DoSomeThingsMysqlDao,并且 Dao 被Service 使用,Service 依赖于 Dao。说 DoSomeThingsService 和 DoSomeThingsMysqlDao存在依赖关系。
现在如果需要修改为Oracle ,那就需要新加一套 Oracle的数据库实现,并且在 service里做代码修改。
public class DoSomeThingsOracleDao implements SQLDao{ public void insert(){ System.out.println("oracle do insert"); } } public class DoSomeThingsService { DoSomeThingsOracleDao dao = new DoSomeThingsOracleDao(); public void add(){ System.out.println("service do insert"); dao.insert(); } } service do insert oracle do insert
这样虽然实现功能了,但是需要修改代码。
还有一个解决办法,就是在代码之外去解决这个问题,在配置文件里实现对象的创建和依赖关系的创建。spring 就是做这个事情的。
spring 可以通过配置文件或者注解 实现对象的创建(new)和依赖注入(set属性)。底层原理是 反射,基于反射来创建对象。
IOC(Inversion of Control)
IOC的一种思想,是控制反转。
控制:控制对象的创建,赋值
反转:由程序代码外部的容器来创建。
正转:程序代码里使用new,调用对象的构造函数创建对象。
IOC思想的实现--依赖注入(DI) 。
依赖:类与类之间的依赖调用关系。
注入:赋值。
IOC,DI的目的是解耦合。
动态代理
A想访问B ,但是B 禁止被访问。这个时候,可以在中间创建一个类C,C可以被A访问,C也可以访问B,这样A通过C来实现对B的访问。
代理模式就是:为其他对象提供一种代理以控制对这个对象的访问。
作用:
1.控制对目标对象的访问。
2.功能增强。(C可以在访问B之前之后做一些事情)。
实现:
1.静态代理
2.动态代理(代理类在运行时被创建出来。【常用】)
① JDK实现动态代理。 目标类必须实现接口
② cglib实现动态代理。 代理类是目标类的子类,不需要目标类实现接口。【应用更广泛】
AOP
动态代理的使用,提炼,规范,形成了一种思想,即AOP。
AOP(Aspect Oriented Programming)--面向切面编程。常用的有日志,事物。
AOP的目的是解耦合。
使用动态代理的好处
1.代码分离(业务代码和非业务代码分离) ,便于开发。
2.分业务功能集中处理,便于修改及其维护。
大致流程:1找出程序中与业务无关的部分,2进行封装,3考虑在哪里调用(即将封装的内容加到业务代码中)