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

深层理解Spring控制反转和依赖注入,这一篇文够了

  Spring 控制反转和依赖注入控制反转的类型
  控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项。通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL),这些子类型各自又可以被进一步分解为 IOC 服务的具体实现  1. 依赖查找1.1 依赖拉取
  依赖拉取(Dependency Pull),即根据需要,从注册表中提取依赖项,以下代码显示了基于 Spring 的依赖拉取  public class DependencyPull {  public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring/app-context.xml"); ctx.getBean("renderer", MessageRenderer.class); } }1.2 上下文依赖查找
  上下文依赖查找(contextualized dependency lookup,CDL),同样属于依赖查找的子类型,和依赖拉取有点类似,但在 CDL 中,查找是针对管理资源的容器执行的,这个容器通常由应用程序服务器或框架(Tomcat、JBoss、Spring)提供,比如以下代码显示了一个提供依赖查找服务的容器接口  public interface Container { // 根据key获取相应的依赖项 Object getDependency(String key); } CDL 通过让组件实现以下代码接口来进行工作 public interface ManagedComponent { void performLookup(Container container); }
  组件需要实现该接口,当容器准备好将依赖项传递给组件时,会依次调用每个组件的   performLookup()   方法,然后组件就可以使用  Container   接口查找所需的依赖项 public class ContextualizedDependencyLookup implements ManagedComponent {  private Dependency dependency;  @Override public void performLookup(Container container) { this.dependency = (Dependency) container.getDependency("myDependency"); }  @Override public String toString() { return dependency.toString(); } }2. 依赖注入2.1 构造函数注入
  当在组件的构造函数中提供依赖项时,就会发生构造函数依赖注入  public class ConstructorInjection {  private Dependency dependency;  public ConstructorInjection(Dependency dependency) { this.dependency = dependency; }  @Override public String toString() { return dependency.toString(); } }2.2 setter 函数注入
  Ioc 容器通过 JavaBean 样式的 setter 方法注入组件的依赖项  public class SetterInjection {  private Dependency dependency;  public void setDependency(Dependency dependency) { this.dependency = dependency; }  @Override public String toString() { return dependency.toString(); } }
  在 Spring 中,还支持另一种被称为字段注入(field injection)的注入类型,在后面学习使用 @Autowire 注解进行自动装配时将介绍该注入类型  Spring 中的控制反转1. Bean 和 BeanFactory
  Spring 的依赖注入容器的核心是 BeanFactory,它负责管理组件,包括依赖项以及它们的生命周期。如果我们想获得一个组件(Bean),就必须创建一个实现了 BeanFactory 接口的实例,并对其进行配置
  虽然 BeanFactory 可以通过编程方式配置,但更常见的做法是使用某种配置文件在外部对其进行配置。Bean 配置可以由实现 BeanDefinition 接口的类的实例来表示,对于任何实现了 BeanDefinitionReader 接口的 BeanFactory 实现类来说,都可以使用 PropertiesBeanDefinitionReader 或 XmlBeanDefinitionReader 从配置文件读取 BeanDefinition 数据
  定义一组接口:  public interface Oracle { String output(); }  public class OracleImpl implements Oracle {  @Override public String output() { return "hello world"; } }
  接下来我们来看一看,Spring 的 BeanFactory 如何被初始化并用于获取 Bean 实例  public class XmlConfigWithBeanFactory {  public static void main(String[] args) { // DefaultListableBeanFactory是Spring提供的两个主要BeanFactory实现之一 DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader rdr = new XmlBeanDefinitionReader(factory); // 使用XmlBeanDefinitionReader从XML文件读取BeanDefinition信息 rdr.loadBeanDefinitions(new ClassPathResource("spring/xml-bean-factory-config.xml")); // 使用在XML配置文件中配置的名称oracle来获取bean Oracle oracle = (Oracle) factory.getBean("oracle"); System.out.println(oracle.getInfo()); } } <?xml version="1.0" encoding="UTF-8"?>     
  ApplicationContext 接口是 BeanFactory 的一个扩展,除了 DI 服务外,还提供其他如事务和 AOP 等服务。在开发基于 Spring 的应用程序时,建议通过 ApplicationContext 接口与 Spring 交互  2. 设置 Spring 配置2.1 XML 配置
  对于 XML 配置,需要声明应用程序需要的由 Spring 提供的名称空间基础信息,下面所示配置仅声明用于定义 bean 的名称空间  <?xml version="1.0" encoding="UTF-8"?>       2.2 注解配置
  要想在应用程序使用 Spring 的注解支持,需要在 XML 配置中声明  <?xml version="1.0" encoding="UTF-8"?>     
  标记告诉 Spring 扫描代码,从而找到  @Component   等注解注入的 bean,以及支持在指定包(及其所有子包)下使用  @Autowire   等注解的 bean 2.3 Java 配置
  配置类使用   @Configuration   注解,并包含用  @Bean   注解的方法,这些方法由 IOC 容器直接调用来实例化 bean,bean 名称与用于创建它的方法的名称相同 @Configuration public class HelloWorldConfiguration {  @Bean public MessageProvider provider() { return new HelloWorldMessageProvider(); }  @Bean public MessageRender render() { StandardOutMessageRender render = new StandardOutMessageRender(); render.setMessageProvider(provider()); return render; } }
  如果想从该类中读取配置信息,需要一个不同的 ApplicationContext 实现  public class HelloWorldSpringAnnotated {  public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class); MessageRender render = ctx.getBean("render", MessageRender.class); render.render(); } }3. setter 注入
  使用 XML 配置来配置 setter 注入,需要在      标记下指定     标记,为其注入一个依赖项         
  如果使用注解,只需要向 setter 方法添加一个   @Autowired   注解 @Service("render") public class StandardOutMessageRender implements MessageRender {  ...  @Override @Autowired public void setMessageProvider(MessageProvider messageProvider) { this.messageProvider = messageProvider; } }4. 构造函数注入public class ConfigurableMessageProvider implements MessageProvider {  private String message;  public ConfigurableMessageProvider(String message) { this.message = message; }  @Override public String getMessage() { return null; } }
  使用 XML 方式注入  <?xml version="1.0" encoding="UTF-8"?>              使用注解方式 @Service public class ConfigurableMessageProvider implements MessageProvider {  private String message;  @Autowired public ConfigurableMessageProvider( @Value("hello world") String message) { this.message = message; }  @Override public String getMessage() { return null; } }
  希望这篇文章能帮助到更多的读者,帮忙点赞转发.

5G使用毫米波之后,6G7G用什么随着商用落地,最近,关于5G的话题不绝于耳。了解5G的人都知道,5G网络主要有两种频段,一种是sub6GHz,另一种是毫米波(MillimeterWaves)。实际上,我们现在的L今日热点老坛酸菜重返货架抖音电商服饰行业启动百万新品计划1康师傅老坛酸菜方便面重返超市货架康师傅老坛酸菜方便面重返超市货架的消息登上微博热搜第一。嵩明县市场监管局检查发现该公司生产的康师傅老坛酸菜牛肉面使用的老坛酸菜料包供应商分别为四川如何在东南亚做反洗钱和KYC?丁娜娜罗海燕专业解答当前东南亚新的反洗钱监管趋势走向如何?与中国相比,东南亚国家反洗钱监管有何异同?中国企业出海东南亚,在反洗钱合规领域更需要注意什么?如何结合金融科技手段,来提高反洗钱成效?可疑交易互联网各个工作岗位的发展前途怎么样?问这个问题的同学,要么是还没毕业,正在选择职业发展方向的在校学生,要么是身在传统行业,想要往互联网方向发展的职场人士。那么我就以一个传统行业转行到互联网公司数据分析师的角度,回答一人在外地北京健康宝弹窗了,核酸正常怎么消除弹窗?谢谢了?我是周末去了河北周一早晨出现弹窗3,然后做了核酸,北京12345打不通,因未进京社区说落地管理,让进京后再报备,没办法我就从北京12345微信公众号里面申诉了三次,从京心相助小程序奇瑞瑞虎e,绿色时尚新能源在外观颜色方面,瑞虎e将会延续现款车型的设计风格,前脸的变化主要集中在前保险杠中间。车型方面,新车的车身轮廓造型也较为动感,并且在配置上也是比较突出的,同时还搭载了19英寸的轮圈红毫末智行宣布完成A轮融资将继续加强研发投入和人才体系建设4月12日,长城汽车旗下自动驾驶公司毫末智行宣布获得A轮数亿元融资。本轮融资由中银集团投资有限公司(以下简称中银投)领投,首钢基金旗下首程资本跟投。毫末智行董事长张凯表示,本轮融资拿到新的电脑要做的第一件事儿,保你电脑3年不卡当你拿到电脑的第一件事儿是做什么?下载电脑管家安全助手杀毒软件?不不不,先不要冲动,想让电脑更流畅安全,我们先从系统开始操作。程序员拿到新电脑的第一步01关闭通知1)Windows绝对是个例,OPPOFindN转轴处漏液影响折叠屏手机普及的除了准入门槛高之外,还有三个质量问题。分别是内外屏操作体验不统一,主是由于内外屏素质不同导致的对折的折叠屏折痕的问题,对于强迫症来讲是不能接受的折叠屏折叠处的质各大跨境电商物流方式都有哪些优劣势?1。邮政小包据不完全统计,中国跨境电商出口业务70的包裹都通过邮政系统投递,其中中国邮政占据50左右的份额,香港邮政新加坡邮政等也是中国跨境电商卖家常用的物流方式。优势邮政网络基本switchOLED版就在最近,任天堂推出了Switch游戏机的升级款。新款采用了OLED显示屏并且做了其他一些外部调整,内在的系统基本上还是与以前一样,所以它并不能称为SwitchPro。事实上,任天
天猫双11商家报名明天开始!发布10项商家扶持举措明天(9月15日)起,天猫双11正式启动商家报名,意味着商家进入双11时间。今天,天猫发布双11期间即将推出的10项商家扶持举措,助力商家在双11获得生意爆发。从具体举措来看,此次如何评价9月9日发布的vivoX70系列,有哪些亮点和不足?感谢您的阅读!如何评价9月9日发布的vivoX70系列,有哪些亮点和不足?这一次我确实能够感受到vivo在影像方面的优势,因为我之前使用的是vivoX60Pro,我已经能够感受到这三星手机哪款比较好?三星手机哪款比较好?回答这种问题得看自己的热衷于三星手机程度,毕竟一分钱一分货,价格高低不好说,有钱买贵的,囊中羞涩买中端货即可。不过,按照2020年好评率最高的安卓手机排行榜,第真我GTNeo2黑薄荷配色公布绿黑撞色设计今日,realme真我手机正式公布了真我GTNeo2的外观。这款新机主打黑薄荷配色,采用高饱和度荧光绿和亮面黑的撞色设计,看上去十分具有个性。据官方介绍,手机后盖荧光绿的部分采用多手机摄影,怎么拍微距?用过了华为Mate30手机,才真正体验了手机微距拍照的乐趣。也许不同品牌手机之间,微距拍照的玩法有所不同,下面就谈谈使用华为手机Mate30微距拍照的一点感受,敬请圈内朋友批评指正在今日头条和西瓜视频做影视剪辑,哪里有无版权的影视素材?在今日头条和西瓜视频做影视剪辑,哪里有无版权的影视素材?谢谢信任。为了满足您的需要,本人从收集并使用的大量影视素材网站中,挑选6个国外网站,2个国内网站提供给您,供参考使用。需要提传统车企比亚迪打造e平台3。0,涉世新能源领域很多人认为传统车企在新能源风口下不会有所作为,但令人万万没想到的是,当传统车企在新能源领域发力时,其全力以赴的姿态以及接二连三推出的新品,着实让人招架不住。近期比亚迪e平台3。0在工信部再度出手,平台互相屏蔽成重点,网友APP乱象更严重互联网作为一个信息传播的媒介,给人们的生活和工作带来了很大的方便。然而给人们带来方便的同时也给我们带来了很大的困扰,很多互联网大加为了争夺市场,作出了很多违背客户意愿的举动。对竞争手机app启动为什么都会有几秒广告页面,有没有办法屏蔽?关于这个问题,其实苹果公司创始人史蒂夫乔布斯在早期相关的座谈会中给我们讲的非常明白,他向我们表达了自己关于手机APP广告的核心观念如果手机中的APP有适宜的广告展示,会间接的养活很买完房不到3个月,房价就跌了2000平,我该如何维权?凭什么维权?有法律依据吗?还是你买房时开发商合同上给你写明了不准降价,如果没写你凭什么维权!你说说看。做人还是要脸的,市场行为,价格有升有降,降了就嚷嚷着要维权,涨价了没见那些嚷嚷助听器会加重我的耳鸣吗?助听器不能医治耳鸣,但佩戴助听器可以缓解耳鸣症状。如果耳鸣已经导致听力下降,建议到当地的验配中心去咨询。助听器是否会加重耳鸣?理论上讲是不会加重耳鸣,而且目前部分助听器可有效掩盖耳