Spring FrameWork从入门到NB -基于注解配置 & @Autowired注解

这篇具有很好参考价值的文章主要介绍了Spring FrameWork从入门到NB -基于注解配置 & @Autowired注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于注解的配置

其实前面我们已经在基于注解配置了,这是由于个人比较喜欢基于注解配置。

Spring官方文档提过一个问题:基于注解配置要好于基于xml的配置吗?其实各有千秋,根据个人喜好吧。重要的是Spring可以支持基于注解配置,也可以支持基于xml配置文件配置,也可以支持两者的混搭。

我们可以使用Spring的基于BeanPostProcessor的@Autowire注解,Spring也支持JSR-250的@PostConstruct和@PreDestroy注解,以及基于 JSR-330 (Dependency Injection for Java) 的注解 @Inject 和 @Named。

基于注解的依赖注入的执行要早于基于xml配置文件,所以如果同时使用的话,基于xml文件的配置要优先于基于注解的:xml配置会覆盖掉注解配置。

通过以下配置可以实现混合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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd" >
    <context:annotation-config/>
    <context:component-scan base-package="packageName.packageName"/>
</beans>

基于注解的配置的底层生效原理其实是通过BeanPostProcessor,配置项 context:annotation-config/在Spring容器中隐式的注册了如下BeanPostProcessor:

ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor

比如@Autoware注解就是通过AutowiredAnnotationBeanPostProcessor(postProcessProperties方法)生效的。

@Autowired注解

@Autowired注解可以作用在构造方法、属性、以及普通方法上,我们在前面的文章中已经做过说明。

作用在构造方法和普通方法上,会自动装配方法中的参数,作用在属性上则自动装配该属性。

@Autowired注解是通过类型匹配的,所以添加注解的参数类型和注册到Spring IoC容器中的Bean的类型必须要匹配,如果Spring IoC在自动装配的过程中找不到匹配的Bean执行注入的话,会发生注入失败,抛异常。

Spring可以支持将同一类型的Bean注入到集合对象中,比如:

public class MovieRecommender {

	private Set<MovieCatalog> movieCatalogs;

	@Autowired
	public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
		this.movieCatalogs = movieCatalogs;
	}

	// ...
}

则Spring IoC容器中的所有类型为MovieCatalog的Bean都会注入到movieCatalogs中。MovieCatalog可以通过实现 org.springframework.core.Ordered接口或者使用@Order注解、 @Priority注解实现排序。

也可以将同类型的对象注入到Map中:

public class MovieRecommender {

	private Map<String, MovieCatalog> movieCatalogs;

	@Autowired
	public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
		this.movieCatalogs = movieCatalogs;
	}

	// ...
}

此时Map的key值为bean name,value值为bean对象。

默认情况下@Autowired注解期望必须能够注入一个依赖对象到目标对象中,否则,如果没有匹配到、或者匹配到多个对象的话,注入失败,抛异常。

通过@Autowired对集合类型注入也要求必须要有至少一个bean存在,不存在的话会抛异常。

可以通过@Autowired的属性required来改变这一行为:默认情况下required = true,我们可以修改required = false,则允许匹配不到依赖对象的情况存在,此时不注入任何对象,目标对象的值为null。

当@Autowired作用于构造方法上的时候,required 设置为true的情况下,仅允许有一个构造方法设置为@Autowired。当多个构造方法被设置为@Autowired(required必须设置为false)的时候,Sping IoC在注入的时候会选择构造方法参数依赖注入满足程度最好的构造器执行注入。如果一个类有多个构造器、并且都没有设置@Autowired,则主构造器、或者默认的构造器会被执行;如果一个类只有一个构造器,那么该构造器就一定会被执行,即使该构造器并没有标注@Autowired。

java 8 的java.util.Optional、以及@Nullable(Spring5.0以后)同样可以用来标注@Autowired为非必须(等同于required=false):

public class SimpleMovieLister {

	@Autowired
	public void setMovieFinder(Optional<MovieFinder> movieFinder) {
		...
	}
}

最后:

The @Autowired, @Inject, @Value, and @Resource annotations are handled by Spring BeanPostProcessor implementations. This means that you cannot apply these annotations within your own BeanPostProcessor or BeanFactoryPostProcessor types (if any). These types must be ‘wired up’ explicitly by using XML or a Spring @Bean method.

由于@Autowired, @Inject, @Value, and @Resource是通过BeanPostProcessor实现的,所以如果你自己实现了一个BeanPostProcessor,那就不能用以上几个注解,用以上几个注解是无法实现BeanPostProcessor功能的(错过了BeanPostProcessor的时机)。

