Bean的作用域和自动装配

news/2024/9/26 1:17:48
  1. Spring Bean的作用域主要有五种

    • Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。
    • prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
  2. spring中提供了向Bean中自动注入依赖的功能,这个过程就是自动装配,当向bean中注入的内容非常多的时候,自动注入依赖的功能将极大的节省注入程序的时间。

    • Spring自动装配有两类:

      • 基于xml文件的自动装配:byType(类型),byName(名称), constructor(根据构造函数)
      • 基于注解的自动装配:@Autowired,@Resource,@Value
    • 举例实现

      • byname
    <!--手动注入-->
    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.kuang.pojo.Cat"/><bean id="dog" class="com.kuang.pojo.Dog"/><bean id="people" class="com.kuang.pojo.Peopel"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>
    </beans>
    <!--自动装配-->
    <bean id="people" class="com.kuang.pojo.Peopel" autowire="byName"><property name="name" value="张三"/>
    </bean>
    <!--Spring会根据class属性找到实体类,然后查询实体类中所有setter方法的名字,根据setter方法后面的名字(例如SetDog,则setter方法后面的名字为dog)再到配置文件中寻找一个与该名字相同id的Bean,注入进来-->
    
    • bytype
    <!--自动装配-->
    <bean id="people" class="com.kuang.pojo.Peopel" autowire="byType"><property name="name" value="张三"/>
    </bean>
    <!--设置autowire属性为byType,那么Spring会自动寻找一个与该属性类型相同的Bean,注入进来。必须保证配置文件中所有bean的class属性的值是唯一的-->
    
  3. 注解实现自动装配:注解是通过反射来实现的,可以没有set方法

    • spring的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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>
    
    • 得到干净的配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean id="cat" class="com.kuang.pojo.Cat"/><bean id="dog" class="com.kuang.pojo.Dog"/><bean id="people" class="com.kuang.pojo.Peopel"><property name="name" value="张三"/></bean>
    </beans>
    
    • 在实体类的属性或者set方法写添加@Autowired,实现自动装配
    public class Peopel {@Autowiredprivate Cat cat;@Autowiredprivate Dog dog;private String name;... 
    }
    
    • spring会默认优先根据属性类型(byType)去容器中找对应的组件(bean),找到就赋值;若找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找。

    • 当ioc容器根据属性类型去容器中找找到多个相同类型的组件,配合使用@Qualifier注解:@Qualifier指定需要装配的组件的id,而不是使用属性名。

    • Resource注解:@Resource同样可以实现自动装配功能,但它默认是按照组件名称进行装配的,按照组件名称找不到在根据属性类型去查找,再找不到就报错, @Resource是java规范。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

跟着ChatGPT学算法-完全背包问题

一、题目 给定 n 个物品,第 i 个物品的重量为 wgt[i-1]、价值为 val[i-1] ,和一个容量为 cap 的背包。每个物品可以重复选取,问在限定背包容量下能放入物品的最大价值。二、和ChatGPT聊聊您 您是一位资深算法工程师,请深入浅出地给出完全背包问题的分析过程和完整带注释的J…

MySQL5.7安装详细过程--window系统

一:MySQL5.7安装详细过程--window系统1.1、下载MySQL5.7安装包https://downloads.mysql.com/archives/community/1.2、将文件解压到盘符中你可以解压到你想解压的位置,放在C或其他盘符都可以。1.3、配置MySQL的环境变量由于我们下载的不是exe或者msi版本,不能直接双击安装,…

一文学会 Kubernetes Pod 的生命周期管理(转载)

收获 了解 Pod 的状态(Status) 了解 pod 阶段(Phase) 了解 Pod conditions了解容器状态(Status) 保持容器健康了解容器自动重启使用探活(liveness)探针(Probe)检查容器的健康状况如果程序启动缓慢,请使用 startup probeLiveness probe 一些建议 在容器启动和关闭时执…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories:后端开发tags:Django-i18n 本地化-L10n 多语言 国际化 翻译工具 表单验证 性能优化引言 在数字化时代,网站和应用程序必须跨越地域限制,服务于全球用户。这就是国际化(In…

二分图(例题)

https://www.cnblogs.com/kuangbiaopilihu/p/18184536$\quad $ 这里不再介绍二分图的基础知识,只是一些例题的解释。$\quad $ 当然,这道题可以用二分+并查集来解决。但这是二分图专辑,所以介绍一下二分图做法。 $\quad $ 首先如果两个罪犯之间有仇恨,那么当他们不在同一所…

记一次阿里云服务器被ssh爆破

查看Ubuntu登录日志: cat /var/log/auth.log 发现我的服务器被ssh爆破针对这一现象 我决定构造一个脚本 来防范这种爆破式攻击 具体思路就是通过脚本判定特定IP的登录失败次数 如果多于两次 关闭进程 并且ban IP 首先就是将登录失败的ip单独拎出来 cat /var/log/auth.log.1 | …

海康威视

1 static关键字作用 修饰局部变量 ​ static修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态) 修饰全局变量 ​ 全局变量本来就存储在静态区,因…

.net core 实现注册同一服务类型的多个服务实例

1. 注册服务。给 IMyDependency 注册两个不同的实现。builder.Services.AddSingleton<IMyDependency, MyDependency>(); builder.Services.AddSingleton<IMyDependency, DifferentDependency>();2. 依赖注入。通过 IEnumerable<IMyDependency> 获取两个不同的…