如何封装Spring bean

据我所知,Spring Framework除了具有单独的上下文之外,没有提供任何封装Spring bean的机制。 因此,当您在Spring的Inversion of Control容器中注册了公共类时,可以通过相同的上下文配置将其自动连接到任何Spring bean中。 这非常强大,但是也很危险。 开发人员可以轻松地将bean耦合在一起。 缺乏纪律的团队可以轻松地开枪射击自己。 不幸的是,我当时正在一个整体项目中,团队用冲锋枪射击自己。 接线经常违反分层规则。 没有人可以轻易遵循依赖于什么的内容。 Bean依赖图太疯狂了。 这在更大的应用中是一个严重的问题。


幸运的是,有一种简单的方法可以封装Spring bean。 Spring可以在类级别使用默认访问修饰符很好地工作。 因此,您可以创建程序包专用bean,该程序包只能在当前程序包中使用。 简单而强大。 让我们看一个例子:

package net.lkrnac.blog.spring.encapsulatebean.service;import org.springframework.stereotype.Service;@Service
class AddressService {public String getAddress(String userName){return "3 Dark Corner";}
}

这个简单的bean被连接到同一包中的另一个bean中:

package net.lkrnac.blog.spring.encapsulatebean.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {private AddressService addressService;@Autowiredpublic UserService(AddressService addressService) {this.addressService = addressService;}public String getUserDetails(String userName){String address = addressService.getAddress(userName);return String.format("User: %s, %s", userName, address);}
}

主要上下文仅扫描两个bean:

package net.lkrnac.blog.spring.encapsulatebean;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
}

这是测试证明它运作良好:

