Spring核心之Ioc容器

JAVA学习网 2020-09-17 13:22:03

spring框架

  Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

  ◆目的:解决企业应用开发的复杂性
  ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
  ◆范围:任何Java应用
  Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

起源

  为了解决企业应用开发的复杂性,悉尼大学音乐学博士Rod Johnson开发了Spring Framework

Ioc

  如果此时我们有一个需求是获取用户的数据,按照三层架构代码如下

1 //UserDao接口
2 public interface UserDao {
3     void query();
4 }
1 //UserDao接口其中的一个实现类
2 public class MysqlUserDao implements UserDao {
3     @Override
4     public void query() {
5         System.out.println("使用Mysql数据库查询用户");
6     }
7 }
1 //业务层接口
2 public interface Userservice {
3     void query();
4 }
1 //业务层实现类
2 public class UserserviceImpl implements Userservice {
3     private UserDao userDao = new MysqlUserDao();
4     @Override
5     public void query() {
6         userDao.query();
7     }
8 }
1 //用户调用业务层代码
2 public static void main(String[] args) {
3     Userservice userservice = new UserserviceImpl();
4     userservice.query();
5 }

  

  此时只有一个业务方法的话这样写没有什么问题,但是如果在添加一个Oracle实现类,则必然需要修改业务层代码

1 //Oracle数据库实现类
2 public class OracleUserDao implements UserDao {
3     @Override
4     public void query() {
5         System.out.println("使用Oracle数据库查询用户");
6     }
7 }

  

 

  就像这样,程序耦合度太高,维护成本十分昂贵

 

   private UserDao userDao = new MysqlUserDao(); 需修改为 private UserDao userDao = new OracleUserDao();

   如果在添加一个又要修改实例化对象,添加多少次程序员就需修改多少次代码

  此时代码的控制权在程序员手上,改动代码需程序员修改对象实例化

  解决方案:在业务层上不在实例化对象,而是给Dao接口一个set方法,此时程序控制权不在程序员而在用户本身,用户需要使用那种方法就可以直接set注入,不在需要程序员改动代码。

1    private UserDao userDao ;
2     public void setUserDao(UserDao userDao) {
3         this.userDao = userDao;
4     }
1     //用户调用业务层代码
2     public static void main(String[] args) {
3         /*Userservice userservice = new UserserviceImpl();
4         userservice.query();*/
5         Userservice userservice = new UserserviceImpl();
6         ((UserserviceImpl)userservice).setUserDao(new OracleUserDao());
7         userservice.query();
8     }

 

  现在业务层想使用哪个类用户自己set注入就可以实现,使代码发生了革命性的变化,不需要在为了添加新功能而改变程序代码。

 

 使用Ioc降低了程序的耦合度,对象之间不在直接访问,而是交由Ioc容器管理。

 

总结

  以上是Ioc(控制反转)核心思想,将程序控制权从程序员改变为用户本身,实现了一定程度上的解耦。在Spring中Ioc是一个容器,负责管理创建对象和管理对象之间的依赖

阅读(2536) 评论(0)