上一篇 Spring FrameWork从入门到NB -Lazy-initialized Beans文章来源地址https://www.toymoban.com/news/detail-495135.html

到了这里,关于Spring FrameWork从入门到NB -基于注解配置 & @Autowired注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring02-Spring注解的使用、基于注解的IOC、纯注解配置、整合Junit、AOP入门、基于配置文件的AOP、切入点表达式、基于配置的文件环绕通知

    学习基于注解的 IOC 配置,即注解配置 和 XML 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 , 所以这两种配置方式我们都需要掌握。 把 Spring 的 xml 配置内容改为使用

    2024年02月03日
    浏览(74)
  • Spring @Autowired 注解原理

    被扫描的组件配置类 输出结果 定位@Autowired所在包 org.springframework.beans.factory.annotation.Autowired 找到同包下 AutowiredAnnotationBeanPostProcessor AutowiredAnnotationBeanPostProcessor 的类继承图如下 AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor与 MergedBeanDefinitionPostProcessor两个Bea

    2024年02月16日
    浏览(41)
  • Spring高手之路-@Autowired和@Resource注解异同点

    目录 概述 相同点 1.都可以实现依赖注入 2.都可以用于注入任意类型的Bean 3.都支持通过名称、类型匹配进行注入 不同点 1.来源不同。 2.包含的属性不同 3.匹配方式(装配顺序)不同。 4.支持的注入对象类型不同 5.应用地方不同 @Autowired 和 @Resource 是在 Java 开发中用于实现依赖

    2024年02月03日
    浏览(45)
  • 【Spring实战】28 @Autowired 和 @Resource注解的区别与使用

    Spring 框架是一个强大的 Java 企业应用开发框架, 提供了多种依赖注入的方式 。其中, @Autowired 和 @Resource 是两个常用的注解,用于实现依赖注入。本文将介绍这两个注解的区别以及在实际应用中如何进行选择。 1)匹配方式 @Autowired 是由 Spring 框架提供的注解,用于实现自动

    2024年01月21日
    浏览(55)
  • 为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?

    在使用Spring框架和JetBrains IDEA集成开发环境(IDE)进行Java开发时,你可能经常会遇到@Autowired注解。@Autowired是Spring框架中用于实现依赖注入的核心注解之一。然而,近年来,Spring和IDEA都不再推荐使用@Autowired注解,并提出了更好的替代方案。本文将详细分析为什么Spring和IDEA不

    2024年02月07日
    浏览(59)
  • Spring和IDEA都不推荐用的@Autowired注解,为什么还有那么多人用?

    @Autowired的默认装配 我们都知道在spring中@Autowired注解,是用来自动装配对象的。通常,我们在项目中是这样用的: 没错,这样是能够装配成功的,因为默认情况下spring是按照类型装配的,也就是我们所说的byType方式。 此外,@Autowired注解的required参数默认是true,表示开启自动

    2023年04月18日
    浏览(56)
  • @Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

    目录 一. @Autowired 和 @Resource 注解 二. Bean的作用域  1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域:request 4. 会话作用域:session 三. Spring 的执行流程 四. Bean 的生命周期   1. 实例化  2. 设置属性  3. Bean 初始化      3.1 执行各种各种 Aware 通知;     

    2024年02月04日
    浏览(61)
  • 【注解使用】使用@Autowired后提示:Field injection is not recommended(Spring团队不推荐使用Field注入)

    在使用 IDEA 开发 SpringBoot 项目时,在  Controller  类中使用注解  @Autowired  注入一个依赖出现了警告提示,查看其他使用该注解的地方同样出现了警告提示。这是怎么回事?由于先去使用了SpringBoot并没有对Spring进行系统性学习,所以做一个记录。 Field injection is not recommended(

    2024年02月12日
    浏览(39)
  • Spring——基于注解的AOP配置

    1.1.pom.xml 1.2.dao 1.3.service 1.4.applicationContext.xml 1.5.测试 2.1.applicationContext.xml 2.2.AOP配置 常用注解 @Aspect:把当前类声明为切面类 @Before:前置通知,可以指定切入点表达式 @AfterReturning:后置【try】通知,可以指定切入点表达式 @AfterThrowing:异常【catch】通知,可以指定切入点表达

    2024年01月22日
    浏览(37)
  • Spring MVC 三 :基于注解配置

    Servlet3.0 Servlet3.0是基于注解配置的理论基础。 Servlet3.0引入了基于注解配置Servlet的规范,提出了可拔插的ServletContext初始化方式,引入了一个叫ServletContainerInitializer的接口。 An instance of the ServletContainerInitializer is looked up via the jar services API by the container at container / application sta

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包