Spring学习——程序间的依赖关系解决

25 篇文章 0 订阅

程序间的依赖关系。

在开发过程中一个项目是需要许多人共同完成的,类与类之间存在依赖关系,如果不解决依赖关系,A的类没有写完,B完全不能工作需要等待A写完才能写,要解决这个问题就需要使用反射功能解决,减少使用new XXX的使用创建实例,确保在写代码的时候编译过程中不报错。

 

开发时遵循的原则:

编译时不依赖,运行时才依赖。

解决依赖关系:

使用反射创建类对象。

 

使用反射创建类对象引发的新问题:

    使用配置文件,通过读取配置文件来反射创建类对象

比如数据库绑定驱动

Class.forName(“com.mysql.jdbc.Driver”);

模拟解决项目依赖的小实验

git@github.com:sorryapologize/springtest.git

//cn.pro.dao.ICustormerDao

package cn.pro.dao;


//模拟一个客户dao
public interface ICustormerDao {
	
	//保存客户
	void SaveCustormer();
}

cn.pro.dao.impl.ICustormerDaoimpl

package cn.pro.dao.impl;

import cn.pro.dao.ICustormerDao;

//模拟客户持久层实现类
public class ICustormerDaoimpl implements ICustormerDao{

	@Override
	public void SaveCustormer() {
		// TODO Auto-generated method stub
		System.out.println("持久层保存了客户");
	}

}

cn.pro.factory.BeanFactory

package cn.pro.factory;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

import cn.pro.dao.ICustormerDao;
import cn.pro.service.CustormerService;



public class BeanFactory {
	//读取properties文件
	
	//a 定义一个properties对象
	/*private static Properties props =null;
	
	//b定义静态代码块
	static{
		
		try {
			InputStream in = BeanFactory.class.getClassLoader()
					.getResourceAsStream("bean.properties");
			
			//InputStream in = new FileInputStream("src/bean.properties");  不要使用在web工程中会报空指针
			props.load(in);
		} catch (Exception e) {
			// TODO: handle exception
			throw new ExceptionInInitializerError("读取配置文件失败" + e);
		}
	}*/
	
	//1.上面那么多可用于下面一句    它只能用于读取properties文件别的文件读不了
	//2.只能用于读取,不能用于写入。
	//3.只能用于读取类路径下的文件
	//注意参数的写法是按照包名类名的方式写的,所以请不要写扩展名。
	private static ResourceBundle bundle= ResourceBundle.getBundle("bean");
	
	
	
	
	
	public static Object getBean(String beanName){
		try {
			//1.读取配置文件,根据beanName获取全限定类名
			//String beanPath=props.getProperty(beanName);
			
			String beanPath=bundle.getString(beanName);
			
			return Class.forName(beanPath).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}
	
	
	
	//下面方法的局限性比较大,一个方法只能返回一个对象
	/*public static CustormerService getCustormerService(){ 
		try {
			return (CustormerService) Class.forName("cn.pro.service.impl.CustormerServiceimpl").newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		
		
		
	}
	
	
	public static ICustormerDao getICustormerDao(){
		try {
			return (ICustormerDao) Class.forName("cn.pro.dao.impl.ICustormerDaoimpl").newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		
		
		
	}*/
}

cn.pro.service.CustormerService

package cn.pro.service;



//客户的业务实现接口
public interface CustormerService {
	void saveCustormer();
}

cn.pro.service.impl.CustormerServiceimpl

package cn.pro.service.impl;

import cn.pro.dao.ICustormerDao;
import cn.pro.dao.impl.ICustormerDaoimpl;
import cn.pro.factory.BeanFactory;
import cn.pro.service.CustormerService;


//客户的业务层实现层
public class CustormerServiceimpl implements CustormerService{
	
	//ICustormerDao custormerdao = new ICustormerDaoimpl();
	//ICustormerDao custormerdao = BeanFactory.getICustormerDao();
	private ICustormerDao custormerdao = (ICustormerDao) BeanFactory.getBean("CUSTORMERDAO");
	
