传统的java工程,各种类之间都有强依赖的关系。
一、传统工程
演示,创建工程名为spring-01-ioc-basic,工程结构如下:
环境:
(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
(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
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里的内容 |
以上工程具体: