热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaweb46:SpringBoot

   SpringBoot项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@C

 

 

 

SpringBoot 项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,

然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等)。

假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,

假如此Bean指定了生命周期方法,还会调用生命周期方法。

当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

 

图中描述了DefaultCacheTests类与DefaultCache类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了描述,

其意图是告诉spring框架这个两个类的实例的创建由Spring负责,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests实例中有关DefaultCache类型的值的注入(DI)。

 

NoSuchBeanDefinitionException的原因

类在项目启动时都会加载,但是否
1.类所在的包是否在启动类所在包或子包
2.类是否使用了spring特定注解

NoUniqueBeanDefinitionException:

实现类对象有多个,spring框架无法选择

package com.company.common.pool;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
* @Component
* 将此类交给spring管理,spring在何时创建此对象
* @Lazy ---延迟加载
* 此注解的含义为,告诉spring框架,如果暂时用不到,就暂时不要创建此类实例
* 适用于不常使用的大对象,一个对象创建之后长时间不用会消耗资源
* 默认为@Lazy(true)
* 只针对singleton作用域的对象
* @Scope("singleton") ---作用域
* 默认是单例作用域"singleton",这个类在实例在一个spring容器中只有一份,但同类型不同名会在容器中存多份,单例是指同类同名
* 适用于频繁使用
* 单例必须考虑线程安全问题
* "prototype",每次从spring容器获取对象都会创建新的实例,但spring容器不负责销毁
* 适用于应用次数少,prototype域的对象不会存入容器池
* @PostConstruct ---对象构建以后执行,用于执行初始化操作
* @PreDestroy ---在单例对象销毁前执行
* spring容器在销毁之前,会先将容器(Bean池)中的对象进行移除,
* 如果对象中定义了生命周期销毁方法,此时会先调用生命周期销毁方法(进行一些资源释放操作),再进行移除
* prototype域的对象不会存入池,不会调用@PreDestroy方法
*/
@Scope(
"singleton")
@Lazy
@Component
public class ObjectPool {
public ObjectPool() {
System.out.println(
"ObjectPool()");
}

@PostConstruct
public void init() {
// 生命周期初始化
System.out.println("init()");
}
@PreDestroy
public void close() {
// 生命周期销毁前执行
System.out.println("close()");
}
}

 

package com.company.common.pool;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ObjectPoolTests {
@Autowired
private ObjectPool objectPool01;
@Autowired
private ObjectPool objectPool02;
@Test
void testObjectPool() {
System.out.println(objectPool01);
System.out.println(objectPool02);
System.out.println(objectPool01
==objectPool02);
}
}

 

package com.company.pj.common.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.company.pj.common.cache.Cache;
/**
* @Autowired    由spring框架定义,用于描述类中属性或相关方法(例如构造方法)。
 *     Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,
 *     可以按照指定规则为属性赋值(DI)。其基本规则是:
 *     首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。
 *     其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。
 *     最后,假如我们有明确要求,必须要注入类型为指定类型,
*     名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。
 *
* @Qualifier    实现类有多个时,注入属性名字与实现类名不同或实现类名有多个时(无法一对一匹配)
 *     可以用此注解指定实现类
 */
/**
* @Component 描述类时,用于告诉spring框架,由spring通过反射构建此类型对象
* 执行@Autowired构造方法,此时需要取到Cache对象
* @Autowired 三种写法
*/
@Component(
"searchService")
public class SearchService {

@Autowired
//1. 修饰变量
@Qualifier("weakCache")
private Cache cache;

@Autowired
//2. 修饰有参构造
public SearchService(@Qualifier("softCache") Cache cache) {
System.out.println(
"SearchService有参");
this.cache = cache;
}

public SearchService() {
System.out.println(
"SearchService无参");
}
@Autowired
//3. 修饰setter,配合无参构造使用
@Qualifier("softCache")
public void setCache(Cache cache) {
System.out.println(
"setter");
this.cache = cache;
}
public Cache getCache() {
return cache;
}
}

 

 



推荐阅读
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
手机用户2502938985
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有