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的容器去管理和维护, 这个权利反转给容器.
控制反转和依赖注入其实是一个概念, 达到了大大降低耦合性的目的(解耦分层),