深入探索spring技术内幕(三): 剖析spring IoC工作原理和配置依赖注入

发布时间:2016-10-21 JAVA 测试 PYTHON

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、前言

IOC (Inverse of control) - 控制反转,spring的IOC实现原理为利用Java的反射机制并充当工厂的角色完成对象的装配和注入。 

 

二、实现细节

类结构:

该例子需要导入以下jar包

① Dao接口类: PersonDao

public interface PersonDao {
	public void save();
}

② Dao实现类: PersonDaoImpl

import com.zdp.dao.PersonDao;

public class PersonDaoImpl implements PersonDao {
	public void save(){
		System.out.println("执行PersonDaoImpl中的save()方法");
	}
}

③ Service接口类: PersonService

public interface PersonService {  
    public void save();  
}  

④ Service实现类: PersonServiceImpl

import com.zdp.dao.PersonDao;
import com.zdp.service.PersonService;

public class PersonServiceImpl implements PersonService {
	private PersonDao personDao;
	private String name;
	private Integer id;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public PersonDao getPersonDao() {
		return personDao;
	}

	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

	public void save() {
		System.out.println("id: " + id + ", name: " + name);
		personDao.save();
	}
}

⑤ Bean定义类: BeanDefinition


import java.util.ArrayList;
import java.util.List;

/**
 * 封装Bean
 * @author zhangjim
 */
public class BeanDefinition {
	private String id;
	private String className;
	private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();
	
	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	public List<PropertyDefinition> getPropertys() {
		return propertys;
	}
	public void setPropertys(List<PropertyDefinition> propertys) {
		this.propertys = propertys;
	}
}

⑥ 属性定义类: PropertyDefinition

/**
 * 封装属性
 * @author zhangjim
 */
public class PropertyDefinition {
	private String name;
	private String ref;
	private String value;
	
	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public PropertyDefinition(String name, String ref, String value) {
		this.name = name;
		this.ref = ref;
		this.value = value;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRef() {
		return ref;
	}
	public void setRef(String ref) {
		this.ref = ref;
	}
}

⑦ Bean工厂类: ClassPathXMLApplicationContext

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;

/**
 * Spring Bean Factory
 */
public class ClassPathXMLApplicationContext {
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	private Map<String, Object> sigletons = new HashMap<String, Object>();

	public ClassPathXMLApplicationContext(String filename) {
		this.readXML(filename);
		this.instanceBeans();
		this.injectObject();
	}

