【SpringIOC】程序的耦合度问题以及工厂模式解决
常见的耦合度问题
在没有使用Spring时,我们的service层需要使用dao对象,视图层需要使用到service对象,一旦其中一个对象缺失都会导致编译错误,而不是运行期异常
项目的结构如下,其中代码层层相关
dao层
service层
service实现类中使用dao的实现类,这是程序间的耦合
视图层
使用了service实现类,程序间的耦合
解决思路:一个创建Bean对象的工厂
Bean:在计算机英语中,有可重用组件的含义
JavaBean:用java语言编写的可重用组件。
javabean > 实体类(javabean不等同于实体类,是一个比实体类更大的范畴)
该工厂:创建我们的service对象和dao对象
第一步:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识符=全限定类名(key=value)
第二步:通过读取配置文件中配置的内容,反射创建对象(Class.forName(全限定类名))
我的配置文件可以是xml也可以使properties
实现
package com.czy.factory;
import java.io.IOException;
import java.util.Properties;
public class BeanFactory {
//保存配置文件的内容
private static Properties props;
static {
props = new Properties();
try {
props.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
} catch (IOException e) {
throw new ExceptionInInitializerError("初始化Properties失败");
}
}
public static Object getBean(String beanName){
Object bean = null;
try{
bean = Class.forName(props.getProperty(beanName)).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return bean;
}
}
解耦
特点
由于调用了newInstance(),表示了每次都会调用默认构造函数创建对象,这种写法创建的对象是多例的
工厂模式改进
通过map存放对象,实现创建单例对象。
改进1:延迟加载,用到对象时,才创建对象
package com.czy.factory;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
//保存配置文件的内容
private static Properties props;
private static Map<String,Object> map = new HashMap<String, Object>();
static {
props = new Properties();
try {
props.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
} catch (IOException e) {
throw new ExceptionInInitializerError("初始化Properties失败");
}
}
public static Object getBean(String beanName){
if(map.containsKey(beanName))
return map.get(beanName);
Object bean = null;
try{
bean = Class.forName(props.getProperty(beanName)).newInstance();
map.put(beanName,bean);
}catch (Exception e){
e.printStackTrace();
}
return bean;
}
}
改进2:立即加载,读取配置文件后立即创建对象
package com.czy.factory;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
//保存配置文件的内容
private static Properties props;
private static Map<String,Object> map;
static {
props = new Properties();
try {
props.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
map = new HashMap<String, Object>();
Enumeration keys = props.keys();
while(keys.hasMoreElements()){
String key = keys.nextElement().toString();
String value = (String)props.getProperty(key);
Object bean = Class.forName(value).newInstance();
map.put(key,bean);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化Properties失败");
}
}
/*public static Object getBean(String beanName){
if(map.containsKey(beanName))
return map.get(beanName);
Object bean = null;
try{
bean = Class.forName(props.getProperty(beanName)).newInstance();
map.put(beanName,bean);
}catch (Exception e){
e.printStackTrace();
}
return bean;
}*/
public static Object getBean(String beanName){
return map.get(beanName);
}
}
测试
package com.czy.ui;
import com.czy.factory.BeanFactory;
import com.czy.service.AccountService;
import com.czy.service.impl.AccountServiceImpl;
/**
* 模拟保存账户
*/
public class Client {
public static void main(String[] args) throws Exception{
for(int i = 0; i < 5; ++i){
AccountService service = (AccountService) BeanFactory.getBean("accountService");
// service.saveUser();
System.out.println(service);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!