概述
01 基本信息
spring解决企业开发的难度,减轻对项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系。
02 优点
- 轻量:Spring框架使用的jar都比较小,运行占用的资源少,运行效率高,不依赖其他的jar
- 针对接口编程,解耦合
- Spring提供了Ioc控制反转,由容器管理对象,对象之间的依赖关系
- 原来在程序代码中的对象创建方式,现在由容器完成,对象之间的依赖解耦合
- Aop编程的支持
- 通过Spring提供的AOP功能,方便进行面向切面的的编程,许多不容易用传统OOP实现的功能通过AOP轻松应对
- 方便集成各种优秀的框架
03 工厂设计模式
3.1 原来的编码方式出来的问题
- UserDao
package com.spring.basic;
public interface UserDao {
public void register(User user);
public void login(User user);
}
- UserDaoImpl
package com.spring.basic;
public class UserDaoImpl implements UserDao{
@Override
public void register(User user) {
System.out.println("注册 " + user);
}
@Override
public void login(User user) {
System.out.println("登录 " + user);
}
}
- UserService
package com.spring.basic;
public interface UserService {
public void register(User user);
public void login(User user);
}
- UserServiceImpl
package com.spring.basic;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void register(User user) {
userDao.register(user);
}
@Override
public void login(User user) {
userDao.login(user);
}
}
- 调用
import com.spring.basic.User;
import com.spring.basic.UserService;
import com.spring.basic.UserServiceImpl;
import org.junit.Test;
public class Demo {
@Test
public void test1(){
UserService userService = new UserServiceImpl();
User user = new User("freedom","123456");
userService.login(user);
userService.register(user);
}
}
问题
- 代码直接的耦合度比较高,一方发生改变,另外一方就要发生改变;如果说之后我不想要这个实现类了,会直接修改代码
- 简单来讲,就是把接口的实现类,硬编码到程序中,如果说 我之后给
UserService
这个接口,换一个实现类,会直接修改Demo这个类的代码,不符合对拓展开发,对修改关闭的设计原则
3.2 反射工厂
- 创建一个工厂,我们需要什么对象,从工厂中拿就行了
- 这样的好处就是:如果说我们以后不想要现在的这个接口实现类的时候,我们只需要在配置文件中进行修改实现类名称即可
步骤一:创建一个配置文件 application.properties
userService = com.spring.basic.UserServiceImpl
userDao = com.spring.basic.UserDaoImpl
步骤二:创建工厂
- 将 接口的实现类名称 放在配置文件中,通过 反射 进行创建对象
package com.spring.basic;
import java.io.*;
import java.util.Properties;
public class BeanFactory {
private BeanFactory(){}
public static Properties properties = new Properties();
static{
//从配置文件中读取信息
try {
properties = new Properties();
//从配置文件中读取信息
InputStream resourceAsStream = BeanFactory.class.getClassLoader().getResourceAsStream("/applicationContext.properties");
properties.load(resourceAsStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object getBean(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c = Class.forName(properties.getProperty(className));
Object res = c.newInstance();
return res;
}
}
步骤三:调用
UserService userService =(UserService) BeanFactory.getBean("userService");
User user = new User("freedom","123456");
userService.login(user);
userService.register(user);
04 总结
在工厂设计模式中,我们需要自己去创建这个工厂
完成解耦合,现在,Spring框架为我们提供了这个工厂 (ApplicatonContext)
- 这里的
ApplicationContext
,就相当于我们在工厂模式之下的BeanFactory
- 工厂模式之下的配置文件就是这里的
applicationContext.properties