spring依赖注入_Spring依赖注入技术的发展

spring依赖注入

回顾Spring框架的历史,您会发现在每个发行版中实现依赖注入的方法越来越多。

如果您使用该框架已经超过一个月,那么在这篇回顾性文章中可能不会发现任何有趣的东西。 除了Scala中的最后一个示例,没有其他东西希望如此。

首先是XML [ 全文 ]:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd "><bean id="foo" class="com.blogspot.nurkiewicz.Foo"><property name="bar" ref="bar"/><property name="jdbcOperations" ref="jdbcTemplate"/></bean><bean id="bar" class="com.blogspot.nurkiewicz.Bar" init-method="init"/><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="org.h2.Driver"/><property name="url" value="jdbc:h2:mem:"/><property name="username" value="sa"/></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg ref="dataSource"/></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-package="com.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.html

spring依赖注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 获取oracle mysql sqlserver 链接 connection

import java.sql.Connection; import java.sql.DriverManager; //获取sqlserver connection public static Connection getSQLServerConn(){ Connection dbConn null; String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver"; …

TortoiseSVN菜单项功能说明

原帖地址&#xff1a;http://blog.csdn.net/windone0109/article/details/4030274 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它&#xff0c;我们可以可视化的管理我们的版本库。不过由于它只是一个客户端&#xff0c;所以它不能对版本库进行权限管理。…

hornetq_Spring 3 HornetQ 2.1集成教程

hornetq通过Spring框架使用JBoss的新超高性能消息传递系统。 HornetQ是一个开放源代码项目&#xff0c;用于构建多协议&#xff0c;可嵌入&#xff0c;非常高性能的集群异步消息传递系统。 它是用Java编写的&#xff0c;并且可以在具有Java 5或更高版本运行时的任何平台上运行…

zoj 3811 untrusted patrol

昨天网赛的C题&#xff0c;我负责的&#xff0c;题意有些模模糊糊的 我首先弄清楚了题意&#xff0c;即要求一个patrol是否可能巡视过所有的点&#xff0c;首先整个图要是连通的&#xff0c;这个在建图的时候边用下并查集即可&#xff0c;然后某些点装了传感器&#xff0c;传感…

上周热点回顾(9.1-9.7)

热点随笔&#xff1a; 魅族的“火爆”预定表示“呵呵呵”-不要怪我拆穿&#xff08;tankaixiong&#xff09; 【调侃】IOC前世今生&#xff08;家住腊树下&#xff09; 跟着8张思维导图学习javascript&#xff08;Ico_Coco&#xff09; 下一代Asp.net开发规范OWIN&#xff08;…

mockito手动注入依赖_依赖注入–手动方式

mockito手动注入依赖依赖注入是一种将行为与依赖解决方案分开的技术。 用简单的话来说&#xff0c;它使开发人员可以定义具有特定功能的类&#xff0c;这些功能取决于各种协作者&#xff0c;而不必定义如何获取对这些协作者的引用。 以此方式&#xff0c;实现了各个组件之间的解…

ubuntu使用root权限登录的设置方法

Ubuntu系统默认是不允许用户以root身份登录的&#xff0c;在网上找到的方法如下&#xff1a; 1、首先设置root密码&#xff0c;利用现有管理员帐户登陆Ubuntu&#xff0c;在终端执行命令&#xff1a;sudo passwd root&#xff0c;接着输入密码和root密码&#xff0c;重复密码。…

visio 小技巧

Visio作图非常的方便 目前我还是用Visio2003&#xff0c;有一些小技巧&#xff0c;记录一下。 1、visio修改文本框文字对齐方式。默认的对齐方式是上下、左右居中。修改的位置: 在一个文档中可以插入多个标签页&#xff0c;当需要分页&#xff0c;用不同页归类不同信息的时候使…

java实现bean实体与map集合相互转换

方法一 //bean装换成map public static Map<?, ?> objectToMap2(Object obj) { if(obj null) return null; return new org.apache.commons.beanutils.BeanMap(obj); } 方法二 //bean装换成map public static Map&l…

java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

java中字符串的精确匹配在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 我们将专注于如何有效地处理字符串创建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我们将提供我们自己的用于精确字…

My.Ioc 代码示例——避免循环依赖

本文的目的在于通过一些示例&#xff0c;向大家说明 My.Ioc 支持哪些类型的依赖关系。也就是说&#xff0c;如何设计对象不会导致循环依赖。 在 Ioc 世界中&#xff0c;循环依赖是一个顽敌。这不仅因为它会导致 Ioc 容器抛出异常&#xff0c;而且还因为它是不可预知的&#xff…

java实现base64加密解密

/** * 加密 * param str * return */ public static String getStr(String str){ BASE64Encoder base64 new BASE64Encoder(); return base64.encode(str.getBytes()); } /** * 解密 * param str * return * t…

设计模式之单件模式(Singleton Pattern)

一.单件模式是什么&#xff1f; 单件模式也被称为单例模式&#xff0c;它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象&#xff0c;比如&#xff1a;数据库连接对象、注册表对象、线程池对象等等&#xff0c;这种对象如果同时存在多个…

asp.net中两款文本编辑器NicEdit和Kindeditor

分类&#xff1a; C#/ASP.Net 2012-10-09 22:35 665人阅读 评论(0) 收藏 举报 文本编辑asp.nettextboxserveraspsafari目录(?)[] 做过Web开发的朋友相信都使用过富文本编辑器&#xff0c;比较出名的CuteEditor和CKEditor很多人应该已经使用过&#xff0c;在功能强大的同时需要…

导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率

cmd 命令生成awr报告: cmd 窗口 输入 -> Sqlplus sys/orclorcl as sysdba (sys登陆oracle).导出awr命令 ?/rdbms/admin/awrrpt.sql 3..输入导出的文件格式 为 html 回车 4输入数字1 为导出今天的分析报告 &#xff0c;2 3 。。。&#xff0c;回车 5.输入开始 snap id…

android多点触控自由对图片缩放

在系统的相册中,观看相片就可以用多个手指进行缩放.要实现这个功能,只需要这几步:1.新建项目,在项目中新建一个ZoomImage.javapublic class ZoomImageView extends View {//初始化状态常量public static final int STATUS_INIT1;//图片放大状态常量public static final int STA…

台阶问题额

题目名字 台阶问题 题意 初始化数组f的第一个元素为1。这表示到达第0级台阶的方式数为1&#xff0c;即不需要迈任何台阶。从第1级台阶开始&#xff0c;迭代计算每一级台阶的不同方式数。对于当前台阶i&#xff0c;内部循环从1到i和k中的较小值开始迭代。这是因为每次只能向上…

jboss eclipse_调试生产服务器– Eclipse和JBoss展示

jboss eclipse您是否编写有错误的代码&#xff1f; 不&#xff0c;当然不是。 对于我们其余的人&#xff0c;他们确实会编写带有bug的代码&#xff0c;我想解决一个非常敏感的问题&#xff1a;调试在生产服务器上运行的应用程序。 因此&#xff0c;您的应用程序已准备好进行部…

Chrome 控制台不完全指南

Chrome的开发者工具已经强大到没朋友的地步了&#xff0c;特别是其功能丰富界面友好的console&#xff0c;使用得当可以有如下功效&#xff1a; 更高「逼格」更快「开发调试」更强「进阶级的Frontender」Bug无处遁形「Console大法好」console.log 大家都会用log&#xff0c;但鲜…

datanucleus_DataNucleus 3.0与Hibernate 3.5

datanucleus如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规…