	@Override
	public void saveCustormer() {
		// TODO Auto-generated method stub
		System.out.println("custormer saved!");
		custormerdao.SaveCustormer();
	}

}

cn.pro.ui.Client

package cn.pro.ui;

import cn.pro.factory.BeanFactory;
import cn.pro.service.CustormerService;
import cn.pro.service.impl.CustormerServiceimpl;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//CustormerService service = new CustormerServiceimpl();
		
		//上面代码改成下面代码就解决了依赖关系
		//CustormerService service =BeanFactory.getCustormerService();
		CustormerService service = (CustormerService) BeanFactory.getBean("CUSTORMERSERVICE");
		
		service.saveCustormer();
	}

}

改造上述main方法

for (int i=0;i<5;i++){
            CustormerService service = (CustormerService) BeanFactory.getBean("CUSTORMERSERVICE");
            
            //service.saveCustormer();
            System.out.println(service);
        }

输出:

cn.pro.service.impl.CustormerServiceimpl@8814e9
cn.pro.service.impl.CustormerServiceimpl@1503a3
cn.pro.service.impl.CustormerServiceimpl@1a1c887
cn.pro.service.impl.CustormerServiceimpl@743399
cn.pro.service.impl.CustormerServiceimpl@e7b241

当多个客户端访问的时候创建了多个对象,怎么改造上面代码,当多个客户端访问的时候只穿件一个对象。

改写代码cn.pro.factory.BeanFactory

package cn.pro.factory;

import java.beans.Beans;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;

import cn.pro.dao.ICustormerDao;
import cn.pro.service.CustormerService;



public class BeanFactory {
	//读取properties文件
	
	//a 定义一个properties对象
	/*private static Properties props =null;
	
	//b定义静态代码块
	static{
		
		try {
			InputStream in = BeanFactory.class.getClassLoader()
					.getResourceAsStream("bean.properties");
			
			//InputStream in = new FileInputStream("src/bean.properties");  不要使用在web工程中会报空指针
			props.load(in);
		} catch (Exception e) {
			// TODO: handle exception
			throw new ExceptionInInitializerError("读取配置文件失败" + e);
		}
	}*/
	
	//1.上面那么多可用于下面一句    它只能用于读取properties文件别的文件读不了
	//2.只能用于读取,不能用于写入。
	//3.只能用于读取类路径下的文件
	//注意参数的写法是按照包名类名的方式写的,所以请不要写扩展名。
	private static ResourceBundle bundle= ResourceBundle.getBundle("bean");
	
	//定义一个容器存放我们要使用的对象
	private static Map<String, Object> beans = new HashMap<String, Object>();
	
