Spring IOC 和三种依赖注入方式 (通俗易懂,快速了解)

spring IOC 和三种依赖注入方式 (通俗易懂,快速了解)

IOC 就是 控制反转,也就是实现依赖于抽象,而不是抽象依赖于实现

怎么去理解上面这段话呢。直接举例子让大家感受一下。首先我写一个业务,需要从sql 数据库获取数据

然后执行业务代码返回的例子

理解IOC例子

抽象依赖于实现

基础层

public class SqlDB {

    public  void getsql(){
        System.out.println("从sql 获取数据");
    }
}

业务层

public class Busines {
    private SqlDB sqlDB=new SqlDB();

    public  void getData(){
        //需要拿到sql 的数据
        sqlDB.getsql();

        //拿到数据做后面的操作
        System.out.println("进行数据返回前端");

    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Busines busines = new Busines();
        busines.getData();
    }
}

从上面可以看出 Busines 类依赖于 sqlDB 类

万一这时候公司的业务发生改变,不用sql 要从其他数据库 ,比如Oracle 获取数据库,这样上面的代码就就不适用了,此时应该怎么办呢?

按照上面,肯定需要修改业务层代码

按上面代码只能这样改

首先增加一个类

public class OracleDB {

    public  void getOracle(){
        System.out.println("从oracle 获取数据");
    }
}

最后要修改业务类

public class Busines {
    //private SqlDB sqlDB=new SqlDB();
    private OracleDB oracleDB=new OracleDB();
    public  void getData(){
        //需要拿到sql 的数据
        //sqlDB.getsql();
        oracleDB.getOracle();
        //拿到数据做后面的操作
        System.out.println("进行数据返回前端");

    }
}

这样如果,再换一种数据库,又不适用了

实现依赖于抽象(IOC)

public interface DB {

    public  void getData();

}
public class SqlDB implements  DB{


    @Override
    public void getData() {
        System.out.println("从sql 获取数据库");
    }
}
public class OracleDB implements DB {
    @Override
    public void getData() {
        System.out.println("从oracle 获取数据");
    }
}
public class Busines {

    private  DB db;

    public void setDb(DB db) {
        this.db = db;
    }

    public  void getData(){
        //需要拿到各种sql 的数据
            db.getData();
        //拿到数据做后面的操作
        System.out.println("进行数据返回前端");

    }
}
public class Test {
    public static void main(String[] args) {
        Busines busines = new Busines();
        SqlDB sqlDB = new SqlDB();

        OracleDB oracleDB = new OracleDB();
       // busines.setDb(oracleDB);
        busines.setDb(sqlDB);
        busines.getData();
    }
}

可以看到,上面的代码如果你要想要增加一个其他渠道获取数据库的类,只需要增加,就可以了,不用改业务代码,

这就是反转**,实现要依赖于抽象**

依赖注入的三种方式

接着上面写过的代码

接口注入

添加一个接口类,通过接口的参数注入

public interface IBusines {
    public void crateDB(DB db);
}
public class Busines  implements IBusines {

    private  DB db;

    @Override
    public void crateDB(DB db) {
     this.db=db;
    }
    public  void getData(){
        //需要拿到各种sql 的数据
            db.getData();
        //拿到数据做后面的操作
        System.out.println("进行数据返回前端");

    }
}
public class Test {
    public static void main(String[] args) {
        Busines busines = new Busines();
        SqlDB sqlDB = new SqlDB();

        OracleDB oracleDB = new OracleDB();
       // busines.crateDB(oracleDB);
        busines.crateDB(sqlDB);
        busines.getData();
    }
}

set方法 注入

通过set方法进行注入属性

public class Busines {

private  DB db;

public void setDb(DB db) {
    this.db = db;
}

public  void getData(){
    //需要拿到各种sql 的数据
        db.getData();
    //拿到数据做后面的操作
    System.out.println("进行数据返回前端");

}
}

上面例子就是set 方式去注入的

构造方法注入

也是拿上面的例子,无非从set 方法换成构造器注入

public class Busines   {

    private  DB db;

    public Busines(DB db) {
        this.db = db;
    }

    public  void getData(){
        //需要拿到各种sql 的数据
            db.getData();
        //拿到数据做后面的操作
        System.out.println("进行数据返回前端");

    }
}
public class Test {
    public static void main(String[] args) {

        SqlDB sqlDB = new SqlDB();

        OracleDB oracleDB = new OracleDB();
       // busines.crateDB(oracleDB);
        Busines busines = new Busines(sqlDB);
        busines.getData();
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架提供了一个模块叫做Spring JDBC,它是一个用于简化JDBC开发的抽象层。Spring JDBC提供了JdbcTemplate类,该类封装了JDBC操作,使得开发者可以更加方便地使用JDBC进行数据库操作。下面是使用Spring JDBC连接数据库的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>4.0.3</version> </dependency> ``` 2.在Spring配置文件中配置数据源和JdbcTemplate: ```xml <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> ``` 3.在Java代码中使用JdbcTemplate进行数据库操作: ```java @Autowired private JdbcTemplate jdbcTemplate; public void addUser(User user) { String sql = "INSERT INTO user (name, age) VALUES (?, ?)"; jdbcTemplate.update(sql, user.getName(), user.getAge()); } public void updateUser(User user) { String sql = "UPDATE user SET name = ?, age = ? WHERE id = ?"; jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getId()); } public void deleteUser(int id) { String sql = "DELETE FROM user WHERE id = ?"; jdbcTemplate.update(sql, id); } public User getUserById(int id) { String sql = "SELECT * FROM user WHERE id = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class)); } public List<User> getAllUsers() { String sql = "SELECT * FROM user"; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); } ``` 上述代码中,我们使用JdbcTemplate的update()方法执行增删改操作,使用queryForObject()和query()方法执行查询操作。其中,BeanPropertyRowMapper类可以将查询结果映射为Java对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值