spring02

bean中公共属性抽取出来,统一配置
   <bean class="com.cj.Animal" id="animal"><property name="category" value="犬科"/></bean><bean class="com.cj.Dog" id="dog1" parent="animal"><property name="name" value="小黑"/><property name="age" value="1"/></bean><bean class="com.cj.Dog" id="dog2" parent="animal"><property name="name" value="小黄"/><property name="age" value="1"/></bean>

java配置抽取公共属性:RootBeanDefinition,GenericBeanDefinition,

    public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();rootBeanDefinition.setBeanClass(Animal.class);MutablePropertyValues pValues = new MutablePropertyValues();pValues.add("category","猫科");rootBeanDefinition.setPropertyValues(pValues);ctx.registerBeanDefinition("parent",rootBeanDefinition);GenericBeanDefinition cbd = new GenericBeanDefinition();cbd.setBeanClass(Cat.class);MutablePropertyValues cvalues = new MutablePropertyValues();cvalues.add("name","小花");cbd.setPropertyValues(cvalues);cbd.setParentName("parent");ctx.registerBeanDefinition("child",cbd);ctx.refresh();Cat cat = ctx.getBean("child",Cat.class);System.out.println("cat = " + cat);}
父子容器

同一个容器不允许相同的名字的bean同时出现,,如果两个相同名字的bean,通过两个不同的xml注入容器,,后面注入的bean会覆盖掉前面的那一个,,, 也可以设置属性ctx.setAllowBeanDefinitionOverriding(false);不让覆盖。。。

解决办法:
写两个容器,,,,或者写成父子容器
子容器能获取父容器中的bean,但是父容器不能获取子容器的bean

    public static void main(String[] args) {ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext();// 容器初始化,,没有传参数,不会自己初始化parent.refresh();ClassPathXmlApplicationContext consumer = new ClassPathXmlApplicationContext("consumer.xml");ClassPathXmlApplicationContext merchant = new ClassPathXmlApplicationContext("merchant.xml");//        consumer.setParent(parent);// consumer父容器,merchant.setParent(consumer);// 设置完parent后,刷新容器merchant.refresh();RoleService r1 = merchant.getBean(RoleService.class);com.cj.merchant.RoleService r2 = merchant.getBean(com.cj.merchant.RoleService.class);System.out.println("r1 = " + r1);System.out.println("r2 = " + r2);// getBeanNameForType 只会在当前容器找,,,getBean会找父容器String[] s1 = merchant.getBeanNamesForType(RoleService.class);String[] s2 = merchant.getBeanNamesForType(com.cj.merchant.RoleService.class);System.out.println(Arrays.toString(s1));System.out.println(Arrays.toString(s2));}
包扫描

注入方式:

  • @Autowired : 去spring容器中找某个类型的Bean,去注入
  • 构造器注入,,创建一个spring的bean,会调用构造方法,构造方法需要另一个bean,,spring就会查找是否有这个bean,如果存在,会直接使用
@Controller
public class UserController {private UserService userService;public UserController(UserService userService) {this.userService = userService;}
}
  • set方法上面加@Autowired : 看起来有点多余,实际上也是官方推荐的一种写法,,有了set方法,相当于提供了一个途径,,注入bean,,避免注入的bean是空指针。。如果没有set方法,就只能从spring容器中拿需要注入的对象

包扫描,会扫描指定包下面 @Service,@Component,@Controller,@Repository,@Configuration注解的类

 <context:component-scan base-package="com.cj.scan"/>

扫到的类会被注册到spring容器中,,名字为类名的首字母小写

spring容器注入bean之后, 可以通过@Autowired要,也可以通过构造方法要

spring官方推荐我们使用构造器注入,而不是@Autowired,,
原因:一个类,可以注册到容器中,,也可以自己new出来使用。。。 但是一个类里面如果有@Autowired,注入了别的bean,,,然后使用new方法创建一个bean,,,,里面注入的bean就是空指针,,并且没有设置这个注入的bean的方法,,,
如果使用的是构造器注入,,,那么在new对象的时候,构造函数能够传入一个需要注入的bean,,防止用户忘记初始化属性,进而导致空指针


如果同时存在多个构造器,使用@Autowired 去指定到底使用哪个构造器去注入


默认情况下,扫描器会扫到所有的bean,,也可以通过配置,让其扫描部分bean…use-default-filtertrue 表示所有都扫描,,为false表示一个都不扫描

  <context:component-scan base-package="com.cj.scan" use-default-filters="true"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/></context:component-scan>

java配置: @ComponentScan 默认是扫描当前包下面的所有注解

@Configuration
@ComponentScan(basePackages = "com.cj.scan",useDefaultFilters = true,excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class}))
public class JavaConfig {
}
属性值的注入,spring加载配置文件

