第四步:为对象设计作用域,设置延迟加载,设置生命周期方法(了解)。
在 Spring 框架中,Spring 为由它创建和管理的对象,设计了一些特性,例如作用域, 延迟加载,生命周期方法等,基于这些特性实现对 Bean 对象的管理。
package com.cy.pj.common.cache;
@Component
@Scope("singleton")
//作用域,如果不写默认为单例,写上则有两个属性 "singleton"与"prototype"
@Lazy //使用场景:不是实时使用,则延迟加载,默认属性 true 为延迟加载,也叫按需加载
public class DefaultCache {
public DefaultCache() {
System.out.println("cache()");
}
@PostConstruct //生命周期初始化方法,在对象构建完成后执行,用于初始化一些资源
public void init() {
System.out.println("init()");
}
@PreDestroy //生命周期销毁方法,对象销毁之前执行,用于释放一些资源
public void destory() {
System.out.println("destory");
}
}
其中:
第五步:通过测试类测试作用域,延迟加载,生命周期方法。
package com.cy.pj.common.cache;
@SpringBootTest
public class DefaultCacheTests {
/*** @Autowired 描述属性时,表示此属性的值要由 spring 框架进行注入 */
@Autowired
private DefaultCache defaultCache;
@Autowired
private DefaultCache cache;
@Test
public void testDefaultCache() {
System.out.println(defaultCache);
}
@Test
public void testDefaultCache() {
System.out.println(defaultCache == cache);
}
}
通过对上面小节的学习,能说说 Spring 框架管理 Bean 对象有什么优势吗?低耗,高效.
Spring 是一个资源整合框架(Framework),通过 Spring 可将很多资源(自己写的对象或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用(例如解耦),以便 更好的对外提供服务。如图-17 所示:
图-17
在图-17 中,Spring 框架可以为由它管理的对象(Bean)提供懒加载策略(对象暂时用不到,则无需加载和实例化),作用域(例如 singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。同时 Spring 框架还可以基于用户设计管理对象与对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。
第一步:定义业务Cache接口.
package com.cy.pj.common.cache;
public interface Cache {
}
第二步:定义WeakCache实现Cache接口.
package com.cy.pj.common.cache;
import org.springframework.stereotype.Component;
@Component//(cache01)存到 map 中用的为 cache01 作为 Key 而不是 weakCache
public class WeakCache implements Cache{
}
//存入原材料库 Map<String,BeanDefinition>
//还有实例库 Map<String,Object>
第三步:修改DefaultCache,让此类也实现Cache接口,关键代码如下:
package com.cy.pj.common.cache;
@Component
public class DefaultCache implements Cache{
…
}
第四步:单元测试类
package com.cy.pj.common.cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CacheTests {
@Autowired
//如还有一个类 SoftCache,让它存入 map 中也叫 defaultCache,那么报错
@Qualifier("defaultCache")
private Cache cache01;
@Test
public void testCache01() {
System.out.println(cache01);
}
}
package com.cy.pj.common.cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CacheTests {
@Autowired
@Qualifier("defaultCache")
private Cache cache;
//@Autowired
//@Qualifier("weakCache")
public Cache cache02;
//测试类默认执行无参构造
//public CacheTests() {}
//构造方法注入
@Autowired
public CacheTests(@Qualifier("weakCache")Cache cache02) {
this.cache02 = cache02;
}
@Test
public void testCache01() {
System.out.println(cache);
}
@Test
public void testCache02() {
System.out.println(cache02);
}
}
业务测试运行原理分析,如图-18所示:
图-18
思考:
@Autowired由Spring框架定义,用于描述类中属性或相关方法。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。具体过程可参考图-18的设计进行自行尝试和实践。
图-19
问题分析:检查maven目录中的settings.xml的标签语法配置是否正确
图-20
图-21
问题分析:
图-22
问题分析:分析错误描述,找到自己写的类指定行号位置,看看哪个对象在进行方法调用,调用方法的对象有没有被赋值。
图-23
问题分析:
检查错误代码中自己定义的类(例如DefaultCacheTests)中的属性
基于错误分析,哪个属性的值在进行依赖注入时失败了(例如DefaultCache)
检查注入失败的属性对应的对象是否交给了Spring管理(例如是否有特定注解描述,包结构是否正确)
图-24
问题分析:
图-25
问题分析:
运输层运输层协议的理解多路分解和多路复用具体的运输层协议对应的多路分解和多路复用的区别运输层协议的理解前面我们介绍了应用层协议(HTTP、SMTP等等),应用层的主要作用是定义了运行在不同端系统上的应用程序进程之间如何相互传递报文(主要是定义了应用进程的数据报文类型、语义等等,但是没有定义报文在不同端系统之间如何运输,运输的问题要依靠下层协议来完成)。接下来我们看一下运输层的基本原理为了准确的了解运输层,我们将运输层和网络层对比起来看运输层:为运行在不同主机上的应用进程之间提供了逻辑通信功能(
首先要安装vs2019(2015or2017都可以)注意:在不同操作系统或不同 VS 版本,下文示例路径可能会稍有不同。添加C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\bin\Hostx64\x64加入到环境变量打开powershell或者cmd,输入cl...
C++ OpenCV 基于HSV颜色分割区域、获取目标读取图片// An highlighted blockMat img = imread("E:/Data_image/螺丝-线1/wire.bmp", 3);hsv 颜色范围 //黑 Scalar black_scalarL = Scalar(0, 0, 0); Scalar black_scalarH = Scalar(180, 255, 60); //黄 Scalar yellow_scalarL = Scalar(11
In mathematics, an equation or system of equations(方程组) is said to have a closed-form solution if, and only if, at least one solution can be expressed analytically in terms of a bounded number of cer
题图:来自Jim Strasma今天送给每一位属于这个时代的勇者:愿你一直能撑下去。“愿所有的青春,都可以被温柔对待”。1、这是一位读者妹子也是球友润色的一篇自己写的一首...
小数化分数2Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3668 Accepted Submission(s): 1357 Problem DescriptionRa
首先在WebMvcConfig类中实现如下方法 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("aa") .allowedMethods("POST", "GET") .allowCredentials(true)
待更新补充1.Thread与RunnableThread类中继承了接口Runnable的同时组合了Runnbale 所以我们可以将一个Thread的子类的任务交给另一个Thread去执行package Thread;public class ThreadDemo { public static void main(String[] args) { ...
我想扩展Windows解决方案。在Python 2.7.5中使用IDLE,当我从文件Expts.py运行以下代码时:import subprocessr = subprocess.check_output('cmd.exe dir',shell=False)print r...在Python Shell中,我仅获得与“ cmd.exe”相对应的输出;“目录”部分将被忽略。但是,当我添加诸如/ K或...
为了响应垃圾分类的热点问题,抽空收集了一些垃圾的图片。进行垃圾分类的算法预测与分析(模型基本上大家可以尝试采用CNN)图像的垃圾分类数据描述如下:1.玻璃瓶 2.废纸箱 ...
DWORD TryShellWithParam(CString strParam){ DWORD dwErrorOld = GetLastError(), dwErrorNew = ERROR_SUCCESS; if (ERROR_SUCCESS != dwErrorOld) { if (ERROR_NO_ASSOCIATION == dwErrorOld) { ShellExe...
一、总体技术架构基于单节点部署的Harbor随着存储内容和运行日志的增加,系统的存储空间会趋紧饱和。本文将研究和部署基于Ceph的分布式harbor部署方案。软件安装如下:Docker:version 1.12.6Docker-compose: version 1.23.2Ceph:version 10.2.11Mysql: version 10.2.14(MariaDB)在资源划分...