Spring(2)--具体思想

传统的java工程,各种类之间都有强依赖的关系。

一、传统工程

演示,创建工程名为spring-01-ioc-basic,工程结构如下:
环境:

  • jdk12
  • intellj编辑器
  • maven3.6


    Spring(2)--具体思想_第1张图片

(1)创建com.dao的package包,里面两个文件UserDao和UserdDapImpl

UserDao文件

package com.dao;

public class UserDao implements UserDapImpl{
    public void getUser(){
        System.out.println("默认获取用户的数据");
    }
}

UserdDapImpl文件

package com.dao;

public interface UserDapImpl {
    void getUser();
}


(2)创建com.service的package包,里面两个文件UserService和UserdServiceImpl

UserService文件

package com.service;

import com.dao.UserDao;
import com.dao.UserDapImpl;

public class UserService implements UserServiceImpl {

    private UserDapImpl userDao = new UserDao();

    public void getUser(){
        userDao.getUser();
    }
}

UserdServiceImpl文件

public interface UserServiceImpl {
    void getUser();
}

(3)配置Maven文件,即pom.xml文件


    4.0.0

    org.example
    com.spirng1
    pom
    1.0-SNAPSHOT
    
        spring-01-ioc-basic
    

    
        
            org.springframework
            spring-webmvc
            5.2.0.RELEASE
        
    

    
        
            
                maven-compiler-plugin
                3.8.0
                 
                    12
                    12
                
            
        
    

(4)main函数入口

import com.dao.UserDao;
import com.service.UserService;

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

        //用户实际调用的是业务,dao层不需要接触!
        UserDao userDao = new UserDao();
        userDao.getUser();
        System.out.println("测试");
    }
}






Spring(2)--具体思想_第2张图片

如果有需求改动,如
在dao的package增加UserDaoMysql类,那么需要在两处改动

package com.dao;

public class UserDaoMysql implements UserDapImpl{
    public void getUser(){
        System.out.println("获取mysql数据库数据");
    }
}

Spring(2)--具体思想_第3张图片

分析:考虑业务场景

  • 若工程创建的类非常多,有1000个以上,各个类之间都有调用

  • 历史交接代码,在维护工作中,怎么方便改动

  • 即便有文档,但是如何厘清工程内部逻辑关系

结论:很明显,若是这样直接调用,一旦工程庞大,容易混乱。关键就在类与类之间关系如何解耦


二、spring改进(IOC)

对UserServicewen文件修改,改为get、set形式

package com.service;

import com.dao.UserDao;
import com.dao.UserDapImpl;

public class UserService implements UserServiceImpl {

    private UserDao userDao;

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    public void getUser(){
        userDao.getUser();
    }
}

对main入口修改

import com.dao.UserDao;
import com.service.UserService;

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

        //用户实际调用的是业务,dao层不需要接触!
        UserService userService = new UserService();

        ((UserService)userService).setUserDao(new UserDao());
        userService.getUser();
        System.out.println("测试");
    }
}

修改后
Spring(2)--具体思想_第4张图片

分析:
这种思想从本质上管理了对象的创建,统一了对象的管理。

  • 如果不想使用某个类,不传入对象即可,无需改动

  • 规避了谁用谁创建的原则,而由第三方经手



三、实际上Spring

接上面的分析。
既然由第三方处理,spring的处理方式由一个独立的xml文件
创建一个工程,工程结构如下:

Spring(2)--具体思想_第5张图片


xml文件。文件名随便取,这里是beans.xml



        
        
            
        

hello文件

package com.pojo;

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

main入口

import com.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args){
        //获取Spring的上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //我们的对象现在在spring的管理中,需要用直接取
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.getStr());
    }
}

分析:关系逻辑图如下

Spring(2)--具体思想_第6张图片
总结来说就是

beans.xml文件中要有

名称 说明
class路径 用于找到类的路径
class内的实例化属性名 用于对应属性赋值
id别名 与代码逻辑中类无关,只是方便context上下读取xml里的内容

以上工程具体:

你可能感兴趣的:(Spring(2)--具体思想)