Spring框架简介①

Spring是一个开源框架, 采用bean来替换ejb。从简单性、可测试性、和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。

下面简单介绍一下在没有使用Spring框架的时候直接new 一个bean的过程(比较繁琐)

简单java工程截图:

dao层:

UserDao.java

package com.rl.spring.dao;

public interface UserDao {

    public void save();
}

UserDaoImpl.java

package com.rl.spring.dao.impl;

import com.rl.spring.dao.UserDao;

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("user被保存了!");
    }
}

UserService.java

package com.rl.spring.service;

public interface UserService {

    public void save();
}

UserServiceImpl.java

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.dao.impl.UserDaoImpl;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();
    
    @Override
    public void save() {
        userDao.save();
    }
}

测试代码:

package com.rl.spring.service;

import org.junit.jupiter.api.Test;

import com.rl.spring.service.impl.UserServiceImpl;

class UserServiceTest {

    UserService userService = new UserServiceImpl();
    
    @Test
    void testSave() {
        userService.save();
    }
}

控制台输出:

user被保存了!

这种自己new的bean有一个非常不好的地方在于高耦合, 我们做程序讲究低耦合, 高内聚, 这种自己new的形式有了一种侵入性.

可以将上面的例子做个修改: 增加一个工厂bean

如图:

FactoryBean.java

package com.rl.spring.factory;

import com.rl.spring.dao.UserDao;
import com.rl.spring.dao.impl.UserDaoImpl;

public class FactoryBean {

    public static UserDao getDao(String name) {
        if(name == "userDao") {
            return new UserDaoImpl();
        }
        return null;
    }
}

修改UserServiceImpl.java

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.factory.FactoryBean;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

//    private UserDao userDao = new UserDaoImpl();
    
    //利用工厂Bean的形式来获得Dao
    private UserDao userDao = new FactoryBean().getDao("userDao");
    
    @Override
    public void save() {
        userDao.save();
    }
}

这样就解决了侵入性的问题, 这种方式同样也是Spring的实现逻辑, Spring需要配置文件来配置, 并把你具体需要的bean利用Factory来创建.

控制反转就是应用本身不负责对象的创建和维护, 对象和依赖对象创建完全交给Spring的容器去管理和维护, 这个权利反转给容器.

控制反转和依赖注入其实是一个概念, 达到了大大降低耦合性的目的(解耦分层), 

猜你喜欢

转载自blog.csdn.net/ip_JL/article/details/81462638