	/**
	 * 为bean对象的属性注入值
	 */
	private void injectObject() {
		for (BeanDefinition beanDefinition : beanDefines) {
			Object bean = sigletons.get(beanDefinition.getId());
			if (bean != null) {
				try {
					PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					for (PropertyDefinition propertyDefinition : beanDefinition.getPropertys()) {
						for (PropertyDescriptor properdesc : ps) {
							if (propertyDefinition.getName().equals(properdesc.getName())) {
								Method setter = properdesc.getWriteMethod(); // 获取属性的setter方法 
								if (setter != null) {
									Object injectBean = null; 
									if (propertyDefinition.getRef() != null && !"".equals(propertyDefinition.getRef().trim())) {
										injectBean = sigletons.get(propertyDefinition.getRef());
									} else {
										injectBean = ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
									}
									setter.setAccessible(true); // private method
									setter.invoke(bean, injectBean); // 把引用对象注入到属性
								}
								break;
							}
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 完成bean的实例化
	 */
	private void instanceBeans() {
		for (BeanDefinition beanDefinition : beanDefines) {
			try {
				if (beanDefinition.getClassName() != null && !"".equals(beanDefinition.getClassName().trim()))
					sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 读取xml配置文件
	 * 
	 * @param filename
	 */
	private void readXML(String filename) {
		SAXReader saxReader = new SAXReader();
		Document document = null;
		try {
			URL xmlpath = this.getClass().getClassLoader().getResource(filename);
			document = saxReader.read(xmlpath);
			Map<String, String> nsMap = new HashMap<String, String>();
			nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空间
			XPath xsub = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean查询路径
			xsub.setNamespaceURIs(nsMap);// 设置命名空间
			List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点
			for (Element element : beans) {
				String id = element.attributeValue("id");// 获取id属性值
				String clazz = element.attributeValue("class"); // 获取class属性值
				BeanDefinition beanDefine = new BeanDefinition(id, clazz);
				XPath propertysub = element.createXPath("ns:property");
				propertysub.setNamespaceURIs(nsMap);// 设置命名空间
				List<Element> propertys = propertysub.selectNodes(element);
				for (Element property : propertys) {
					String propertyName = property.attributeValue("name");
					String propertyRef = property.attributeValue("ref"); 
					String propertyValue = property.attributeValue("value");
					PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName, propertyRef, propertyValue);
					beanDefine.getPropertys().add(propertyDefinition);
				}
				beanDefines.add(beanDefine);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取bean实例
	 * 
	 * @param beanName
	 * @return
	 */
	public Object getBean(String beanName) {
		return this.sigletons.get(beanName);
	}
}

这里为核心代码,当然在实际情况中,这一块要复杂的多, 例如:可以一个bean引用另一个bean,还可以有多个配置文件、通过多种方式载入配置文件等等,

不过原理还是采用Java的反射机制。

⑧ beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
           
    <bean id="personDao" class="com.zdp.dao.impl.PersonDaoImpl"></bean>
    <bean id="personService" class="com.zdp.service.impl.PersonServiceImpl">
    	<property name="personDao" ref="personDao"/>
    	<property name="name" value="zhangsan"/>
    	<property name="id" value="123"/>
    </bean>
</beans>

⑨ 单元测试

import org.junit.Test;
import com.zdp.myspring.ClassPathXMLApplicationContext;
import com.zdp.service.PersonService;

public class PersonServiceImplTest {
	@Test
	public void testSave() {
		ClassPathXMLApplicationContext ctx = new ClassPathXMLApplicationContext("beans.xml");
		PersonService personService = (PersonService)ctx.getBean("personService");
		personService.save();
	}
}

上文仅仅是简单地模拟了spring的IOC的实现,虽然只是完成了spring中依赖注入的一小部分,但还是很好地展现了Java反射机制在spring中的应用,对于初学者理解IOC应该会有一点帮助。 

源码下载地址: http://download.csdn.net/detail/zdp072/7330769

 

 

三、spring的依赖注入

1. 使用构造函数注入:

<bean id="personDao" class="com.zdp.dao.impl.PersonDaoImpl" /> 
<bean id="personService" class="com.zdp.service.impl.PersonServiceImpl">
       <constructor-arg index="0" ref="personDao" />
</bean>
public class PersonServiceImpl implements PersonService {
	private PersonDao personDao;
	public PersonServiceImpl(PersonDao personDao) {
		this.personDao = personDao;
	}
	public void save() {
		personDao.save();
	}
}

2. setter方法注入:

注入对象, 基本属性, 集合

<bean id="personDao" class="com.zdp.dao.impl.PersonDaoImpl" />
	<bean id="personService" class="com.zdp.service.impl.PersonServiceImpl">
		<!-- 
			<property name="personDao"> 
				<ref bean="personDao"/> 
			</property> 
		-->
		<property name="personDao" ref="personDao" />
		<property name="name" value="zhangsan" />
		<property name="id" value="123" />
		<property name="sets">
			<set>
				<value>1</value>
				<value>2</value>
			</set>
		</property>
		<property name="lists">
			<list>
				<value>1</value>
				<value>2</value>
				<value>3</value>
			</list>
		</property>
		<property name="maps">
			<map>
				<entry key="1" value="1"></entry>
				<entry key="2" value="2"></entry>
				<entry key="3" value="3"></entry>
				<entry key="4" value="4"></entry>
			</map>
		</property>
	</bean>

对应Java类:

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.zdp.dao.PersonDao;
import com.zdp.service.PersonService;

public class PersonServiceImpl implements PersonService {
	private PersonDao personDao;
	private String name;
	private Integer id;
	private Set<String> sets;
	private List<String> lists;
	private Map<String, String> maps;

	// 省略get set方法

	public void save() {
		System.out.println("id: " + id + ", name: " + name);
		System.out.println("sets: " + sets.size() + ", lists: " + lists.size() + ", maps: " + maps.size());
		personDao.save();
	}
}

3. 使用注解注入:

具体内容见第四章: http://blog.csdn.net/zdp072/article/details/25558563

转载于:https://my.oschina.net/u/2381372/blog/761768

更多相关推荐


《彻底解决分布式系统一致性问题》学习笔记

发布时间:2017-07-11 测试 运维 数据库
《彻底解决分布式系统一致性问题》直播者:李艳鹏笔记作者:JKXQJ一致性问题产生的背景JEE架构:WEB容器—组合业务逻辑—&gt;EJB容器—数据存ORM—&gt;数据库SSH架构:StrutsMVC—组合业务逻辑—&gt;Spring容器—HibernateORM–&gt;数据库WebService:WebService–&gt;注册服务(WSDL、UDDI)–&gt;发现服务(UDDI)–&...

java计算机毕业设计图书共享系统源码+系统+数据库+lw文档+mybatis+运行部署

发布时间:2022-09-01 MYBATIS JAVA MYSQL
java计算机毕业设计图书共享系统源码+系统+数据库+lw文档+mybatis+运行部署java计算机毕业设计图书共享系统源码+系统+数据库+lw文档+mybatis+运行部署本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5...

java毕业生设计学校食堂订餐管理计算机源码+系统+mysql+调试部署+lw

发布时间:2022-09-17 JAVA 开发语言 SPRING
java毕业生设计学校食堂订餐管理计算机源码+系统+mysql+调试部署+lwjava毕业生设计学校食堂订餐管理计算机源码+系统+mysql+调试部署+lw本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址...

java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档

发布时间:2022-09-27 JAVA 开发语言
java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:h...

java计算机毕业设计图书馆管理系统演示录像源代码+数据库+系统+lw文档

发布时间:2022-09-28 JAVA 前端 开发语言
java计算机毕业设计图书馆管理系统演示录像源代码+数据库+系统+lw文档java计算机毕业设计图书馆管理系统演示录像源代码+数据库+系统+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:htt...

java计算机毕业设计青少年心理健康教育平台演示录像2020源代码+数据库+系统+lw文档

发布时间:2022-09-21 JAVA JVM 开发语言
java计算机毕业设计青少年心理健康教育平台演示录像2020源代码+数据库+系统+lw文档java计算机毕业设计青少年心理健康教育平台演示录像2020源代码+数据库+系统+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQ...

java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档1

发布时间:2022-09-27 JAVA 开发语言
java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档1java计算机毕业设计体育场馆预定网站演示录像源代码+数据库+系统+lw文档1本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址...

java计算机毕业设计图书管理系统演示录像源代码+数据库+系统+lw文档

发布时间:2022-09-28 JAVA 前端 开发语言
java计算机毕业设计图书管理系统演示录像源代码+数据库+系统+lw文档java计算机毕业设计图书管理系统演示录像源代码+数据库+系统+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:https...

springboot 集成 vue

发布时间:2020-03-22 NODEJS LINUX WINDOWS PYTHON JAVA
eclipse 部署好springboot环境,能成功运行。 部署过程见我的其他博客,这里就不过多说。  2. https://www.runoob.com/vue2/vue-install.html  3.下载node.js  下载地址:https://nodejs.org/zh-cn/  (或者https://nodejs.org/en/download/) 右上角有中文切换。   我下载了1...

Dwz手册的补充说明和常见问题

发布时间:2019-06-17 前端框架 JSON PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; 1、我如何在项目中使用dwz?手册中有如下说明: 设计思路第一次打开页面时载入界面到客户端, 之后和服务器的交互只是数据交互, 不占用界面相关的网络流量.支持HTML扩展方式来调用DWZ组件.标准化Ajax开发, 降低Ajax开发成本. 也就是说,只需要在一个页面(通常是起始页,如index.aspx/index.php)包...

Python入门基础讲解(十九):多进程简介

发布时间:2022-11-03 PYTHON基础讲解 开发语言 PYTHON
Python新手入门教程视频免费在线观看https://space.bilibili.com/3461579964156657前面的文章讲了多线程,今天我们学习多进程多进程的概念在Python中,想要实现多任务可以使用多进程来完成。进程的概念进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的qq,微信...

【盘点】深度学习最常用到的20个Python库

发布时间:2018-10-08 人工智能 数据结构与算法 PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;核心库与统计NumPy我们从科学应用程序库开始说起,NumPy是该领域的主要软件包之一。它旨在处理大型多维数组和矩阵,并且广泛的高级数学函数和实现的方法集合,使得可以使用这些对象执行各种操作。在这一年中,NumPy有很多更新。除了错误修复和兼容性问题之外,关键更新还包括NumPy对象的打印格式。此外,某些函数现在可以处理Pyt...

Java排序汇总

发布时间:2009-11-30 算法 STRING PIVOT DATASET RANDOM JAVA
packagecom.wepull.jbs.lesson4; importjava.util.Random; /** *排序测试类 * *排序算法的分类如下: *1.插入排序(直接插入排序、折半插入排序、希尔排序); *2.交换排序(冒泡泡排序、快速排序); *3.选择排序(直接选择排序、堆排序); *4.归并排序; *5.基数排序。 * *关于排序方法的选择: *(1)若n较小(如n≤50),可...

python+selenium问题随记

发布时间:2018-01-11 PYTHON
1、用PhantomJS跑程序,莫名遇到有些元素的text不能读取,后来发现,PhantomJS运行时也需要最大化,不是全屏模式的话也和界面浏览器一样会造成压盖无法读取信息,开始以为是PhantomJS不好用,现在看来它还是比较稳定的无界面浏览器2、发现了使Chrome浏览器无界面运行的工具,pyvirtuldisplay,其需要安装依赖包xvfb,几经折腾之后发现xvfb没有windows的版本...

基于离散数据的空间曲面生成

发布时间:2022-11-06 PYTHON
基于等高线生成三维曲面,自动产生多层importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromscipyimportinterpolatefromscipy.interpolateimportgriddatafrommpl_toolkits.mplot3dimportAxes3Dfrommatplotlib.triimportTr...

第P9周:YOLOv5-Backbone模块实现

发布时间:2022-11-25 深度学习 人工智能 PYTHON
本文为🔗365天深度学习训练营内部限免文章(版权归K同学啊所有)参考本文所写记录性文章,请在文章开头注明以下内容,复制粘贴即可●🍨本文为🔗365天深度学习训练营中的学习记录博客●🍦参考文章:Pytorch实战|第P9周:YOLOv5-Backbone模块实现(训练营内部成员可读)●🍖原作者:K同学啊|接辅导、项目定制本次我将利用YOLOv5算法中的Backbone模块搭建网络,后续理论部分介绍将在...

单目标跟踪--KCF算法(核化相关滤波算法)Python实现(超详细)

发布时间:2022-11-16 算法 目标跟踪 PYTHON 计算机视觉 NUMPY
Tracking-KCFAlgorithm注:本文涉及的算法的代码实践已上传至GitHub,恳求大佬们指点!^_^1.目标检测跟踪与算法背景概述​目标跟踪任务在许多的计算机视觉系统中都是极为关键的一个组成部分。对于任意给定的一个初始图像的Patch(Filter滑过的区域),目标跟踪任务的目的在于训练一个分类器来将待跟踪的目标与它所处的环境区分开,为了能够在后续帧中能继续检测到这个目标,分类去需要...

JVM-并发垃圾回收

发布时间:2022-10-12 JAVA 算法 JVM
GC停顿:拷贝算法中,对象地址会发生移动,让业务线程全部停下来,等GC完成对象地址的调整后再工作。并发:Concurrent指GC线程和业务线程同时工作。并行:Parallel    指多个GC线程同时工作。1.分代垃圾回收算法原理:将堆分为年轻代和老年代,年轻代使用copy算法scavenge,老年代使用mark-sweep晋升:年轻代发生GC频率高于老年代,每经历一次GC存活下来的对象age+...

NLP入门(七)中文预处理之繁简体转换及获取拼音

发布时间:2019-02-01 爬虫 PYTHON 人工智能
  在日常的中文NLP中,经常会涉及到中文的繁简体转换以及拼音的标注等问题,本文将介绍这两个方面的实现。  首先是中文的繁简体转换,不需要使用额外的Python模块,至需要以下两个Python代码文件即可:langconv.py 地址: https://raw.githubusercontent.com/skydark/nstools/master/zhtools/langconv.pyzh_wi...

B.3 字典

发布时间:2018-12-27 测试 数据结构与算法
  在框架中,字典的选择要比列表少得多。只有三个主流的非并发IDictionary&lt;TKey,TValue&gt;实现,此外还有ExpandoObject(第14章已介绍过)、ConcurrentDictionary(将在介绍其他并发集合时介绍)和RouteValueDictionary(用于路由Web请求,特别是在ASP.NETMVC中)也实现了该接口。  注意,字典的主要目的在于为值提供...

java毕业设计闲置物品交易系统mybatis+源码+调试部署+系统+数据库+lw

发布时间:2022-11-24 MYBATIS JAVA 数据库
java毕业设计闲置物品交易系统mybatis+源码+调试部署+系统+数据库+lwjava毕业设计闲置物品交易系统mybatis+源码+调试部署+系统+数据库+lw本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0...

基于javaweb的教师师资管理系统(java+ssm+jsp+bootstrap+mysql)

发布时间:2022-10-25 JAVA MYSQL BOOTSTRAP
基于javaweb的教师师资管理系统(java+ssm+jsp+bootstrap+mysql)运行环境Java≥8、MySQL≥5.7、Tomcat≥8开发工具eclipse/idea/myeclipse/sts等均可配置运行适用课程设计,大作业,毕业设计,项目练习,学习演示等功能说明基于javaweb+mysql的教师师资管理系统(java+SSM+JSP+bootstrap+Mysql)项目...

struts2中请求的处理流程

发布时间:2009-06-19 JAVA WEB.XML 数据库
这个架构实际上又是如何工作的呢?初始请求先发送到服务器小程序容器(譬如Tomcat),然后通过一系列过滤器传送。如果与SiteMesh插件等其他技术集成,可选的ActionContextCleanUp过滤器就很有用,要是用到这个过滤器,请求先通过它传送。接着,调用请求的FilterDispatcher,它使用ActionMapper来确定要不要为这个请求调用动作。如果ActionMapper确定应...

knn算法笔记(2)

发布时间:2022-10-26 算法 机器学习 PYTHON
一.代码importnumpyasnpimportoperatorfromosimportlistdir#构建分类器defknn(testdata,traindata,labels,k):tempdata=np.tile(testdata,(traindata.shape[0],1))#将测试数据复制成与训练数据同等规格的矩阵tempdata=testdata-traindata#计算坐标之间的差...

Python进行数据分析学习笔记(2/14)

发布时间:2022-11-25 学习 数据分析 PYTHON数据分析 PYTHON
Python语言基础与Jupyternotebook加⭐是必看,其他可以选择性的看;一、运行python的两个方式cmd:如图,在终端中打开python,只需在&gt;&gt;&gt;中输入python即可打开python的交互式编程;也可以直接运行一个python文件(hello_world.py文件必须位于终端的工作目录):$pythonhello_world.pyHelloworld**ju...

shiro延伸

发布时间:2019-08-15 JAVA JSON 数据库
shiro延伸spring-异常处理关于异常处理有四种方法:第一种:使用SimpleMappingExceptionResolver解析器  在mvc的配置文件中配置异常处理解析器1异常处理解析器2&lt;beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&gt;3&lt;!--默认的...

HashMap

发布时间:2021-09-14 JAVA
集合简介概述什么是集合呢?集合规范而言是一类引用数据类型。当我们有多个数据需要存储的时候我们一般使用数组来存储。但数组有一个很不讨喜的特点就是数组在初始化的时候其长度就被定死了,不可改变。其存储的数量不变,因此在使用的时候一般用于存储数量不变的场景中。当遇到存储数量需要改变的时候数组就显得不太合适。因此我们引入了集合!作用集合,可以保存数量不确定的数据,更重要的是,集合能保存具有映射关系的数据。集...

后端浏览器跨域解决

发布时间:2022-08-19 JAVA SPRING CLOUD 微服务
1.全局解决,新建config包,创建CorsConfig类继承自WebMvcConfigurer实现全局跨域importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springf...

反射机制详解❤❤❤

发布时间:2022-11-21 JAVASE JAVA JVM SERVLET
1.什么是反射机制?反射机制是java语言中通过动态获取类,然后对类进行操作的一种机制。通常来说,一般创建对象的方式是new直接实例化对象(正射),而还有一种方式就是通过java提供的反射机制来实现。通过反射机制可以操作字节码文件。2.反射机制常用的类有哪些?①java.lang.Class②java.lang.reflect.Method③java.lang.reflect.Constructo...

学习 ASP.NET MVC (第三回)实战篇

发布时间:2009-08-16 测试 数据库
承接上文LearnASP.NETMVC(第二回)实战篇创建Controllers和Views我们再次回顾下ASP.NETMVC的基本工作流程:URL--&gt;Controller(会执行一个方法Action)--&gt;从数据库中获取一个Model对象--&gt;将Model作为ViewData传递给View(Detail.aspx)。和传统的Web架构不同的是,请求的URL不是映射URL地址到...

发现一个宝藏 Python 库,玩社区发现算法的不能错过!

来源丨任识算法编辑丨Python数据科学推荐阅读:终于来了,【第三期】彭涛Python爬虫特训营!!网络是由一些紧密相连的节点组成的,并且根据不同节点之间连接的紧密程度,网络也可视为由不同簇组成。簇内的节点之间有着更为紧密的连接,不同簇之间的连接则相对稀疏。这种簇被称为网络中的社区结构(communitystructure)。由此衍生出来的社区发现(communitydetection)算法用来发...

Camshift

发布时间:2018-11-26 JAVA 百科 百度百科 CAMSHIFT
Camshift是由Meanshift推导而来Meanshift主要是用在单张影像上,但是独立一张影像分析对追踪而言并无意义,Camshift就是利用MeanShift的方法,对影像串列进行分析。(1)首先在影像串列中选择ㄧ区域。(2)计算此区域的颜色2D机率分布。(3)用MeanShift演算法来收敛欲追踪的区域。(4)集中收敛的区域,并标示之。(5)每个frame重复(3)(4)。Camshi...

错误发送服务器

发布时间:2013-11-19 PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;  /**    *把错误报告发送给服务器,包含新产生的和以前没发送的.    *    *@paramctx    */   privatevoidsendCrashReportsToServer(Contextctx){     String[]crFiles=getCrashReportFiles(ctx);     i...

基于java的https双向认证,android上亦可用

发布时间:2014-11-11 JAVA HTTPS
概述:客户端,浏览器或者使用http协议和服务器通信的程序。如:客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书,如果没有信任证书,浏览器一般会拒绝访问,IE会有一个继续访问的链接,但地址栏是红色,给予用户警示作用,即客户端验证服务端并不是强制性的,可以没有服务端的信任证书,当然是否继续访问完全取决于用户自己。如果要去除地址栏的红色警告,需...

java 2d 画线

发布时间:2011-05-19 JAVA CLASS IMPORT STRING
packagelinedrawexample;&#13;importjava.awt.*;&#13;importjavax.swing.JFrame;&#13;importjavax.swing.JPanel;&#13;publicclassLineDrawExampleextendsJFrame{&#13;publicstaticvoidmain(String[]args){&#13;LineD...

Stream流的一些基本用法

发布时间:2022-10-20 JAVA SQL STREAM流 数据库
一、Stream流介绍    stream流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。    同时stream不是一种数据结构,它只是某种数据源的一个视...

Activity 启动流程分析

发布时间:2022-11-16 ANDROID IDE ANDROID STUDIO 开发语言 JAVA
和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、AndroidAcitvity启动流程概览二、启动流程中AMS内的各个角色三、AMS跨进程通信创建Activity,第一步四、ActivityStarter正式开始启动Activity五、startActivityMayWait六、startActivity处理ActivityInfo转化为Activi...

No1_8.类和对象2_Java学习笔记_对象

发布时间:2016-06-30 JAVA 运维
对象 /******一、对象*1.概念:对象是由类抽象出来的,对象可以操作类的属性和方法解决问题,了解对象的创建、操作和消亡很必要;*2.对象的创建:*a.new操作符创建;每实例化一个对象就会自动调用一次构造方法;*即:在Java语方中使用new操作调用构造方法创建对象;*b.Test[类]test[类对象]=new[操作符]Test("a"[构造方法的参数]);*c.对象创建时,在内存中为对象...

关于Vue.js的知识,你知道几个?

发布时间:2021-01-19 JAVA VUE WEB 编程语言
Vue.js(读音/vjuː/,类似于view)是一套构建用户界面的渐进式框架。Vue只关注视图层,采用自底向上增量开发的设计。Vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件。Vue学习起来非常简单,本教程基于Vue2.1.8版本测试。阅读本教程前,您需要了解的知识:· HTML· CSS· JavaScript搭建环境工欲善其事必先利其器,我们的学习计划从学会搭建Vue所...

Spring-BeanPostProcessor

发布时间:2022-11-13 JAVA SPRING
BeanPostProcessorBeanPostProcessor是spring的bean增强器,也就是说我们交给spring管理的那些类,在创建之后还可以对他进行增强,那是怎么用的呢,我们这篇文章就来看看BeanPostProcessor源码publicinterfaceBeanPostProcessor{//前置处理(bean初始化方法前)@NullabledefaultObjectpost...

python 表单数据上传图片>oss

发布时间:2022-11-25 开发语言 PYTHON
importrequestsimportjsonfromrequests_toolbeltimportMultipartEncoder#上传图片defgetPicture(header,name):url=''body={}print(body)res=requests.post(url,headers=header,json=body)print(res.text)resJson=json.lo...

玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

发布时间:2017-06-15 移动开发 JAVA UI
GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛不欲生时就仅仅有使用GLSurfaceView了。它能够真正做到让Camera的数据和显示分离,所以搞明确了这个,像Camera仅仅开预览不显示这都是小菜,妥妥的。Android4.0的自带Camera源代码是用SurfaceV...

26:重复元素判定

发布时间:2022-10-16 PYTHON
每一个列表中只要有一个元素出现两次,那么该列表即被判定为包含重复元素。编写函数判定列表中是否包含重复元素,如果包含返回True,否则返回False。然后使用该函数对n行字符串进行处理。最后统计包含重复元素的行数与不包含重复元素的行数。输入格式:输入n,代表接下来要输入n行字符串。然后输入n行字符串,字符串之间的元素以空格相分隔。输出格式:True=包含重复元素的行数,False=不包含重复元素的行...

常用内置模块

发布时间:2022-11-10 开发语言 PYTHON
datetimedatetime 是Python处理日期和时间的标准库,以下是 datetime 的几个用法:fromdatetimeimportdatetime#获取当前的datetimeprint(datetime.now())print(type(datetime.now()))#用指定日期时间创建datetimetime=datetime(2022,1,1,12,20,30)print(t...

使用javaScript实现checkbox全选

发布时间:2018-03-21 JAVASCRIPT VIEWUI PYTHON
2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt;functioncheckAll(names,ids){varcheckboxs=document.getElementsByName(names);if(document.getElementById(ids).checked==false){for(vari=0;i&lt;checkboxs.length;i++){che...

head rush ajax chapter3 异步应用程序

发布时间:2010-04-16 测试 JAVASCRIPT PHP VIEWUI
异步是指当服务器在处理你的请求的时候,你不用等候,可以继续做你该做的事,服务器如果完成你的请求自然会通知你。同步的请求会等候来自服务器的响应,然后才能继续做别的事。例如你有2个咖啡机,即使其中的一个正在工作,你还可以使用剩下的一个煮咖啡,两个服务互不影响。一个请求对象可以做出多个请求,但是一次只能追踪一个请求在服务器上的进展。后面的请求会覆盖掉前面的请求。这时需要多个请求对象来处理不同的请求。当服...

算法题(递归)

发布时间:2022-08-11 JAVA 算法 PYTHON
1.在python中执行函数之后的结果为:(C)def fun(n):    if n &lt;= 1:        return n    return fun(n-1) + fun(n-2)print(fun(6))        A.0        B.5        C.8        D.无限递归解析:递归函数为fun(n)=fun(n-1)+fun(n-2),可以理解为简单的斐...

前端面试题

发布时间:2022-08-07 JAVA 前端 SERVLET
1.正则表达式语法中\d匹配的是?(A)    A.数字        B.非数字        C.字母        D.空白字符解析:\b      匹配一个数字字符。等价于[0-9]。\D   匹配一个非数字字符。等价于[^0-9]。\f    匹配一个换页符。等价于\x0c和\cL。\n   匹配一个换行符。等价于\x0a和\cJ。\r    匹配一个回车符。等价于\x0d和\cM。\s...

数据可视化:科研论文配色

发布时间:2022-11-24 算法 PYTHON 数据分析 人工智能
系列文章目录前言本篇文章为B站DrZhao93视频:【科研绘图】科研绘图配色的注意点(一),【科研绘图】科研绘图配色的注意点(二),【科研绘图】科研绘图配色的注意点(三)的笔记,可以结合视频进行阅读。一、科研论文配图的演变90年之前:黑白灰的世界,图少数据少彩色少。99-00年:彩色图开始兴起。(彩色图收费!只有少数杂志才要求用彩图)00-10年:数据量迅速增大,SM大幅增加,彩色比重也越来越大。...