Mak*_*sim 607 java spring frameworks web-applications web
我听到很多关于Spring的消息,人们在网上都说Spring是一个很好的Web开发框架.Spring Framework究竟是什么?
vic*_*ugo 702
基本上Spring是依赖注入的框架,它是一种允许构建非常分离的系统的模式.
例如,假设您需要列出系统的用户,从而声明一个名为的接口UserLister
:
public interface UserLister {
List<User> getUsers();
}
Run Code Online (Sandbox Code Playgroud)
也许是访问数据库以获取所有用户的实现:
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Run Code Online (Sandbox Code Playgroud)
在您的视图中,您将需要访问一个实例(只是一个示例,请记住):
public class SomeView {
private UserLister userLister;
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码没有初始化变量userLister
.我们应该做什么?如果我显式实例化这样的对象:
UserLister userLister = new UserListerDB();
Run Code Online (Sandbox Code Playgroud)
...我将视图与访问数据库的类的实现结合起来.如果我想从数据库实现切换到另一个从逗号分隔文件中获取用户列表的内容(请记住,这是一个例子),该怎么办?在那种情况下,我会再次访问我的代码,并通过以下方式更改最后一行:
UserLister userLister = new UserListerCommaSeparatedFile();
Run Code Online (Sandbox Code Playgroud)
这对于像这样的小程序没有问题,但是...在具有数百个视图和相似数量的业务类的程序中会发生什么.维护变成了一场噩梦!
什么春天确实是来连线通过使用XML文件或注解,这样所有的对象实例化和春天初始化和班达注射在适当的地方(Servlet的Web框架,业务类,DAO的,等,等,等...).
回到Spring中的示例,我们只需要为该userLister
字段设置一个setter,并且有一个像这样的XML文件:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
Run Code Online (Sandbox Code Playgroud)
或者更简单地在我们的视图类中注释@Inject
:
@Inject
private UserLister userLister;
Run Code Online (Sandbox Code Playgroud)
当视图被创建这样奇迹般地将有一个UserLister
准备工作.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
Run Code Online (Sandbox Code Playgroud)
太棒了!不是吗?
UserLister
界面的其他实现,该怎么办?只需更改XML即可UserLister
准备就绪怎么办?编写一个时间模拟实现UserLister
并简化视图的开发在那里有一些其他的依赖注入选项,我认为Spring除了简单,优雅和稳定之外如此着名是SpringSource的人已经编写了许多POJO,它们有助于将Spring与许多其他常见框架集成,而不是侵入你的应用程序.Spring还有几个很好的子项目,比如Spring MVC,Spring WebFlow,Spring Security,还有一些loooong的etceteras列表.
希望这可以帮助.无论如何,我鼓励你阅读Martin Fowler关于依赖注入和控制反转的文章,因为他做得比我好.了解基础知识去看一下后Spring文档,在我看来,这是 曾经是最好的春季书永远.
Pri*_*ank 62
Spring 包含(正如Skaffman正确指出的)一个MVC框架.这里简单解释一下我的意见.Spring支持服务层,Web层和业务层的隔离,但它最擅长的是对象的"注入".所以用一个例子解释一下,考虑下面的例子:
public interface FourWheel
{
public void drive();
}
public class Sedan implements FourWheel
{
public void drive()
{
//drive gracefully
}
}
public class SUV implements FourWheel
{
public void drive()
{
//Rule the rough terrain
}
}
Run Code Online (Sandbox Code Playgroud)
现在在您的代码中,您有一个名为RoadTrip的类,如下所示
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Run Code Online (Sandbox Code Playgroud)
现在每当你想要一个Trip的实例; 有时你可能想要一辆SUV来初始化FourWheel,或者有时你可能想要Sedan.这取决于你想要的具体情况.
要解决此问题,您需要将工厂模式作为创建模式.工厂返回正确实例的地方.所以最终你会得到很多胶水代码,只是为了正确地实例化对象.没有胶水代码,Spring可以最好地完成胶水代码的工作.您在XML中声明映射并自动初始化对象.对于实例,它也使用单例体系结构,并且有助于优化内存使用.
这也称为控制反转.其他框架是谷歌guice,Pico容器等.
除此之外,Spring还提供了验证框架,与JDBC,iBatis和Hibernate(以及更多)合作,对DAO层提供了广泛的支持.为数据库事务提供出色的事务控制.
春天还有很多东西可以在像"Pro Spring"这样的好书中读到.
以下网址也可能有所帮助.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article .tssΔL= springframework的
Ali*_*ahi 45
过去,Spring只是一个依赖注入框架工作(Guice,PicoContainer,...),但现在有一天它是构建企业应用程序的完整解决方案.
春天依赖注入,当然是春天的核心仍然存在(你可以在这里查看其他好的答案),但春天还有更多......
Spring现在有很多项目,每个项目都有一些子项目(http://spring.io/projects).当有人谈到春天时,你必须找出他正在谈论的春季项目,它只是弹簧核心,它被称为弹簧框架,或者它是另一个弹簧项目.
一些值得一提的春季项目是:
如果您的应用程序需要更多指定功能,您也可以在那里找到它:
那里还有一些小项目,例如spring-social-facebook(http://projects.spring.io/spring-social-facebook/)
您可以使用spring进行Web开发,因为它具有作为Spring Framework项目Spring MVC
一部分的模块.或者你可以使用spring和另一个web框架工作,比如struts2.
Ash*_*Ash 23
什么是春天?我将很快回答这个问题,但首先,让我们再看一下维克多·胡戈的例子.这不是一个很好的例子,因为它不能证明需要一个新的框架.
public class BaseView {
protected UserLister userLister;
public BaseView() {
userLister = new UserListerDB(); // only line of code that needs changing
}
}
public class SomeView extends BaseView {
public SomeView() {
super();
}
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Run Code Online (Sandbox Code Playgroud)
完成!所以现在即使你有数百或数千个视图,你仍然需要改变一行代码,就像在Spring XML方法中那样.但是改变一行代码仍然需要重新编译,而不是编辑你说的XML?好吧,我的挑剔的朋友,使用Ant和脚本!
那春天是什么?这是为了:
进一步阅读:http://discuss.joelonsoftware.com/?joel.3.219431.12
小智 14
春天是三件事.
问题是Spring DI经过深思熟虑,围绕其他事情的包装器经过深思熟虑,因为其他的东西都考虑到了所有东西,Spring恰好包装好了.MVC和REST的Spring实现以及所有其他的东西都做得不好(YMMV,恕我直言),但也有例外(Spring Security是炸弹).所以我倾向于使用Spring for DI,它的酷包装但更喜欢Web的其他东西(我喜欢Tapestry),REST(Jersey非常健壮)等等.
bpa*_*apa 11
在Spring的Web应用程序中你可能想要的东西 -
另外,Spring很大 - 所以你可能有兴趣在Spring AOP或Spring Security等Web应用程序中使用很多其他东西.但是上面列出的四件事描述了在Web应用程序中使用的Spring的常见组件.
我看到两个部分:
请注意,您可以在不使用Spring MVC的情况下在Web应用程序中很好地使用Spring.我想说大多数Java Web应用程序都会这样做,同时使用其他Web框架,如Wicket,Struts,Seam,......
Spring非常适合将类的实例粘合在一起.您知道您的Hibernate类总是需要一个数据源,Spring将它们连接在一起(并且还具有数据源的实现).
您的数据访问对象将始终需要Hibernate访问,Spring将Hibernate类连接到您的DAO中.
另外,Spring基本上为您提供了一堆库的可靠配置,并为此提供了应该使用哪些库的指导.
Spring真的是一个很棒的工具.(我不是在谈论Spring MVC,只是基础框架).
优点是依赖注入(DI)。就是把创建对象的任务外包出去,我举个例子来解释一下。
public interface Lunch
{
public void eat();
}
public class Buffet implements Lunch
{
public void eat()
{
// Eat as much as you can
}
}
public class Plated implements Lunch
{
public void eat()
{
// Eat a limited portion
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的代码中,我有一个 LunchDecide 类,如下所示:
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(){
this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
//this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的课程中,根据我们的心情,我们选择 Buffet() 或 Plated()。然而,这个系统是紧密耦合的。每次我们需要不同类型的 Object 时,我们都需要更改代码。在这种情况下,注释掉一行!想象一下,有 50 个不同的人使用了 50 个不同的类。这将是一团糟。在这种情况下,我们需要对系统进行解耦。让我们重写 LunchDecide 类。
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们没有使用 new 关键字创建对象,而是将 Lunch Type 对象的引用作为参数传递给我们的构造函数。在这里,对象创建是外包的。可以使用 Xml 配置文件(旧版)或 Java 注释(现代版)连接此代码。无论哪种方式,都将在运行时决定创建哪种类型的对象。一个对象会被 Xml 注入到我们的代码中——我们的代码依赖于该工作的 Xml。因此,依赖注入(DI)。DI 不仅有助于使我们的系统松散耦合,它还简化了单元测试的编写,因为它允许对依赖项进行模拟。最后但并非最不重要的是,DI 简化了面向方面的编程 (AOP),这导致进一步解耦和增加模块化。还要注意,上面的 DI 是构造函数注入。
由于Spring引入了对配置的各种注释的支持,因此接受的答案不涉及注释的使用.
还有另一种方法可以使用XML文件连接类:注释.让我们用从接受答案的例子,并直接使用注释的一个类注册豆@Component
,@Service
,@Repository
或@Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Run Code Online (Sandbox Code Playgroud)
这样,当创建视图时,它会神奇地使UserLister准备好工作.
上面的语句是有效的,不需要任何XML文件使用,并与另一个注释@Autowired
找到相关的实现并将其注入.
@Autowired
private UserLister userLister;
Run Code Online (Sandbox Code Playgroud)
使用@Bean
注释上用来获取bean的实现注入的方法.