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

深层理解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; } }
  希望这篇文章能帮助到更多的读者,帮忙点赞转发.

纯电市场又添搅局者试驾一汽丰田bZ4X太平洋汽车网评测频道新能源市场又添虎将,这是继去年车展亮相过后,一汽丰田品牌第一次将实车展现到我们眼前,新车基于eTNGA打造的BEV专属平台,是旗下第一款量产纯电SUV车型,它就细聊Spring1什么是SpringSpring就是一个java写的框架,使用java语言开发的,轻量级的,开源的框架。可以在j2sej2ee项目中都可以使用。Spring核心技术ioc,aopS假如小鹏没有P7最近一段时间,总是喜欢对车圈中的许多问题提出假设。假如特斯拉没有位于上海建厂,是否还会达到现在这般高度?假如蔚来没有获得合肥市政府的雪中送炭,是否还能发生后续的逆势而为?假如没有疫精灵小电时尚iCar不足3万奇瑞QQ冰淇淋会火吗文流刃若火2021年微型电动车市场的火爆确实有些出乎意料,正是看准了二三线城市中平民老百姓对这类精品小车旺盛的需求,奇瑞也适时的推出了QQ冰淇淋,为这个火爆的市场又加了一把火。奇瑞5万元买纯电车,这三款续航都超过300公里买纯电动汽车的消费者,续航里程是一个非常重要的选车指标,续航里程肯定是越长越好。当然,这也就意味着更大的电池容量更高的成本。5万元左右买车,在预算有限的情况下,以下三款车型的NED一汽丰田版bZ4X实车亮相内饰更有新鲜感近日,一汽丰田版bZ4X实车正式亮相。新车基本延续了海外版车型的设计,定位于一款纯电动中型SUV,基于丰田全新的eTNGA架构打造而来,预计将在今年6月份投产下线。外观方面,新车基宇宙中有4000亿亿个黑洞宇宙中究竟有多少个黑洞?这是现代天体物理学和宇宙学领域最紧迫的问题之一,科学家们现在终于给出了答案!意大利国际高等研究院(SISSA)等机构的科学家在最新一期天体物理学杂志上撰文称2022年极具性价比千元机推荐!六款换机不亏预算1000多元的能购买到什么样高性价比手机?千元机是指1500左右的手机,大家之所以选择千元机,一般是预算没那么充裕或者需求不高,譬如对于父母一辈来说,他们对手机要求就是刷刷视频目前最值得买的3款骁龙870手机,性价比超高,该如何选择?在今年上半年,国内手机市场已经出现了多款骁龙8Gen1手机,这款芯片采用了全新的4nm工艺打造,安兔兔跑分也直接超越了100万大关,但这款芯片在功耗方面并不理想,很多用户也正在观望MariaDB(mysql)远程访问设置mysql(mariadb)通过远程访问,需要在数据库中配置用来远程访问的账号密码IP地址通过命令grantallprivilegeson。toremoteuser123。123。python标准库os操作文件目录importos创建文件夹os。mkdir(testdir)输出当前文件列表print(os。listdir(。))移除文件夹os。removedirs(testd