⭐️前面的话⭐️
本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍使用Spring的XML配置文件完成bean对象的注入。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年4月20日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
📌导航小助手📌

首先我们来创建一个项目或者模块用于演示说明,结果如下:

对于spring的依赖注入方式,其实一共有两种方式,一是通过setter方法进行注入,就是通过调用相关的set方法,将bean对象注入到所需要使用的变量当中,另外一种就是通过构造方法将bean对象注入,大部分情况下推荐采用setter的方式进行注入,原因,其实就是比较简单了,不要给自己自找麻烦,虽然spring官方推荐的是构造方法进行注入,可能是比较严谨吧,哈哈哈。
其实一般情况下,基于xml进行注入,用的就是setter注入了,前面在演示bean实例化的时候,对于service层的对象,里面就有一个set方法用来对dao层的对象进行依赖注入。

如果没有,运行那就会出现异常了,在前面的案例中,我们注入的都是引用类型的对象,好像并没有注入过基本的数据类型,其实是有一点点区别的,我们在注入引用类型对象的时候,需要告知对象在容器当中的id,然后根据id进行寻找,最后完成注入,但如果只是需要注入一个值或者字符串,其实还没这么麻烦,将ref属性换成value属性就可以了,以字符串的形式赋值即可,spring自动会做转换。
比如,我们就在DiDao类中进行演示,我们新建两个属性,一个叫做dataNum表示数据数量,另外一个叫做databaseName表示数据库的名字。

xml配置:
如果需要注入多个变量,就在对应的bean标签下多写几个property标签即可。

其中name属性是根据setter方法名字,将set方法名前的set去掉后,第一个字母小写的字符串进行搜索。如setDataNum方法,得到的搜索名为dataNum,如果按照命名规范就不会出现问题。
验证程序:

运行结果:

如果我们把构造方法删除,就会报错的,我就不演示了。
引用类型也是一样的,将设置value属性改为ref属性即可。
除了使用setter构造之外,我们还可以采用构造方法的方式,我们发现啊,使用setter注入的时候都是在bean标签里面利用property标签来实现的,这是因为使用property标签采用的就是setter方式进行注入,如果想使用构造器注入,嘿,那得换个标签哈,那要换哪一个标签呢,那就是constructor-arg标签。
其他的,就一模一样了,我们以服务层为例子。

其中name属性是根据构造方法形参名字进行搜索,ref是根据对应Bean的id或别名进行搜索。
运行结果:

但是,因为是依据构造方法的形参名字进行搜索,那xml就与构造方法耦合性就比较高了,我们知道,我们之所以使用依赖注入的方式拿对象就是为了解耦,所以这种方式不常用,下面我们来进行优化,既然耦合性高了,那我们来考虑解耦。
想要解耦,那就不能根据构造方法的形参名进行搜索,好在constructor-arg标签给出了其他的搜索方案,可以不设置name属性,而去设置type属性,可以按照构造方法的参数列表的类型去进行搜索,xml配置如下:

运行结果:

但是这样又存在一个问题,那就是当存在多个相同类型的参数的时候就行不通了,存在多个相同类型参数的话,就存在歧义了,不知道将找到的对象注入到哪一个变量当中。
我们再来想想,参数名字耦合度太高,使用参数类型被限制了相同类型参数情况,那能不能通过构造方法参数列表变量的位置呢,通过位置寻找既能解耦,也没有相同参数类型限制,恰好在constructor-arg标签当中有个index属性,可以根据位置来进行寻找,0表示构造方法第一个参数,1表示第二个,以此类推。
xml配置:

运行结果:

这样的做法其实也有弊端,你得把握好将注入的类型与构造方法参数列表相对应位置的类型对应起来。
其实不难发现,我们注入的时候需要除了需要提前写好setter或者构造器,还需要进行相对应配置,比较麻烦,有没有更简单的方式呢?答案是有的,可以通过自动装配来实现,那如何操作呢?
很简单,我们在xml配置中,在bean标签中,设置autowire属性,其值byName表示通过名称(id,别名)注入,byType就是通过类型注入,constructor表示通过构造器注入。

对于按类型,必须保证相同类型的对象只有一个,一般工程中,对于相同类型,只会注入一个,所以推荐使用按照类型注入。
对于按名称,需要保证变量名(去掉set的setter方法名的小驼峰形式)与xml中id或者name别名一致才可以,存在耦合性,使用注入的目的就是为了解耦,所以不推荐该方式。

运行结果:

但是对于值的自动装配,由于未告诉它值应该为多少,所以装配的结果是null或者0。所以对于字符串或者基本数据类型不适合使用该方式装配,引用类型适合自动装配。
如果按照名称去找对应的bean对象,找不到则注入null,当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错 ,按照类型会报错。
所以更加推荐使用类型进行自动装配注入。
最后对于自动装配,需要注意一些其他的配置特征:

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