范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

关于Spring注解容器配置的那些事,掌握这几点,不再难

  无论选择是什么,Spring 都能容纳这两种风格,甚至可以将它们混合在一起。值得指出的是,通过它的 Java 配置选项,Spring 允许注解以一种非入侵的方式使用,不触碰目标组件源码和那些工具,所有的配置风格由 Spring 工具套件支持。
  基于注解的配置提供了一种 XML 设置的可替代方式,它依赖于字节码元数据来连接组件,而不是用尖括号声明的方式。代替使用 XML 来描述 bean 连接,开发者通过将注解使用在相关的类,方法或字段声明中,将配置移动到了组件类本身的内部。正如在"Example: The RequiredAnnotationBeanPostProcessor"那节提到的那样,使用 BeanPostProcessor  与注解结合是扩展 Spring IoC 容器的的常见方法。例如,Spring 2.0 引入了 @Required  注解来执行需要的属性的可能性。Spring 2.5 使以同样地通用方法来驱动 Spring 的依赖注入变为可能。本质上来说, @Autowired  提供了如 3.4.5 小节描述的同样的能力。"Autowiring collaborators"但更细粒度的控制和更广的应用性。Spring 2.5 也添加对 JSR-250 注解的支持,例如, @PostConstruct  和 @PreDestroy
  。Spring 3.0 添加了对 JSR-330,包含在 javax.inject  包内的注解(Java 的依赖注入)的支持,例如 @Inject  和 @Named  。关于这些注解的细节可以在相关的小节找到。
  注解注入在 XML 注入之前进行,因此对于通过两种方法进行组装的属性后者的配置会覆盖前者。
  跟以前一样,你可以作为单独的 bean 定义来注册它们,但也可以通过在一个基于 XML 的 Spring 配置(注入包含上下文命名空间)中包含下面的标签来隐式的注册它们:
  <?xml version="1.0" encoding="UTF-8"?>
  
  context:annotation-config/
  
  (隐式注册的后处理器包括  AutowiredAnnotationBeanPostProcessor  , CommonAnnotationBeanPostProcessor  , PersistenceAnnotationBeanPostProcessor  和前面提到的 RequiredAnnotationBeanPostProcessor  。)
  仅在定义它的同样的应用上下文中寻找注解的 beans。这意味着,如果你在一个为DispatcherServlet服务的WebApplicationContext中放置了,它只能在你的控制器中寻找@Autowired注解的 beans,而不是在你的服务层中。更多信息请看 18.2 小节,"The DispatcherServlet"。3.9.1 @Required
  @Required  注解应用到 bean 属性的 setter 方法上,例子如下: public class SimpleMovieLister {    private MovieFinder movieFinder;    @Required    public void setMovieFinder(MovieFinder movieFinder) {    this.movieFinder = movieFinder;    }    // ...    }
  这个注解仅仅是表明受影响的 bean 属性必须在配置时通过显式的 bean 定义或自动组装填充。如果受影响的 bean 属性没有填充,容器会抛出一个异常,这允许及早明确的失败,避免 NullPointerExceptions  或后面出现类似的情况。仍然建议你在 bean 类本身加入断言,例如,加入到初始化方法中。这样做可以强制这些需要的引用和值,甚至是你在容器外部使用这个类的时候。
  2 @Autowired
  ===========================================================================
  在下面的例子中 JSR 330 的 @Inject  注解可以用来代替 Spring 的 @Autowired  注解。
  你可以将 @Autowired  注解应用到构造函数上。 public class MovieRecommender {    private final CustomerPreferenceDao customerPreferenceDao;    @Autowired    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {    this.customerPreferenceDao = customerPreferenceDao;    }    // ...    }
  从 Spring 框架 4.3 起,如果目标 bena 仅定义了一个构造函数,那么 @Autowired  注解的构造函数不再是必要的。如果一些构造函数是可获得的,至少有一个必须要加上注解,以便于告诉容器使用哪一个。
  正如预料的那样,你也可以将 @Autowired  注解应用到"传统的"setter 方法上: public class SimpleMovieLister {    private MovieFinder movieFinder;    @Autowired    public void setMovieFinder(MovieFinder movieFinder) {    this.movieFinder = movieFinder;    }    // ...    }
  你也可以应用注解到具有任何名字和/或多个参数的方法上: public class MovieRecommender {    private MovieCatalog movieCatalog;    private CustomerPreferenceDao customerPreferenceDao;    @Autowired    public void prepare(MovieCatalog movieCatalog,    CustomerPreferenceDao customerPreferenceDao) {    this.movieCatalog = movieCatalog;    this.customerPreferenceDao = customerPreferenceDao;    }    // ...    }
  你也可以应用 @Autowired  到字段上,甚至可以与构造函数混合用: public class MovieRecommender {    private final CustomerPreferenceDao customerPreferenceDao;    @Autowired    private MovieCatalog movieCatalog;    @Autowired    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {    this.customerPreferenceDao = customerPreferenceDao;    }    // ...    }
  通过给带有数组的字段或方法添加 @Autowired  注解,也可以从 ApplicationContext  中提供一组特定类型的 bean: public class MovieRecommender {    @Autowired    private MovieCatalog[] movieCatalogs;    // ...    }
  同样也可以应用到具有同一类型的集合上: public class MovieRecommender {    private Set movieCatalogs;    @Autowired    public void setMovieCatalogs(Set movieCatalogs) {    this.movieCatalogs = movieCatalogs;    }    // ...    }
  如果你希望数组或列表中的项按指定顺序排序,你的 bean 可以实现 org.springframework.core.Ordered  接口,或使用 @Order  或标准 @Priority  注解。
  只要期望的 key 是 String  ,那么类型化的 Maps 就可以自动组装。Map 的值将包含所有期望类型的 beans,key 将包含对应的 bean 名字: public class MovieRecommender {    private Map movieCatalogs;    @Autowired    public void setMovieCatalogs(Map movieCatalogs) {    this.movieCatalogs = movieCatalogs;    }    // ...    }
  默认情况下,当没有候选 beans 可获得时,自动组装会失败;默认的行为是将注解的方法,构造函数和字段看作指明了需要的依赖。这个行为也可以通过下面的方式去改变。public class SimpleMovieLister {    private MovieFinder movieFinder;    @Autowired(required=false)    public void setMovieFinder(MovieFinder movieFinder) {    this.movieFinder = movieFinder;    }    // ...    }
  每个类只有一个构造函数可以标记为必需的,但可以注解多个非必需的构造函数。在这种情况下,会考虑这些候选者中的每一个,Spring 使用最贪婪的构造函数,即依赖最满足的构造函数,具有最大数目的参数。
  建议在 @Required  注解之上使用 @Autowired  的 required  特性。 required  特性表明这个属性自动装配是不需要的,如果这个属性不能被自动装配,它会被忽略。另一方面 @Required  是更强大的,在它强制这个属性被任何容器支持的 bean 设置。如果没有值注入,会抛出对应的异常。
  你也可以对那些已知的具有可解析依赖的接口使用 @Autowired  : BeanFactory  , ApplicationContext  , Environment  ,  ResourceLoader  , ApplicationEventPublisher  和 MessageSource  。这些接口和它们的扩展接口,例如 ConfigurableApplicationContext  或 ResourcePatternResolver  ,可以自动解析,不需要特别的设置。 public class MovieRecommender {    @Autowired    private ApplicationContext context;    public MovieRecommender() {    }    // ...    }
  @Autowired  、 @Inject  、 @Resource  和 @Value  都是通过 Spring 的 BeanPostProcessor  实现处理的,这反过来意味着,你不能在自己的 BeanPostProcessor  或 BeanFactoryPostProcessor  中使用这些注解。
  这些类型必须显式通过 XML 或使用 Spring 的 @Bean  方法来装配。
  3 用 @Primary 微调基于注解的自动装配
  因为根据类型的自动装配可能会导致多个候选目标,所以在选择过程中进行更多的控制经常是有必要的。一种方式通过 Spring 的 @Primary  注解来完成。当有个多个候选 bean 要组装到一个单值的依赖时, @Primary  表明指定的 bean 应该具有更高的优先级。如果确定一个’primary’ bean 位于候选目标中间,它将是那个自动装配的值。
  假设我们具有如下配置,将 firstMovieCatalog  定义为主要的 MovieCatalog  。 @Configuration    public class MovieConfiguration {    @Bean    @Primary    public MovieCatalog firstMovieCatalog() { ... }    @Bean    public MovieCatalog secondMovieCatalog() { ... }    // ...    }
  根据这样的配置,下面的 MovieRecommender  将用 firstMovieCatalog  进行自动装配。 public class MovieRecommender {    @Autowired    private MovieCatalog movieCatalog;    // ...    }
  对应的 bean 定义如下: <?xml version="1.0" encoding="UTF-8"?>    context:annotation-config/            3.9.4 微调基于注解且带有限定符的自动装配
  当有多个实例需要确定一个主要的候选对象时, @Primary  是一种按类型自动装配的有效方式。当需要在选择过程中进行更多的控制时,可以使用 Spring 的 @Qualifier  注解。为了给每个选择一个特定的 bean,你可以将限定符的值与特定的参数联系在一起,减少类型匹配集合。在最简单的情况下,这是一个纯描述性值: public class MovieRecommender {    @Autowired    @Qualifier("main")    private MovieCatalog movieCatalog;    // ...    }
  @Qualifier  注解也可以指定单个构造函数参数或方法参数: public class MovieRecommender {    private MovieCatalog movieCatalog;    private CustomerPreferenceDao customerPreferenceDao;    @Autowired    public void prepare(@Qualifier("main")MovieCatalog movieCatalog,    CustomerPreferenceDao customerPreferenceDao) {    this.movieCatalog = movieCatalog;    this.customerPreferenceDao = customerPreferenceDao;    }    // ...    }
  对应的 bean 定义如下。限定符值为"main"的 bean 被组装到有相同值的构造函数参数中。 <?xml version="1.0" encoding="UTF-8"?>        context:annotation-config/            
  
  对于回退匹配,bean 名字被认为是默认的限定符值。因此你可以定义一个 id 为 main  的 bean 来代替内嵌的限定符元素,会有同样的匹配结果。然而,尽管你可以使用这个约定根据名字引用特定的 beans,但是 @Autowired  从根本上来讲是使用可选的语义限定符来进行类型驱动注入的。这意味着限定符的值,即使回退到 bean 名称,总是缩小语义类型匹配的集合;它们没有从语义上将一个引用表达为一个唯一的 bean id。好的限定符值是"main"或"EMEA"或"persistent",表达一个特定组件的性质,这个组件是独立于 bean  id  的,即使前面例子中像这个 bean 一样的匿名 bean 会自动生成 id。
  正如前面讨论的那样,限定符也可以应用到类型结合上,例如, Set  。在这个例子中,根据声明的限定符匹配的所有 beans 作为一个集合进行注入。这意味着限定符不必是唯一的;它们只是构成过滤标准。例如,你可以定义多个具有同样限定符值"action"的 MovieCatalog  ,所有的这些都将注入到带有注解 @Qualifier("action")  的 Set  中。
  如果你想通过名字表达注解驱动的注入,不要主要使用 @Autowired  ,虽然在技术上能通过 @Qualifier  值引用一个 bean 名字。作为可替代产品,可以使用 JSR-250  @Resource  注解,它在语义上被定义为通过组件唯一的名字来识别特定的目标组件,声明的类型与匹配过程无关。 @Autowired  有不同的语义:通过类型选择候选 beans,特定的 String  限定符值被认为只在类型选择的候选目标中,例如,在那些标记为具有相同限定符标签的 beans 中匹配一个"account"限定符。
  对于那些本身定义在集合/映射或数组类型中的 beans 来说, @Resource  是一个很好的解决方案,适用于特定的集合或通过唯一名字区分的数组 bean。也就是说,自 Spring 4.3 起,集合/映射和数组类型中也可以通过 Spring 的 @Autowired  类型匹配算法进行匹配,只要元素类型信息在 @Bean  中保留,返回类型签名或集合继承体系。在这种情况下,限定符值可以用来在相同类型的集合中选择,正如在前一段中概括的那样。
  自 Spring 4.3 起, @Autowired  也考虑自引用注入,例如,引用返回当前注入的 bean。注意自注入是备用;普通对其它组件的依赖关系总是优先的。在这个意义上,自引用不参与普通的候选目标选择,因此尤其是从不是主要的;恰恰相反,它们最终总是最低的优先级。在实践中,自引用只是作为最后的手段,例如,通过 bean 的事务代理调用同一实例的其它方法:在考虑抽出受影响的方法来分隔代理 bean 的场景中。或者,使用 @Resource  通过它的唯一名字可能得到一个返回当前 bean 的代理。
  @Autowired  可以应用到字段,构造函数和多参数方法上,允许通过限定符注解在参数层面上缩减候选目标。相比之下, @Resource  仅支持字段和 bean 属性的带有单个参数的 setter 方法。因此,如果你的注入目标是一个构造函数或一个多参数的方法,坚持使用限定符。
  你可以创建自己的定制限定符注解。简单定义一个注解,在你自己的定义中提供 @Qualifier  注解: @Target({ElementType.FIELD, ElementType.PARAMETER})    @Retention(RetentionPolicy.RUNTIME)    @Qualifier    public @interface Genre {    String value();    }
  然后你可以在自动装配的字段和参数上提供定制的限定符: public class MovieRecommender {    @Autowired    @Genre("Action")    private MovieCatalog actionCatalog;    private MovieCatalog comedyCatalog;    @Autowired    public void setComedyCatalog(@Genre("Comedy") MovieCatalog comedyCatalog) {    this.comedyCatalog = comedyCatalog;    }    // ...    }
  接下来,提供候选 bean 定义的信息。你可以添加   标记作为   标记的子元素,然后指定匹配你的定制限定符注解的类型和值。类型用来匹配注解的全限定类名称。或者,如果没有名称冲突的风险,为了方便,你可以使用简写的类名称。下面的例子证实了这些方法。 <?xml version="1.0" encoding="UTF-8"?>        context:annotation-config/                                
  在 3.10 小节,"类路径扫描和管理组件"中,你将看到一个基于注解的替代方法,在 XML 中提供限定符元数据。特别地,看 3.10.8 小节,"用注解提供限定符元数据"。
  在某些情况下,使用没有值的注解就是足够的。当注解为了通用的目的时,这是非常有用的,可以应用到跨几个不同类型的依赖上。例如,当网络不可用时,你可以提供一个要搜索的离线目录。首先定义一个简单的注解: @Target({ElementType.FIELD, ElementType.PARAMETER})  @Retention(RetentionPolicy.RUNTIME)  @Qualifier  public @interface Offline {  }
  然后将注解添加到要自动装配的字段或属性上: public class MovieRecommender {    @Autowired    @Offline    private MovieCatalog offlineCatalog;    // ...    }
  现在 bean 定义只需要一个限定符类型:
  
  你也可以定义接收命名属性之外的定制限定符注解或代替简单的值属性。如果要注入的字段或参数指定了多个属性值,bean 定义必须匹配所有的属性值才会被认为是一个可自动装配的候选目标。作为一个例子,考虑下面的注解定义: @Target({ElementType.FIELD, ElementType.PARAMETER})    @Retention(RetentionPolicy.RUNTIME)    @Qualifier    public @interface MovieQualifier {    String genre();    Format format();    }
  这种情况下 Format  是枚举类型: public enum Format {    VHS, DVD, BLURAY    }
  要自动装配的字段使用定制限定符进行注解,并且包含了两个属性值: genre  和 format  。 public class MovieRecommender {
  @Autowired
  小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【000】即可免费获取

简析边带通讯POE网卡性能特点伴随网络技术的快速发展,视觉检测在工业自动化方面的应用越加广泛,元器件瑕疵检测及触发生产过程产品品质全程监控以及特定角度图像采集等,而图像采集卡作为工业自动化机器视觉配套产品,在机设计模式总篇从为什么需要原则到实际落地(附知识图谱)聊聊为什么需要原则我们所有人都看过科幻电影,都看到过未来场景中人类和机器人和平相处的场景为了让拥有自主智能的机器人不失控,人类为机器人制定了三大定律第一定律机器人不得伤害人类个体,面试常考题一个请求是如何从浏览器到服务器的?作者架构师之路toutiao。comi6726119122301616647互联网是人类历史上最伟大的发明创造之一,而构成互联网架构的核心在于TCPIP协议。那么TCPIP是如何工基于SpringCloud,SpringBoot,layui前后分离开发平台源码分享基于layuispringcloud的企业级微服务框架(用户权限管理,配置中心管理,应用管理,。),其核心的设计目标是分离前后端,快速开发部署,学习简单,功能强大,提供快速接入核心详说tcp粘包和半包tcp服务端和客户端建立连接后会长时间维持这个连接,用于互相传递数据,tcp是以流的方式传输数据的,就像一个水管里的水一样,从一头不断的流向另一头。理想情况下,发送的数据包都是独立SpringBootMyBatisAOPLayUI实现权限管理系统项目描述关注转发之后私信回复源码二字即可免费获取到项目源码学习springbootmybatis使用面向切面编程(AOP)实现的权限管理系统。共五个模块,角色管理,菜单管理,实验室以太网卡是什么,以太网卡的主要功能有哪些?关于网卡我们都知道网卡种类众多,涉及工业自动化网络安全光纤到桌面等多个应用,以太网卡是什么,以太网卡的功能有哪些,那么联瑞小编下面就跟大家来介绍下以太网卡。以太网卡1。以太网卡是什科普M。2接口以及M。2Bkey和Mkey的区别引言M。2接口,是Intel新推出的一种用于替代MSATA新的接口规范,简单的说,就是一种新的主机接口方案。与传统的MSATA接口相比,无论是规格尺寸还是传输性能,M。2接口都远胜LRLINk联瑞升级千兆POE智能以太网图像采集卡随着现在信息科技的快速革新,机器视觉运动分析交通监控无人驾驶,以及医学成像等应用领域得到迅猛发展,这依赖于实时图像采集卡的广泛性应用。区别于传统图像采集,在现代化图像采用应用中,我千兆网卡传输速率查看支持问题我们都知道网卡是让网络和计算机连接的桥梁,计算机数据通过网卡翻译后经过网络传送到其他目的地。很多人不太理解千兆网卡传输速率,为什么千兆网卡实际却没有达到这个值呢,百兆网卡和千兆网卡OCP服务器网卡优势在哪里服务器网卡是服务器必备的设备,服务器网卡一般是用于服务器与交换机等网络设备之间的连接。服务器OCP网卡也就是OCP夹层卡,是新一代使用的多功能高性能服务器网卡。服务器OCP网卡优势
华为P50Pro麒麟9000版与骁龙888版有什么区别?北京时间7月29日,华为正式发布P50系列旗舰手机,包含P50和P50Pro两款机型,其中P50Pro有搭载麒麟9000版和搭载骁龙888版两种版本,其中P50Pro麒麟9000版拆开特斯拉之后,修车师傅蒙圈了,7千节5号电池就是技术核心?大家好,随着新能源汽车的崛起,以及消费者们对新能源汽车的喜爱,各大车企纷纷转向新能源领域,都想在这个领域先入为主。在众多转型车企中,还是特斯拉做的最好,毕竟在新能源汽车上,全球销量华为P50Pro开箱计算光学技术让手机摄影进入算法时代?科技犬华为P50系列一共拥有四种常规配色版本及一款特别的动态配色版本。其中,常规配色版本包括曜金黑雪域白可可茶金拂晓粉,动态配色版本叫做涟漪云波。科技犬实拍的这款产品配色叫做雪域白你可以忽略隐私。苹果将同意为安全官员破解iPhone如果安全部队向其提供法院命令,Apple将在未经用户同意的情况下远程入侵用户的iPhone。这将影响到固件版本最低为iOS7的设备,其中现在大约有100万个。未来这种创新可能会扩展骁龙898旗舰要来了三星小米首发,有望12月发布虽然说今年的骁龙888处理器性能很强,但随着而来的却是功耗发热量剧增,部分场景的体验甚至不如去年的骁龙865处理器。这也受到了众多网友的吐槽,并寄希望于新一代旗舰处理器898上。目OLED电视下探至5000元,会是其进入普及化的临界点吗?OLED电视多年来始终在市场端无法起量,究其原因主要是OLED面板产能供给不足价格过高等因素拖了后腿。其中,价格因素无疑是最为核心的普及性指标没有价格突破,也就不会有扩产的动力,进九月苹果新品除了即将发布的13系列,你知道还有哪些新品吗?随着时间的推进,马上就到九月份苹果新品发布会了!小编前几期发文也讲了iPhone13系列的一些改动高刷屏电池容量A15芯片刘海屏变小,拍照功能的加强等。那么苹果除了发布新品iPho卷一下线收好贴一下就来电,绿联新款Magsafe磁吸无线充不一般去年苹果发布会上发布的MagSafe磁吸充电器再次点燃了大家对无线充的热情。随着无线充电技术的日趋成熟,不少第三方品牌也推出了众多定制化无线充电器。比如更专业更安心的数码品牌UGR少了note系列三星S21Ultra能否斗得过下半年的旗舰吗?大家都知道,今年三星取消了note系列,被主打折叠屏的Z系列所取代,但是前两天发布的两款折叠屏价格确是有点小高,就算是便宜一点的Zflip3先行者价格也达到了八千多。而且现在折叠屏上半年OLED智能手机销量占比过半,绿厂销量凭何排名第一?近日,根据知名市场调研机构CIINOResearch公布的数据报告显示,2021年上半年中国市场智能手机销量共计约为1。62亿部,同比增长达到了12。而具体到销量排名方面,其中国产腾讯弹出提醒,QQ帐号需要绑定手机号才能继续使用IT之家8月16日消息近期,不少用户发现,在登录腾讯TIM等QQ软件时,腾讯会提醒,根据国家法规,QQ帐号需要绑定手机号才能继续使用。请登录最新版手机QQ并前往设置手机号码进行处理