xml配置:

<context:property-placeholder location="classpath:db.properties"/><!--    ${xxx} 表示从spring中要这个value--><bean class="com.cj.DataSource" id="dataSource"><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></bean>

java配置:
@PropertySource导入属性值
@Value : 从spring中要这个属性值

@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {@Value("${db.url}")private String url;@Value("${db.username}")private String username;@Value("${db.password}")private String password;@BeanDataSource dataSource(){DataSource ds = new DataSource();ds.setUrl(url);ds.setUsername(username);ds.setPassword(password);return ds;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这就是人性的丑恶,很残酷但很现实

这些年我喜欢跟垃圾撕破脸&#xff0c;包括垃圾亲戚&#xff0c;我是不会跟你讲什么感情的&#xff0c;该滚蛋就滚蛋。我最不喜欢听什么今日留一线&#xff0c;日后好相见。 之前我还不懂事的时候&#xff0c;就有那种亲戚叫我帮他介绍工作&#xff0c;我照做了。 结果&#xf…

Android 11 ,默认授予预置应用/APK 需要的权限,解决permission denied for window type 2003 问题。

写这篇文章的原因是解决了一个APP闪退的问题&#xff0c;闪退的原因是插拔U盘时&#xff0c;注册的广播接收者接收到广播需要弹出一个Dialog询问是否需要打开U盘&#xff0c;这个Dialog设置的是系统级别悬浮窗&#xff0c;没有这个权限&#xff0c;报错导致闪退&#xff0c;下面…

【SpringBoot文件压缩下载】文件夹压缩下载

1. Controller 使用hutool的ZipUtil根据文件夹路径打包成File对象然后调用自定义的FileResponseUtil进行单线程数据传输 import cn.hutool.core.date.DateUtil; import com.github.xiaoymin.knife4j.annotations.ApiSort; import im.gy.zfile.core.util.FileResponseUtil; im…

腰背肌筋膜炎的症状及治疗

腰背肌筋膜炎的症状 一、疼痛特点&#xff1a; 主要表现为腰背部弥漫性钝痛&#xff0c;尤以两侧腰肌及髂嵴上方更为明显。疼痛特点为晨起痛&#xff0c;日间轻&#xff0c;傍晚复重。长时间不活动或活动过度均可诱发疼痛&#xff0c;病程长&#xff0c;且因劳累及气候变化而发…

微信小程序封装请求API-promise格式

微信小程序原生的请求API就是wx.request wx.request({url: example.php, //仅为示例&#xff0c;并非真实的接口地址data: {x: ,y: },header: {content-type: application/json // 默认值},success (res) {console.log(res.data)} })有时候不能很好的适配我们的开发需求&#…

通过Nginx实战讲解HTTP的301和302状态码的区别

通过Nginx实战讲解HTTP的301和302状态码的区别 1. 简介2. 301永久重定向3. 302临时重定向1. 简介 HTTP状态码中,301和302都是网页重定向跳转。301重定向是一种永久重定向,而302跳转是暂时的跳转    ● 为什么需要重定向:    网站是会被大量用户收藏在自己的浏览器收藏夹…

小红书营销:解锁企业增长新引擎,与小红书集成实现精准获客

在数字化营销的新时代&#xff0c;小红书以其独特的社区文化和精准的用户定位&#xff0c;成为了品牌和企业争相入驻的热门平台。今天将探讨如何通过小红书平台进行营销获客&#xff0c;并强调与企业集成的重要性&#xff0c;以实现更高效的品牌增长。 一、小红书营销的独特优…

基于 MHA 的 MySQL 高可用主从架构

Author&#xff1a;Arsen Date&#xff1a;2024/06/25 目录 一、前言1.1 概述1.2 组件1.3 流程 二、环境三、部署3.1 基本环境3.1.1 hosts 配置3.1.2 配置 SSH 免密访问 3.2 MySQL 主从3.2.1 基础环境配置3.2.2 启动 MySQL 实例3.2.3 配置 MySQL 主从3.2.4 MySQL 主从同步验证 …

Calibre - 合并电子书(EpubMerge)

这里使用 Calibre 软件和 EpubMerge 插件 EpubMerge github &#xff1a; https://github.com/JimmXinu/EpubMerge 1、安装 Merge 插件 安装后需要重启 calibre 2、查看设置 4 3、选中文件、开始合并 合并完成后&#xff0c;会弹窗窗口&#xff0c;来编辑 合辑的元信息 完成…

基于python的随机森林多分类模型

1.随机森林多分类模型 1.1 基本原理 随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习方法&#xff0c;它通过将多个决策树进行组合&#xff0c;以投票或平均的方式得到最终的预测结果。在多分类问题中&#xff0c;随机森林通过构建多个决策树&#…

开发RpcProvider的网络服务

首先更改src的CMakeLists.txt的内容为&#xff1a; #当前目录的所有源文件放入SRC_LIST aux_source_directory(. SRC_LIST)#生成SHARED动态库 #add_library(mprpc SHARED ${SRC_LIST})#由于muduo是静态库&#xff0c;为了使用muduo&#xff0c;将mprpc也生成为静态库 add_libr…

A股周一走势历史罕见,你知道是为什么吗?

今天的A股&#xff0c;让人历史罕见&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天大盘低开低走&#xff0c;跌懵了&#xff0c;两市板块全部在等待翻红&#xff0c;这让人历史罕见。 2、盘面出现2个重要信号&#x…

java —— 网络编程(UDP)

一、InetAddress 类 InetAddress address1InetAddress.getLocalHost(); 该命令用于获取本机主机信息&#xff0c;返回主机名与 IP 地址&#xff0c;不过如果本机有多个网卡的话&#xff0c;返回的 IP 地址并不一定是目前正在联网的那个。 InetAddress address2InetAddress.g…

【计算机毕业设计】167校园失物招领微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

办公人导航-上网导航,找网站,下软件,找资源!

办公人导航是一个专门为办公人员设计的实用导航网站&#xff0c;旨在帮助用户高效地找到各种优质的办公资源和工具。无论是需要查找办公软件、学习资源还是娱乐工具&#xff0c;在办公人导航上都能找到你需要的内容。 办公人导航-实用的办公生活导航网站&#xff01;https://ww…

PADS系列:如何导入元件库新建元件

对于普通的原理图&#xff0c;位置的摆放是比较随意的&#xff0c;并且也没有一些特殊的或者元件库里面没有的元件&#xff0c;相对来说绘制会比较简单。但是如果碰上复杂一点的电路&#xff0c;要绘制起来就会比较麻烦&#xff0c;需要一些新的PADS使用技巧&#xff0c;最基础…

详解HTTP:HTTP/1.1哪些可以优化

随着互联网的发展和应用的不断丰富&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;作为网络通信的核心协议&#xff0c;承载着越来越重的流量和复杂的交互任务。虽然HTTP/1.1已经在很长一段时间内支撑着互联网的繁荣&#xff0c;但它本身也存在一些性能上的瓶颈和不足…

python format变量里有大括号报错

aa"{\"0\":{\"name\":\"0\",\"all\":{}}}".format(aa)本来想给all赋值为aa 报错 >>> aa"{\"0\":{\"name\":\"0\",\"all\":{}}}".format(aa) Traceback (most …

k8s设置pod资源请求和限制

设置资源请求和限制 实验目标&#xff1a; 学习如何为 Pod 设置资源请求和限制&#xff0c;以优化集群资源分配。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

全球首个数字人开源了

DUIX&#xff08;Dialogue User Interface System&#xff09;是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源&#xff0c;开发者可自行接入多方大模型、语音识别&#xff08;ASR&#xff09;、语音合成&#xff08;TTS&#xff09;能力&#xff0c;实现数字…