我正在学习这本书(我强烈推荐),我对作者如何解释Spring框架的配置方式感到困惑。
您可以在这里看到本书中使用的一些代码示例。(任何人都可以使用。)如果你想看看的话,我指的代码将是第2章的代码。
本书指出有3种方法可以配置Spring容器。
基于XML的配置
这将需要一个类似于以下内容的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">
</bean>
</beans>
然后,为了引导Spring,将使用以下代码:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/com/wiley/beginningspring/ch2/ch2-beans.xml");
此刻我没有任何困惑。
基于Java的配置
在此配置方法中,将有一个用于配置的类,如下所示:
@Configuration
public class Ch2BeanConfiguration {
@Bean
public AccountService accountService() {
AccountServiceImpl bean = new AccountServiceImpl();
bean.setAccountDao(accountDao());
return bean;
}
@Bean
public AccountDao accountDao() {
AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
return bean;
}
}
负责引导Spring的代码如下所示:
ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);
到目前为止,我都很清楚。(种类……)我还想指出,这里我们实际上有一个注释,叫做@Configuration。。。
基于注释的配置
本书中解释的最后一种可用的配置方法是基于注释的配置。
有一个xml文件,就像我们在基于xml的配置中使用的一样,但它要小得多:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<context:component-scan base-package="com.wiley.beginningspring.ch2"/>
</beans>
所有bean都有注释,例如:
@Component, @Service
等
所有依赖项都有注释:
@Autowired
这样豆子就可以注射了。
此配置方法中Spring framework的引导方式如下:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/ch2-beans.xml");
以下是我的问题:
为什么(所谓的)基于注释的配置实际上使用ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?后者似乎更适合用于包含“基于注释”的配置中,不是吗?
书中解释的基于Java的配置似乎应该被称为基于注释的配置。?
在我看来,这本书中解释的基于注释的配置方式实际上类似于:使用自动连线bean的基于XML的配置。它甚至没有“基于Java的配置”所具有的@配置注释。。
有多少种方法可以配置Spring框架?
首先,我想感谢肯·贝科夫更足智多谋的回答。我试图即兴创作他的答案,以便任何人都可以在这方面了解更多。
配置定义:
Spring 4包含3种定义其配置的方法。他们是
注释的优点:
>
所有信息都在一个文件
中(无需打开两个文件即可配置给定行为)
当类更改时,无需修改xml文件
在重新分解应用程序代码时,注释通常被认为更加直观和健壮。此外,他们还受益于guise提供的更好的IDE指导。但他们将应用程序代码与DI问题混为一谈。应用程序依赖于框架。完全分离几乎是不可能的<当根据其他情况(如机器人腿问题)在同一位置(构造器、字段)描述不同的注入行为时,代码>注释也受到限制
xml文件的优点:
>
POJO与其行为之间的明确分离
当您不知道哪个POJO对该行为负责时,更容易找到那个POJO(在文件子集而不是所有源代码中搜索)
XML具有声明式风格的唯一好处,声明式风格是与应用程序代码本身明确分开定义的。这与DI关注点无关。缺点是冗长、重分解能力差、鲁棒性差以及运行时的一般故障行为。与IDE支持(例如Java)相比,只有一种通用(XML)工具支持,几乎没有什么好处。此外,这种XML还带来了性能开销,因此它通常比代码解决方案慢。
基于XML和注释的链接:
基于Groovy的链接:
Bean定义:
正在扫描类路径:
对于xml-config,它将是
依赖注入:
在基于xml的配置中,依赖项注入可以在xml中手动完成,也可以使用注释(Autowire、Required等)完成。在这种情况下,需要定义<代码>
问题
问题1:为什么(所谓的)基于注释的配置实际上使用的是ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?
Ans:它是一种基于xml的配置,具有基于注释的bean定义。
应用程序上下文:
http://docs.spring.io/spring/docs/4.2.0.RELEASE/javadoc-api/org/springframework/context/ApplicationContext.html
注释ConfigApplicationContext:
1.AnnotationConfigApplicationContext和父上下文
类路径Xml应用程序上下文:
http://www.tutorialspoint.com/spring/spring_applicationcontext_container.htm
- http://www.mkyong.com/spring3/spring-3-hello-world-example/
Q2:书中解释的基于Java的配置似乎应该被称为基于注释的配置。?
答:你说得对。基于Java配置使用注释,称为基于注释的配置。但是注释是Java的一部分,没有别的。
但是仔细地说,我们需要了解这种层次结构是如何从xml到基于注释的,最后是基于groovy的?
基于注释的配置提供了XML设置的替代方案,它依赖于字节码元数据来连接组件,而不是角括号声明。开发人员没有使用XML来描述bean连接,而是通过使用相关类、方法或字段声明上的注释将配置移动到组件类本身。正如“示例:必需的注释BeanPostProcess”一节中提到的那样,将BeanPostProcess与注释结合使用是扩展Spring IoC容器的常用方法。例如,Spring 2.0引入了使用
@必需的
注释强制执行必需属性的可能性。
Spring 2.5使遵循相同的通用方法来驱动Spring的依赖注入成为可能。从本质上讲,
@Autow的
注释提供了与第6.4.5节“Autowire合作者”中描述的相同的功能,但具有更细粒度的控制和更广泛的适用性。
Spring 2.5还添加了对JSR-250注释的支持,例如,PostConstruct和PreDestroy。
Spring 3.0增加了对javax中包含的JSR-330(Java依赖注入)注释的支持。注入包,如注入和命名。有关这些注释的详细信息,请参见相关章节。
问题3:有多少种方法可以配置Spring框架?
Ans:
理论上,
3种描述配置的方式,2种定义bean的方式。它变成了3*2=6种配置Spring框架的方式(默认情况下)。所有这些方式都可以相互结合使用。
但实际上,
在一个单词中,我们可以通过使用XML
或注释
来配置Spring框架。
理解这一点的最简单方法是研究框架的悠久历史,它是如何开发的。
>
基于注释的配置-在Spring 2.5中-这是对Java EE 5的一种反应,引入了新的注释,如@Autowired,XML文件中仍然有一些上下文配置-通常您会定义要扫描哪些包,其余部分根据注释自动完成-因此得名。
Spring 3附带了基于Java的配置,在以后的版本中得到了改进。这就是AnnotationConfigApplicationContext和Configuration annotation被引入的时候——您可以完全删除XML-
除了这3个(2实际上与1和2使用相同的Application Context类)之外,还有其他创建上下文的方法:
为了避免混淆,我们应该理解,配置定义和bean定义是两回事。有三种方法可以定义配置,默认情况下在Spring 4中可用:
有两种方法可以将bean定义添加到应用程序中:
>
当您通过在配置中的声明手动添加bean时,在bean定义中进行配置。
在这种情况下,定义将基于配置类型。对于xml配置,它将是<代码>
基于注释的bean定义,当您使用特定注释(如组件、服务、控制器等)标记bean类时。这种类型的配置使用类路径扫描。
在这种情况下,您必须指定用于扫描类路径的指令。对于xml-config,它将是
如您所见,您可以在不同的组合中使用配置和bean定义。
请注意,如果使用基于xml的配置,则可以选择驱动依赖项注入的方法:在xml中手动,或使用注释(
@Autowire
,@Required
等)。在后一种情况下,您必须定义<代码>
现在,基于这一观点,让我们尝试回答您的问题:
为什么(所谓的)基于注释的配置实际上使用ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?
这本书的作者混淆了概念。实际上,这是一种基于xml的配置,具有基于注释的bean定义。
书中解释的基于Java的配置似乎应该被称为基于注释的配置。?
您是对的-基于Java的配置确实积极地使用注释,可以称为基于注释的配置。但是注释是Java的一部分。此外,这是文件中规定的传统术语。
有多少种方法可以配置Spring框架?
因此,默认情况下,我们有三种方式来描述配置,两种方式来定义bean。这变成了配置Spring框架的六种方式(默认情况下)。但是,当然,所有这些方式都可以相互结合使用。
问题内容: 我学习这本书(我会强烈建议),我感到困惑的作者是如何解释的方式Spring框架可以配置。 您可以在此处看到本书中使用的一些代码示例。(任何人都可以使用。)如果您想看一看,我所引用的代码将是第2章中的代码。 本书指出有 3种配置Spring容器的方法 。 基于XML的配置 这将需要一个类似于以下内容的xml文件: 然后,为了引导Spring,将使用的代码为: 目前,我没有任何混乱。 基于
本文向大家介绍Spring Boot 的配置文件有哪几种格式?它们有什么区别?相关面试题,主要包含被问及Spring Boot 的配置文件有哪几种格式?它们有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 v.properties 和 .yml,它们的区别主要是书写格式不同。 1 , properties 2, yml
问题内容: 正在考虑使用Java创建自己的网站,并试图决定使用哪种框架。但是,快速搜索Java框架会返回50多种选择! 我的网站只是出于我自己的兴趣,一开始便会对其进行构建,但是,如果它变得流行,那么它具有一定的可伸缩性,或者至少能够为此进行重新设计,将是一件好事。 较流行的框架之间的主要区别是什么?在某些情况下是否有一个明显优于其他情况?例如,高流量的企业应用程序与低流量的小型应用程序。我也想知
本文向大家介绍什么是函数式编程?它有什么优缺点?相关面试题,主要包含被问及什么是函数式编程?它有什么优缺点?时的应答技巧和注意事项,需要的朋友参考一下 函数式编程是一种编程范式,关心数据的映射 函数式编程的函数是引用透明的,无副作用,函数的返回值只与函数的参数有关,容易测试和维护 函数式编程的函数的参数是不可变的,会导致,运行时占用资源较多。 参考文章
本文向大家介绍什么是ajax和json,它们的优缺点相关面试题,主要包含被问及什么是ajax和json,它们的优缺点时的应答技巧和注意事项,需要的朋友参考一下 ajax的全称:Asynchronous Javascript And XML。 异步传输+js+xml。实现无刷新状态更新页面和异步提交 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,
本文向大家介绍npm是干什么用的?它有什么优缺点?有没有类似的方案?相关面试题,主要包含被问及npm是干什么用的?它有什么优缺点?有没有类似的方案?时的应答技巧和注意事项,需要的朋友参考一下 npm是node包管理工具 优点:通过npm命令下载第三方包,实现代码的共享,下载的第三方包会在node_modules中。无需再去对应网站下载js文件。 缺点:当第三方包所需依赖过大时,需要安装的包的数量也