	//使用静态代码块初始化map
	static{
		try {
			//1.读取配置文件中所有的配置key的部分
			Enumeration<String> keys = bundle.getKeys();
			
			//2.遍历keys
			while (keys.hasMoreElements()) {
				//取出key
				String key = (String) keys.nextElement();
				//根据key获取beanpath
				String beanpath = bundle.getString(key);
				//根据beanpath反射创建类对象
				Object value = Class.forName(beanpath).newInstance();
				
				//把key和value存入map
				beans.put(key, value);
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new ExceptionInInitializerError("创建容器失败程序停止执行");
		}
	}
	
	
	
	public static Object getBean(String beanName){
		
		return beans.get(beanName);
	}
	
	
	
	//下面方法的局限性比较大,一个方法只能返回一个对象
	/*public static CustormerService getCustormerService(){ 
		try {
			return (CustormerService) Class.forName("cn.pro.service.impl.CustormerServiceimpl").newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		
		
		
	}
	
	
	public static ICustormerDao getICustormerDao(){
		try {
			return (ICustormerDao) Class.forName("cn.pro.dao.impl.ICustormerDaoimpl").newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		
		
		
	}*/
}

重新执行

cn.pro.service.impl.CustormerServiceimpl@e83912
cn.pro.service.impl.CustormerServiceimpl@e83912
cn.pro.service.impl.CustormerServiceimpl@e83912
cn.pro.service.impl.CustormerServiceimpl@e83912
cn.pro.service.impl.CustormerServiceimpl@e83912

可以看到service对象只有一个。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一种快速构建企业级应用的框架。在建立个人博客系统时,它可以帮助开发人员快速构建博客系统的后端架构,并使用其内置的自动配置功能为博客系统提供各种功能,如数据持久化、安全认证、文件上传和下载等。 使用 Spring Boot 开发个人博客系统可以解决以下问题: 1. 快速构建后端架构:Spring Boot 内置了许多常用的框架和库,可以帮助开发人员快速构建出博客系统的后端架构。 2. 自动配置功能:Spring Boot 可以自动配置许多常用的功能,如数据库连接、安全认证、文件上传下载等,使开发人员可以专注于开发业务逻辑。 3. 简化部署流程:Spring Boot 可以使用内置的 tomcat 服务器进行部署,简化了部署流程。 4. 提供企业级应用所需的功能:Spring Boot 提供了许多企业级应用所需的功能,如安全认证、数据持久化等,可以使个人博客系统更加完善。 ### 回答2: Spring Boot 个人博客系统是一款基于Spring Boot框架开发的博客系统,它能够解决以下问题: 1. 快速开发:Spring Boot框架提供了许多开箱即用的功能和组件,极大地简化了开发流程。其中包括自动配置、内嵌服务器、自动项目构建等,可以快速搭建一个功能完善的博客系统。 2. 简化部署:Spring Boot使用嵌入式服务器,如Tomcat或Jetty,可以将应用程序打包成一个可执行的JAR文件,只需执行一条命令即可启动应用程序,无需额外部署和配置服务器,极大地简化了部署流程。 3. 高度可定制:Spring Boot提供了丰富的配置选项和扩展点,可以根据个人需求进行灵活的定制。可通过配置文件进行自定义配置,也可以通过扩展Spring Boot的自动配置机制来引入额外的功能。 4. 高效性能:Spring Boot集成了很多优化的组件,如Spring MVC、Spring Data、Spring Security等,能够提供高性能的Web服务。此外,Spring Boot还支持异步处理、缓存机制等,可以进一步提升系统的响应速度和并发能力。 5. 微服务支持:Spring Boot天生支持构建微服务架构,可以将一个大型的博客系统拆分为多个小型的服务,每个服务专注于特定的功能,提高了系统的可维护性和可扩展性。 6. 生态系统丰富:Spring Boot是Spring生态系统的一部分,可以与其他Spring项目无缝集成,如Spring Cloud、Spring Security等。同时,Spring Boot还支持各种第三方库和工具的集成,如数据库、缓存、消息队列等。 综上所述,Spring Boot个人博客系统不仅能够提供快速开发和部署的能力,还能够提供高度定制性、高效性能、微服务支持以及丰富的生态系统,为个人博客的开发者提供了一个可靠和便捷的解决方案。 ### 回答3: Spring Boot个人博客系统是一种基于Spring Boot框架开发的博客系统,它能够解决以下几个问题: 1. 快速开发:Spring Boot个人博客系统采用了Spring Boot框架,这个框架提供了很多开箱即用的特性,如自动配置、快速构建等,极大地减少了开发者的开发时和精力,使得开发者能够更专注于业务逻辑的实现,从而实现快速开发。 2. 简化配置:Spring Boot个人博客系统采用了约定优于配置的原则,大部分的配置都可以通过少量的配置文件完成,大大简化了系统的配置工作。同时,Spring Boot还有一个在线配置工具——Spring Initializr,可以在线生成项目的初始配置,进一步减轻了配置的负担。 3. 整合丰富的开源组件:Spring Boot个人博客系统内置了许多常用的开源组件,如Thymeleaf模板引擎、Spring Data JPA、Spring Security等,这些组件都经过了充分的测试和验证,能够提供稳定、高效的功能实现。同时,Spring Boot还提供了自动配置功能,可以自动根据项目的依赖关系自动配置相关的组件,大大简化了整合的工作。 4. 响应式设计:Spring Boot个人博客系统支持响应式设计,可以很方便地适配不同的终端设备,如PC、手机、平板等,提供更好的用户体验。 总之,Spring Boot个人博客系统通过快速开发、简化配置、整合丰富的开源组件和响应式设计等特性,能够解决开发者在开发个人博客系统时遇到的瓶颈,提高开发效率,降低开发成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值