春季-对配置感到困惑吗?


9

我读过Spring的某个地方为配置提供了便利。但是Spring人员在配置方面带来了很多变化,以至于我现在真的很困惑使用xml配置或注释。

我希望有人建议使用xml和批注的surefire方法或经验法则。


SO上的示例表明,像我这样的许多初学者对配置感到困惑。

  • 链接1

    我似乎并没有掌握<context:annotation-config>and 背后的功能<context:component-scan>

    从我阅读的内容来看,它们似乎处理不同的注释(@ Required,@ Autowired等与@ Component,@ Repository,@ Service等),但从我阅读的内容来看,它们注册了相同的bean后处理器类。

    更让我感到困惑的是annotation-config<context:component-scan>...

  • 连结2

    我仍然有组件扫描标签:

    <context:component-scan base-package="com.mycompany.maventestwebapp" />

    但是我还有另一个标签(看起来有类似的任务),这个标签是:

    <annotation-driven />

    这两个标签有什么区别?另一个“奇怪”的事情是,前面的示例(不使用注释驱动的标签)与使用Spring MVC Template项目的STS创建的项目非常相似,但是如果我从其配置中删除了注释驱动的标签,文件项目无法运行,并给我以下错误:HTTP状态404 -...

Spring 3.2不再需要cglib进行代理,但是较低版本使用cglib。引用springsource博客

为了生成此类代理,Spring使用了名为cglib的第三方库。不幸的是,该项目不再活跃。在Spring 3.2中,默认情况下很有可能Spring将使用Javassist代替。

这些足以表明Spring是对配置的困惑吗?


1
“春季人们正在对配置进行很多更改” -您能举个例子吗?这将有助于读者更好地理解您的问题并回答您的问题
gna 2013年

9
问题不是很好,但标题肯定很有趣。
Florian Margaine 2013年

1
@gnat在春季自学的过程中,我四处搜寻,并遇到了用许多不同方式表达的相同事物。春季文档说了一种做事方式,有些教程说了另一种方式,都正确,学习曲线是如此之高。我唯一的问题是..是否有任何清晰的文档显示了做一件事情的所有可能方式在春天 ?

1
@tito在注释中指出的问题“是否有任何文档”,听起来像是资源请求。程序员对资源的请求并不受欢迎。据我了解,一个人宁愿提出一个潜在的问题(据我所见,您只是在有问题的文本中做了“变得混淆使用”)-这个问题旨在通过请求的特定资源来解决
gnat 2013年

2
@tito我认为您的问题是将旧教程与新文档混合在一起。Spring变得非常“常规化”,您不需要像以前那样表达太多。但是,旧的教程(尤其是3.1之前的版本)不需要做很多事情。
Matsemann

Answers:


5

Spring旨在为您提供一个框架,其中存在“约定之上的配置”。但是实际情况是,Spring应用程序确实需要一定数量的配置。

在Spring 2.5.x和更早版本中,常见的用法是通过XML提供此配置。在Spring 3.0+中,惯用的方式是使用批注(Java EE6 / 7也鼓励这样做)。

附带说明一下,看到带注释的JPA实体可能很有趣(添加?),将4个以上的注释添加到单个字段中相当容易。


对于像我这样的小型开发人员来说,所需的配置水平已经远远超出了他们的理解,他们必须使用N个框架来完成一个项目。

1
我有带有十个注释的方法,每个注释都有不同的作用……
Donal Fellows

1
另一方面,也可以有一个JPA实体,该实体在类上带有单个@Entity批注,仅此而已。如果那不是约定,而不是配置,我不知道是什么。如果您认为需要使所有功能完全按照您想要的方式工作,请不要抱怨您最终会进行大量配置-完全可以做到这一点。
Michael Borgwardt

2
我不明白为什么4条注释会让您难过,等效的xml文件是什么样的?
NimChimpsky

哦,XML会差很多远:-)
Martijn Verburg

0
<annotation-driven />

您必须指定XML模式的来源。

在定义事务管理器时,很可能是在JPA事务处理策略的上下文中(请参阅9.5.6。在Spring的文档中使用@Transactional

当您定义注释驱动的事务处理时-Spring AOP自动为您的方法创建方面以在调用方法之前启动(或检查现有的)事务,然后在方法确定结束后提交(或在发生异常时回滚)。


0

我发现,当您具有单例实现时,基于注释的IoC / Bean创建非常方便,但可能需要将其换出。

与可能需要使用不同的依赖类/实例重复使用Bean的情况相反。

在这些情况下,我在config中声明了bean,通常对所需的依赖项进行构造函数注入。然后,在将使用所说的bean I的类中@Autowire,然后@Qualifier("")-这就是工厂应该如何工作的方式。

单例是仅返回1个结果的工厂方法。如果这不适用于您,那就需要混合它。

至于使用分量扫描还是不使用分量扫描,这确实要符合上述标准和良好的判断力。我通常对软件包组件扫描非常明确。这样,我可以创建一个不同的应用程序上下文进行测试,以在模拟剩余的IoC设置的同时模拟外部依赖项(例如db)。

另外,@Component我的项目中没有任何库代码。您永远不知道何时/如何需要在其中使用bean,如果您使用@Component它,则可能会在扫描中不小心捡到它,从而限制了它的可重用性。对于这些情况,我通常在库中定义了一个应用程序上下文,其中包含一些方便的bean声明默认值,我的主项目可以随其导入到其应用程序上下文中而包含在内。

这里没有宗教信仰。只是经历而已


0

Spring提供了选项,最初只有基于xml的连接。后来添加了基于注释的接线。
现在有可能(很多人这样做)混合使用两者。
Spring附带有很多文档,并且/或者可以从springsource网站下载。有专业的培训(从来没有做过,不能保证),还有很多好书(我喜欢APress的Pro Spring,为您使用的Spring版本选择正确的发行版)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.