赣州酒店网站建设,建设一个网站需要什么人员,浙江做公司网站多少钱,自己做网站要会什么软件spring依赖注入回顾Spring框架的历史#xff0c;您会发现在每个发行版中实现依赖注入的方法越来越多。 如果您使用该框架已经超过一个月#xff0c;那么在这篇回顾性文章中可能不会发现任何有趣的东西。 除了Scala中的最后一个示例#xff0c;没有其他东西希望如此。 首先是… spring依赖注入 回顾Spring框架的历史您会发现在每个发行版中实现依赖注入的方法越来越多。 如果您使用该框架已经超过一个月那么在这篇回顾性文章中可能不会发现任何有趣的东西。 除了Scala中的最后一个示例没有其他东西希望如此。 首先是XML [ 全文 ] ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd bean idfoo classcom.blogspot.nurkiewicz.Fooproperty namebar refbar/property namejdbcOperations refjdbcTemplate//beanbean idbar classcom.blogspot.nurkiewicz.Bar init-methodinit/bean iddataSource classorg.apache.commons.dbcp.BasicDataSourceproperty namedriverClassName valueorg.h2.Driver/property nameurl valuejdbc:h2:mem:/property nameusername valuesa//beanbean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplateconstructor-arg refdataSource//bean
/beans 这个简单的应用程序仅获取H2数据库服务器时间并以完整格式打印它 public class Foo {private Bar bar;private JdbcOperations jdbcOperations;public String serverTime() {return bar.format(jdbcOperations.queryForObject(SELECT now(), Date.class));}public void setBar(Bar bar) {this.bar bar;}public void setJdbcOperations(JdbcOperations jdbcOperations) {this.jdbcOperations jdbcOperations;}
}public class Bar {private FastDateFormat dateFormat;public void init() {dateFormat FastDateFormat.getDateTimeInstance(FULL, FULL);}public String format(Date date) {return dateFormat.format(date);}
} 此代码有些令人不安。 首先令人惊讶的是有很多XML。 与类似的EJB 2.1应用程序相比它仍然要少一些此代码在2006年的Spring 1.2.6上进行了微小的更改 但是感觉很不对。 公共设置者更令人不安–为什么我们被迫在任何时候任何人都公开覆盖对象依赖的能力 顺便说一句我从来没有真正理解过为什么为什么在使用tag时Spring不允许直接将依赖项注入到私有字段中因为这样做可能…… 批注 [ 全文 ] Java 5和Spring 2.5带来了对注释驱动的依赖注入的支持 context:annotation-config/!-- or even: --context:component-scan base-packagecom.blogspot.nurkiewicz/ 从第一行开始您不再需要在XML中定义property标签只需定义bean。 该框架将获取标准的Resource批注。 将其替换为第二行您甚至根本不需要在XML中指定bean Service
public class Foo {Resourceprivate Bar bar;Resourceprivate JdbcOperations jdbcOperations;public String serverTime() {return bar.format(jdbcOperations.queryForObject(SELECT now(), Date.class));}
}Service
public class Bar {private FastDateFormat dateFormat;PostConstructpublic void init() {dateFormat FastDateFormat.getDateTimeInstance(FULL, FULL);}public String format(Date date) {return dateFormat.format(date);}
} 当然您不会留下深刻的印象 尼尔·诺维Nihil Novi 。 另外我们仍然必须使用XML因为我们无法控制第三方类例如数据源和JdbcTemplate 因此无法对其进行注释。 但是Spring 3.0引入了 Configuration [ 完整源代码 ] 我已经在探索 Configuration / Bean支持因此这次请重点关注我们如何启动应用程序上下文。 您看到对XML文件的任何引用吗 applicationContext.xml描述符完全消失了 ComponentScan(com.blogspot.nurkiewicz)
public class Bootstrap {private static final Logger log LoggerFactory.getLogger(Bootstrap.class);Beanpublic DataSource dataSource() {final BasicDataSource dataSource new BasicDataSource();dataSource.setDriverClassName(org.h2.Driver);dataSource.setUrl(jdbc:h2:mem:);dataSource.setUsername(sa);return dataSource;}Beanpublic JdbcTemplate jdbcTemplate() {return new JdbcTemplate(dataSource());}public static void main(String[] args) {final AbstractApplicationContext applicationContext new AnnotationConfigApplicationContext(Bootstrap.class);final Foo foo applicationContext.getBean(Foo.class);log.info(foo.serverTime());applicationContext.close();}
} 如您所见Spring从使用大量XML到不使用XML的框架走了很长的路。 但是最令人兴奋的部分是您可以使用喜欢的任何样式甚至可以将它们混合使用。 您可以使用旧版Spring应用程序并开始使用批注或切换到XML因为上帝知道这里或那里的原因。 我没有提到的一种技术是构造函数注入。 它有一些很大的好处请参见使用构造函数进行依赖注入 例如将依赖关系标记为最终的并禁止创建未初始化对象的功能 Service
public class Foo {private final Bar bar;private final JdbcOperations jdbcOperations;Autowiredpublic Foo(Bar bar, JdbcOperations jdbcOperations) {this.bar bar;this.jdbcOperations jdbcOperations;}//...} 我希望构造函数注入但是再次感到有点失望。 每个对象依赖项都需要a构造函数参数b最终字段和c构造函数中的赋值操作。 我们最后得到十行代码这些行什么都不做。 这个健谈的代码克服了所有优点。 当然任何对象都不应具有超过在这里输入您的数字的依赖关系-借助构造函数注入您会立即看到该对象具有太多的依赖关系-但我仍然发现此代码引入了太多的仪式。 用Scala注入Spring构造函数 [ 完整源代码 ] Scala的一个功能完全适合Spring框架默认情况下任何Scala对象的每个参数都会创建与该参数相同的最终字段。 对我们而言这意味着什么 看看翻译成Scala的Foo类 Service
class Foo Autowired() (bar: Bar, jdbcOperations: JdbcOperations) {def serverTime() bar.format(jdbcOperations.queryForObject(SELECT now(), classOf[Date]))} 认真吗 但是……怎么了 在这里探究Scala的优势之前请看一下Java反编译器生成的等效Java代码 Service
public class Foo implements ScalaObject
{private final Bar bar;private final JdbcOperations jdbcOperations;Autowiredpublic Foo(Bar bar, JdbcOperations jdbcOperations){this.bar bar;this.jdbcOperations jdbcOperations;}public String serverTime(){return this.bar.format(this.jdbcOperations.queryForObject(SELECT now(), Date.class));}} 与我们用Java编写的代码几乎完全相同。 拥有所有优势依赖最终将使我们的服务真正不变和无状态 依赖是私有的不会暴露给外界 实际上不需要额外的代码来管理依赖项只需添加构造函数参数Scala就会处理其余的工作。 总结一下–您拥有广泛的可能性。 从XML到Java代码再到Scala。 最后一种方法实际上很诱人因为它使您摆脱了所有样板并使您专注于业务功能。 完整的源代码可在我的GitHub存储库中找到每个步骤都带有标签因此您可以比较和选择最喜欢的方法。 参考 NoBlogDefFound的JCG合作伙伴Tomek Nurkiewicz提供的Spring依赖注入技术的 发展 编码愉快 不要忘记分享 相关文章 Java最佳实践系列 正确记录应用程序的10个技巧 每个程序员都应该知道的事情 生存在荒野西部开发过程中的9条提示 软件设计法则 Java Fork / Join进行并行编程 翻译自: https://www.javacodegeeks.com/2011/09/evolution-of-spring-dependency.htmlspring依赖注入