ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring IOC

2020-01-29 11:06:49  阅读:238  来源: 互联网

标签:UserServiceImpl service Spring void getUser IOC public


Spring IOC


IOC(控制反转:Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法。

没有IOC的程序中,我们使用的是面向对象编程,对象的创建与对象间依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后,将对象的创建交给了第三方,个人理解,控制反转就是:获取依赖对象的方式反转了。

利用XML方式配置Bean,Bean的定义信息和实现是分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方式是依赖注入(Dependency Injection,DI)


分析

在这里插入图片描述
原来的方式写代码:

1.先写一个UserDao接口

 public interface UserDao {
     public void getUser();
 }

2.再去写Dao的实现类

1  public class UserDaoImpl implements UserDao {
2      @Override
3      public void getUser() {
4          System.out.println("获取用户数据");
5      }
6  }

3.然后去写UserService的接口

1  public interface UserService {
2      public void getUser();
3  }

4.最后写Service的实现类

1  public class UserServiceImpl implements UserService {
2      private UserDao userDao = new UserDaoImpl();
3 
4      @Override
5      public void getUser() {
6          userDao.getUser();
7      }
8  }

5.测试

1  @Test
2  public void test(){
3      UserService service = new UserServiceImpl();
4      service.getUser();
5  }

当我们想要再增加一个实现类时,把Userdao的实现类增加一个

1  public class UserDaoMySqlImpl implements UserDao {
2      @Override
3      public void getUser() {
4          System.out.println("MySql获取用户数据");
5      }
6  }

若我们要去使用MySql的话 , 我们就需要去service实现类里面修改对应的实现 .

1  public class UserServiceImpl implements UserService {
2      private UserDao userDao = new UserDaoMySqlImpl();
3  
4      @Override
5      public void getUser() {
6          userDao.getUser();
7      }
8  }

在假设, 我们再增加一个Userdao的实现类 .

1  public class UserDaoOracleImpl implements UserDao {
2      @Override
3      public void getUser() {
4          System.out.println("Oracle获取用户数据");
5      }
6  }

当我们要用Oracle ,又需要去service实现类里面修改对应的实现 ,而当这种需求十分大时,可想而知操作是十分繁琐的,因此我们要如何去解决,让变动变得简单呢?

我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下

 1  public class UserServiceImpl implements UserService {
 2      private UserDao userDao;
 3      // 利用set实现
 4      public void setUserDao(UserDao userDao) {
 5          this.userDao = userDao;
 6      }
 7  
 8      @Override
 9      public void getUser() {
10          userDao.getUser();
11      }
12  }

再进行一次测试:

1  @Test
2  public void test(){
3      UserServiceImpl service = new UserServiceImpl();
4      service.setUserDao( new UserDaoMySqlImpl() );
5      service.getUser();
6      //那我们现在又想用Oracle去实现呢
7      service.setUserDao( new UserDaoOracleImpl() );
8      service.getUser();
9  }

当利用了set接口时,程序已经发生了根本性变化,以前所有东西都是由程序去进行控制创建 , 而现在是由我们自行控制创建对象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了 . 它只负责提供一个接口 .

这种思想 , 从本质上解决了问题 , 我们程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型 !

使用XML

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。


编写HelloSpring
在这里插入图片描述

首先要导入Spring相关jar包:(pom中可加,当然要有maven)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.10.RELEASE</version>
</dependency>

1.编写一个Hello实体类

 public class Hello {
     private String name;
 
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
 
     public void show(){
         System.out.println("Hello"+ name );
     }
 }

2.写编写我们的spring文件 , 这里我们命名为beans.xml

 1  <?xml version="1.0" encoding="UTF-8"?>
 2  <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5          http://www.springframework.org/schema/beans/spring-beans.xsd">
 6  
         <!--使用Spring来创建对象,在Spring这些都称为Bean

          类型 变量名 = new 类型();
          Hello hello = new Hello();

          id = 变量名
          class = new 的对象
          property 相当于给对象中的属性设置一个值!
          -->
    
        
 7      <!--bean就是java对象 , 由Spring创建和管理-->
 8      <bean id="hello" class="com.kuang.pojo.Hello">
 9          <property name="name" value="Spring"/>
10      </bean>
11  
12  </beans>

3.我们可以去进行测试了 .

 @Test
 public void test(){
     //解析beans.xml文件 , 生成管理相应的Bean对象
     ApplicationContext context = newClassPathXmlApplicationContext("beans.xml");
     //getBean : 参数即为spring配置文件中bean的id .
     Hello hello = (Hello) context.getBean("hello");
     hello.show();
 }


//结果:Hello{str='Spring'}

思考问题 ?

  • Hello 对象是谁创建的 ?

    hello 对象是由Spring创建的

  • Hello 对象的属性是怎么设置的 ?

    hello 对象的属性是由Spring容器设置的 ,

这个过程就叫控制反转 :

控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的 .

反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

依赖注入 : 就是利用set方法来进行注入的.

IOC是一种编程思想 , 由主动的编程变成被动的接收 .

可以通过newClassPathXmlApplicationContext去浏览一下底层源码 .

到了现在 , 我们彻底不用再程序中去改动了 , 要实现不同的操作 , 只需要在xml配置文件中进行修改 , 所谓的IoC,一句话搞定 : 对象由Spring 来创建 , 管理 , 装配** !


对一开始的例子用xml实现IOC思想:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "mysqlImpl" class="com.qzz.dao.UserDaoMysqlImpl"/>
    <bean id = "oracleImpl" class="com.qzz.dao.UserDaoOracleImpl"/><!--说明在Spring中这些被托管了-->
    <bean id = "DaoImpl" class="com.qzz.dao.UserDaoImpl"/>

    <bean id="UserServiceImpl" class="com.qzz.service.UserServiceImpl">
        <property name="userDao" ref="mysqlImpl"/>
    </bean>

    <!--
    ref: 引用Spring容器中创建好的对象
    value: 具体的值,基本数据类型
    -->

测试:

public class MyTest {
    public static void main(String[] args) {
        //以Spring方式   获取ApplicationContext; 拿到Spring的容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        //容器在手,天下我有,需要什么,就直接get什么!
        UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");

        userServiceImpl.getUser();
    }

想要变动,如使用oracle,只需要改动xml文件中所绑定的"com.qzz.service.UserServiceImpl"中 ref

    <bean id="UserServiceImpl" class="com.qzz.service.UserServiceImpl">
        <property name="userDao" ref="mysqlImpl"/>
    </bean>

(本文引用狂神老师spring一文格式,老师所写非常好,故引用写入自己博客,方便回顾知识)

                                     2020.1.29/周三
                                     by 922
TYLGOBL 发布了28 篇原创文章 · 获赞 20 · 访问量 3万+ 私信 关注

标签:UserServiceImpl,service,Spring,void,getUser,IOC,public
来源: https://blog.csdn.net/weixin_42819857/article/details/104105012

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有