spring1--概念引入

对象创建和依赖注入

一个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考虑在哪里调用(即将封装的内容加到业务代码中)

原文地址:https://www.cnblogs.com/llq1214/p/11162047.html