我听说过很多有关Spring的信息,人们在网络上都说Spring是Web开发的良好框架。Spring Framework到底是做什么用的?
基本上,Spring是用于依赖项注入的框架,该框架是一种允许构建高度分离的系统的模式。
问题 例如,假设你需要列出系统的用户,从而声明一个名为的接口UserLister:
UserLister
public interface UserLister { List<User> getUsers(); }
也许是一个访问数据库以获取所有用户的实现:
public class UserListerDB implements UserLister { public List<User> getUsers() { // DB access code here } }
在你看来,你需要访问一个实例(仅作为示例,请记住):
public class SomeView { private UserLister userLister; public void render() { List<User> users = userLister.getUsers(); view.render(users); } }
注意上面的代码没有初始化变量userLister。我们应该做什么?如果我像这样显式实例化该对象:
UserLister userLister = new UserListerDB();
…我将视图与访问数据库的类的实现结合在一起。如果我想从数据库实现切换到另一个从逗号分隔的文件中获取用户列表的实现该怎么办(请记住,这是一个示例)?在这种情况下,我将再次进入代码并通过以下方式更改最后一行:
UserLister userLister = new UserListerCommaSeparatedFile();
对于这样的小程序来说,这没有问题,但是…在具有数百个视图和类似数量的业务类的程序中会发生什么。维护成了一场噩梦!
Spring(依赖注入)方法
什么spring确实是来连线通过使用XML文件或注解,这样所有的对象实例化和spring初始化和班达注射在适当的地方(Servlet的Web框架,业务类,DAO的,等,等,等…)。
回到Spring中的示例,我们只需要为该userLister字段设置一个setter,并拥有一个像这样的XML文件:
userLister
<bean id="userLister" class="UserListerDB" /> <bean class="SomeView"> <property name="userLister" ref="userLister" /> </bean>
或更简单地使用以下注释在我们的视图类中归档@Inject:
@Inject private UserLister userLister;
当视图被创建这样奇迹般地将有一个UserLister准备工作。
List<User> users = userLister.getUsers(); // This will actually work // without adding any line of code
太棒了!是不是