• Spring——自动装配


    Spring的自动装配

    自动装配就是指 Spring 容器在不使用 和 标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中。

    使用自动装配需要配置 元素的 autowire 属性。autowire 属性有五个值,具体说明如下表所示:

    名称

    说明

    no

    默认值,表示不使用自动装配,Bean 依赖必须通过 ref 元素定义。

    byName

    根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。(表示按属性名称自动装配,XML 文件中 Bean 的 id 必须与类中的属性名称相同)

    byType

    根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。(XML 文件中 Bean 的 id 与类中的属性名称可以不同,但必须只有一个类型的 Bean。)

    constructor

    类似于 byType,根据构造方法参数的数据类型,进行 byType 模式的自动装配。(类中构造函数的参数必须在配置文件中有相同的类型)

    autodetect(3.0版本不支持)

    如果 Bean 中有默认的构造方法,则用 constructor 模式,否则用 byType 模式。

    自动装配的优缺点

    优点

    • 自动装配只需要较少的代码就可以实现依赖注入。

    缺点

    • 不能自动装配简单数据类型,比如 int、boolean、String 等。

    • 相比较显示装配,自动装配不受程序员控制。

    Spring基于注解装配Bean(常用注解)

    Spring 默认不使用注解装配 Bean,因此需要在配置文件中添加,启用注解。或者在被子文件中配置

    ?
    
    • 1

    常用注解注入值:

    @Component:用来描述Spring中的Bean,仅仅表示一个组件(Bean),并且可以作用在任何层次,使用时只需要将该注解标注在相应类上即可。

    @Controller:通常作用在控制层(如 Struts2 的 Action、SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

    @Service:通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

    @Repository:用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同

    @Autowired:可以应用到 Bean 的属性变量、属性的 setter 方法、非 setter 方法及构造函数等,配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功,如果ioc容器中没有任何bean类型和要注入的变量类型匹配则报错

    @Qualifier:与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。它在给类成员注入时不能单独使用必须要和@Autowired,但是在给方法参数注入时可以单独使用。

    @Resource:作用于@Autowired相同,区别在于@Resource可以通过Bean实例名称进行装配,也就是@Resource中的两个重要属性name和type。

    @Value:用于注入基本类型和String类型的值用于指定数据的值,它可以使用spring中SpEL;

    @ConfigurationProperties:用于注入一些值。请注意以下几点:

    • 前缀定义了哪些外部属性将绑定到类的字段上

    • 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配

    • 我们可以简单地用一个值初始化一个字段来定义一个默认值

    • 类本身可以是包私有的

    • 类的字段必须有公共 setter 方法

    @Value和@ConfigurationProperties区别

    二者区别

    @ConfigurationProperties

    @Value

    功能

    批量注入配置文件中的属性

    一个个指定

    松散绑定(松散语法)

    支持

    不支持

    SpEL

    不支持

    支持

    JSR303数据校验

    支持

    不支持

    复杂类型封装

    支持

    不支持

    @Configuration:标注在类上,配置spring容器(应用上下文)。相当于把该类作为spring的xml配置文件中的,在使用该注解的类中,使用@Bean注解标注的方法,返回的类型都会直接注册为bean。其底层实现使用了@Component 。

    **@Bean:**用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

    改变作用域的常用注解:

    **@Lazy(true):**表明一个bean 是否延迟加载,可以作用在方法上,表示这个方法被延迟加载;可以作用在@Component (或者由@Component 作为原注解) 注释的类上,表明这个类中所有的bean 都被延迟加载。如果没有@Lazy注释,或者@Lazy 被设置为false,那么该bean 就会急切渴望被加载;除了上面两种作用域,@Lazy 还可以作用在@Autowired和@Inject注释的属性上,在这种情况下,它将为该字段创建一个惰性代理,作为使用ObjectFactory或Provider的默认方法

    **@Scope:**用来给Bean改变作用域,使用时直接在Bean上加@Scope(value = “xxx”),默认值为singleton。

    和生命周期相关常用注解:

    **@PostConstruct:**该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

    @PreDestory:@PreDestory修饰的方法会在服务器卸载Servlet的时候运行,并且之后被服务器调用一次,类似于Servlet中的destory()方法,虽然PreDestory字面意思是在destory之前运行,但是被@PreDestory修饰的方法会在destory方法运行之后运行,在Servlet被彻底卸载之前,PreDestory里的Destory指的是Servlet的销毁,而不是destory()方法。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    vue之$emit返回值
    单目标应用:世界杯优化算法(World Cup Optimization,WCO)求解单仓库多旅行商问题SD-MTSP(可更改旅行商个数及起点)
    用Java实现Nginx插件
    谷歌浏览器的视频下载插件推荐
    使用mybatis-plus时mysql和oracle的区别
    Cascade-MVSNet CVPR-2020 学习笔记总结 译文 深度学习三维重建
    回溯去重问题
    Python性能测试服务器进程资源消耗
    【数据结构笔记04】数据结构之栈的顺序表示和实现(顺序栈)
    迈向数字化发展新阶段,某商业银行数据存储创新方案及实践经验
  • 原文地址:https://blog.csdn.net/m0_67393157/article/details/126116599