Spring(2)--具体思想

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

一、传统工程

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

  • jdk12
  • intellj编辑器
  • maven3.6


(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文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>com.spirng1</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>spring-01-ioc-basic</module>
    </modules>

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

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration> <!--让编译器使用本地的12版本jdk-->
                    <source>12</source>
                    <target>12</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

(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("测试");
    }
}






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

package com.dao;

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

分析:考虑业务场景

  • 若工程创建的类非常多,有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

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


xml文件。文件名随便取,这里是beans.xml
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--使用spring来创建对象,在spring称之为bean-->
        <bean id="hello" class="com.pojo.Hello">
            <property name="str" value="测试的值"/>
        </bean>
</beans>

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());
    }
}

分析:关系逻辑图如下


总结来说就是

beans.xml文件中要有

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

以上工程具体:

posted @ 2020-04-09 21:09  code906  阅读(123)  评论(0)    收藏  举报