package net.lkrnac.blog.spring.encapsulatebean;import net.lkrnac.blog.spring.encapsulatebean.service.UserService;import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {@Autowiredprivate UserService userService;@Testpublic void isPackagePrivateBeanCalled(){//GIVEN - spring context defined by Application class//WHENString actualUserDetails = userService.getUserDetails("john");//THENAssert.assertEquals("User: john, 3 Dark Corner", actualUserDetails);}
}

我相信每个人都应该考虑对每个新bean使用默认的访问修饰符。 显然,每个软件包中都需要一些公共bean。 但是并不是每个豆子都有。 源代码在GitHub上 。

翻译自: https://www.javacodegeeks.com/2014/12/how-to-encapsulate-spring-bean.html

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

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

相关文章

分享下自己的EmpireofCode进攻策略 https://empireofcode.com/ https://empireofcode.com/game/#

# 没什么用,该游戏的模块调用不友好,取数据难import queue from battle import commander # import mathunit_client commander.Client() doing_last_order True towerid [] towerrg [] towerfr [] towerps [] tower_id 0 towers [] safe_posi[4…

Python多篇新闻自动采集

昨天用python写了一个天气预报采集,今天趁着兴头写个新闻采集的。 目标是,将腾讯新闻主页上所有新闻爬取下来,获得每一篇新闻的名称、时间、来源以及正文。 接下来分解目标,一步一步地做。 步骤1:将主页上所有链接爬取…

使用ADF BC管理保存点

在使用ADF BC时,我们通常依赖于在数据库中执行DML操作的框架。 在DBTransaction提交周期内,该框架正确地在数据库中进行了所有必要的更新。 很酷的事情是,在这种情况下,数据库事务将被自动管理。 因此,如果出现问题&am…

sql优化(转)

(转)SQL 优化原则一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加&a…

2017-12-04HTML table布局

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>table布局</title> </head> <body marginwidth"0px" marginheight"0px"> <table width"…

Java EE 8发生了什么? (第2部分)

Java EE 8的工作仍处于初期阶段&#xff0c;预计在来年会紧跟潮流&#xff0c;我们将看到专家组的形成完成&#xff0c;围绕用例/功能的更多讨论&#xff0c;许多JIRA&#xff0c;以及各种规范的草案版本&#xff08;本会很有趣&#xff01;&#xff09;。 在第1部分中 &#…

foreach语句的的解析

我这个虾米&#xff0c;今天才知道foreach语句是这样解析的&#xff0c;惭愧啊&#xff01;幸好我最新在原生态的学习这门编程语言。 //程序中我们这样写foreachforeach (Person item in Persons){Console.WriteLine(item);} //其实如果要使用foreach,需要实现IEnumerator接口&…

滚动条位置判断

//获取滚动条距离顶部位置function getScrollTop() { var scrollTop 0; if (document.documentElement && document.documentElement.scrollTop) { scrollTop document.documentElement.scrollTop; } else if (document.body) { scrollTop d…

如何处理Java注释

Java 8的很酷的新功能之一就是对lambda表达式的支持。 Lambda表达式在很大程度上依赖于FunctionalInterface 注释 。 在本文中&#xff0c;我们将介绍注释以及如何处理它们&#xff0c;以便您可以实现自己的出色功能。 注解 Java 5中添加了注释 。Java语言附带了一些预定义的…

(转)MFC技巧学习五

51. 如何获得其他程序的图标,并显示在View中 [问题提出] 有的时候,如:类资源管理器会遇到获得程序图标并显示的操作,如何实现呢? [解决方法] SDK函数SHGetFileInfo来获得有关文件的很多信息:如大小图标,属性,类型等.  [程序实现] 建立名为My的SDI工程.在OnPaint()函数中…

使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

有时候我们有迁移数据库的需求&#xff0c;例如从Oracle迁移到SQL Server&#xff0c;或者从MySQL迁移到Oracle。 很多江湖好汉一时不知如何手工操作&#xff0c;所幸的是Navicat提供了迁移的自动化操作界面。 当然&#xff0c;Navicat的数据库迁移无法做到完美&#xff0c;一些…

书评:Mockito Essentials

Sujoy Acharya的Mockito Essentials副标题&#xff08; Packt Publishing &#xff0c;2014年10月&#xff09;是&#xff1a;“实用指南&#xff0c;可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

Oracle ORA-07445 [evaopn3()+384] 错误 分析

1.OS 和 DB 版本Oracle Version&#xff1a; 11.2.0.2Operation System&#xff1a;HP-UXItanium 11.312.Alert log中信息Tue Oct 16 22:27:31 2012Exception [type: SIGSEGV,Address not mapped to object] [ADDR:0xC00000000] [PC:0x400000000631B880,evaopn3()384] [flags: …

http网站转换成https网站

https&#xff0c;https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题 一&#xff1a;什么是https SSL&#xff08;Security Socket Layer&#xff09;全称是加密套接字协议层&#xff0c;它位于HTTP协议层和TCP协议层之间&#x…

EAGER的获取是代码的味道

介绍 休眠获取策略确实可以使几乎没有爬网的应用程序和响应速度很快的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 &#xff1a; 提取策略 描述 加入 原始SELECT语…

基于S2SH的电子商务网站系统性能优化

对于经常逛网页的人来说最受不了的事情就是访问的网页加载太慢&#xff0c;除去网络的原因网站的系统性能对加载的快慢非常重要&#xff0c; 网上有个统计&#xff1a; 每慢500ms Google访问量降低20% 每慢400ms Yahoo 访问量降低5-9% 每慢100ms Amazon销售额降低1% 对于商务网…

玩Java并发

最近&#xff0c;我需要将一些文件&#xff08;每个文件都有JSON格式的对象列表&#xff08;数组&#xff09;&#xff09;转换为每个文件都具有相同数据&#xff08;对象&#xff09;的分隔行的文件。 这是一次性的任务&#xff0c;很简单。 我使用Java nio的某些功能进行了读…

ExtJs的Reader

ExtJs的Reader Reader : 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,讲解析好的数据保存到Modle中 结构图 Ext.data.reader.Reader 读取器的根类 Ext.data.reader.Json JSON格式的读取器 Ext.data.reader.Array 扩展JSON的Array读取器 Ext.data.reader.Xml XML格…

sound

sound类在 flash3.0中算是很常见的功能&#xff0c;也是很常用的&#xff0c;下面 简单的运用了 sound类&#xff0c;加载了一首歌&#xff0c;控制 播放 暂停 停止&#xff0c;和控制音量大小&#xff1b; package {import flash.display.MovieClip;import fl.controls.*;imp…

Java Lambdas和低延迟

总览 有关在Java和低延迟中使用Lambda的主要问题是&#xff1a; 它们会产生垃圾吗&#xff0c;您能做些什么吗&#xff1f; 背景 我正在开发一个支持不同有线协议的库。 这样的想法是&#xff0c;您可以描述要写入/读取的数据&#xff0c;并且有线协议确定它是否使用带有JSon或…