品味Spring的魅力-Java基础-Java-编程开发

Spring IOC之AnnotationConfigApplicationContext AnnotationConfigApplicationContext是Spring框架中的一个实现了ApplicationContext接口的类,它用于创建一个基于注解配置的应用程序上下文。通过AnnotationConfigApplicationContext,你可以使用Java配置类(带有@Configuration注解)来定义和配置Spring容器中的Bean。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。

  EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中加入符合EJB规范的代码。一些轻量级的COP框架,例如Avalon,也要求对象设计时必须符合某种规范,例如Serviceable接口,这种做法是典型的Type 1做法。

  这种设计思路要求Spring采用一种动态的、灵活的方式来设计框架。所以spring大量采用了反射。首先spring要解决的一个问题就是如何管理bean。因为IOC的思想要求bean之间不能够直接调用,而应该采用一种被动的方式进行协作。所以bean的管理是spring中的核心部分。

  反射和内省在代码的层次上思考问题,有时候能够带来出人意料的灵活性。但它的使用有时候也是一个哲学问题,不论是在ORM设计还是在AOP设计上都出现了类似的问题-究竟是使用反射,还是使用代码生成。

  在Spring中,处理这个问题的核心是在org.springframework.beans包中。而其中最为核心的部分,则是BeanWrapper。BeanWrapper,顾名思义,就是bean的包装器。所以,它的主要工作,就是对任何一个bean,进行属性(包括内嵌属性)的设置和方法的调用。在BeanWrapper的默认实现类BeanWrapperImpl中,虽然代码较长,但完成的工作却是非常的集中的。

  BeanWrapper的深入研究

  我们看看这个BeanWrapper是如何发挥运作的,假设我们有两个bean:

public class Company {
 private String name;
 private Employee managingDirector;

 public String getName() {
  return this.name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Employee getManagingDirector() {
  return this.managingDirector;
 }
 public void setManagingDirector(Employee managingDirector) {
  this.managingDirector = managingDirector;
 }
}

public class Employee {
 private float salary;

 public float getSalary() {
  return salary;
 }
 public void setSalary(float salary) {
  this.salary = salary;
 }
}

  然后我们使用BeanWrapper来调用这两个bean:

Company c = new Company();
BeanWrapper bwComp = BeanWrapperImpl(c);
// setting the company name...
bwComp.setPropertyValue("name", "Some Company Inc.");
// ... can also be done like this:
PropertyValue v = new PropertyValue("name", "Some Company Inc.");
bwComp.setPropertyValue(v);

// ok, lets create the director and tie it to the company:
Employee jim = new Employee();
BeanWrapper bwJim = BeanWrapperImpl(jim);
bwJim.setPropertyValue("name", "Jim Stravinsky");
bwComp.setPropertyValue("managingDirector", jim);

// retrieving the salary of the managingDirector through the company
Float salary = (Float)bwComp.getPropertyValue("managingDirector.salary");

  看起来麻烦了许多,但是这样spring就可以使用统一的方式来管理bean的属性了。

Bean的制造工厂

  有了对单个Bean的包装,还需要对多个的bean进行管理。在spring中,把bean纳入到一个核心库中进行管理。bean的生产有两种方法:一种是一个bean产生多个实例,一种是一个bean只产生一个实例。如果对设计模式熟悉的话,我们就会想到,前者可以采用Prototype,后者可以采用Singleton。

  注意到,反射技术的使用使得我们不再像原始的工厂方法模式那样创建对象。反射可以非常灵活的根据类的名称创建一个对象。所以spring只使用了Prototype和Singleton这两个基本的模式。

  spring正是这样处理的,但是我们希望用户能够维护统一的接口,而不需要关心当前的bean到底是Prototype产生的独立的bean,还是Singleton产生的共享的bean。所以,在org.springframework.beans.factory包中的BeanFactory定义了统一的getBean方法。

  JDBC再封装JDBC优雅的封装了底层的数据库,但是JDBC仍然存在诸多的不变。你需要编写大量的代码来完成CRUD操作,而且,JDBC无论是遇到什么样的问题,都抛出一个SQLException,这种做法在异常使用上被称为不完备的信息。因为问题可能是很复杂的,也许是数据库连接的问题,也许是并发控制的问题,也许只是SQL语句出错。没有理由用一个简单的SQLException就搞定全部的问题了,这种做法有些不负责任。针对这两个问题,Spring Framework提出了两种解决方法:首先,提供一个框架,把JDBC应用中的获取连接、异常处理、释放等比较通用的操作全部都集中起来,用户只需要提供特定的实现就OK了。实现的具体细节采用的是模板方法。举个例子,在org.springframework.jdbc.object包中,MappingSqlQuery类实现了将SQL查询映射为具体的业务对象。JavaDoc中这样写到:Reusable query in which concrete subclasses must implement the abstract mapRow(ResultSet, int) method to convert each row of the JDBC ResultSet into an object. 用户必须实现mapRow方法,这是典型模板方法的应用。我们拿一个具体的例子来看看:

class UserQuery extends MappingSqlQuery {

 public UserQuery(DataSource datasource) {
  super(datasource, "SELECT * FROM PUB_USER_ADDRESS WHERE USER_ID = ?");
  declareParameter(new SqlParameter(Types.NUMERIC));
  compile();
 }

 // Map a result set row to a Java object
 protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
  User user = new User();
  user.setId(rs.getLong("USER_ID"));
  user.setForename(rs.getString("FORENAME"));
  return user;
 }

 public User findUser(long id) {
  // Use superclass convenience method to provide strong typing
  return (User) findObject(id);
 }
}

  其次是第二个问题,最麻烦的地方应该说是需要截住JDBC的异常,然后判断异常的类型,并重新抛出异常。错误的问题可以通过连接来获取,所以麻烦的是如何截获异常。Spring Framework采用的方法是回调,处理回调的类在Spring Framework中被称为template

JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList();
template.query("SELECT USER.NAME FROM USER",
new RowCallbackHandler() {
 public void processRow(ResultSet rs) throws SQLException {
  names.add(rs.getString(1));
 }
});

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。

  层间松耦合

  在开放源码界已经出现了大量的基于MVC的Web容器,但是这些容器都仅限于Web的范围,不涉及Web层次后端的连接,spring作为一个整体性的框架,定义了一种Web层和后端业务层的连接方式, 这个思路仍然疏运图MVC的范畴,但耦合更松散,不依赖于具体的集成层次。

public class GoogleSearchController
implements Controller {

 private IGoogleSearchPort google;

 private String googleKey;

 public void setGoogle(IGoogleSearchPort google) {
  this.google = google;
 }

 public void setGoogleKey(String googleKey) {
  this.googleKey = googleKey;
 }

 public ModelAndView handleRequest(
  HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
   String query = request.getParameter("query");
   GoogleSearchResult result =
   // Google property definitions omitted...

   // Use google business object
   google.doGoogleSearch(this.googleKey, query,start, maxResults, filter, restrict, safeSearch, lr, ie, oe);

   return new ModelAndView("googleResults", "result", result);
  }
 }

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。

Spring IOC之ListableBeanFactory ListableBeanFacto是 Spring Framework 的一个子接口,它扩展了 BeanFactory 接口,提供了一种便捷的方式来列举容器中的所有 bean。具体来说,ListableBeanFactory 定义了一些方法,用于获取容器中的所有 bean 的名称、类型和实例。 阅读详情

相关推荐

Jetpack Compose Navigation实战:从基础到高级导航模式

本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。

pz890123456的博客 373

Spring的魅力及与struts的整合

 Spring的魅力及与struts的整合Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java™ 企业软件开发,并且提议很多企业难题都能够通过战略地使用 IOC 模式(也称作依赖注入)来解决。当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了 Spring 框架。简言之,Spring 是一个轻型的容器,利用它可以使用一个外部 XML 配...

Sumongh Zone 107

MySQL连接异常:Communications link failure 解决方案

困扰一晚上的问题终于解决了。

weixin_44704776的博客 1086

品味Spring 的魅力

转载自http://3217.spaces.live.com/blog/cns!69506AAC646C8BA4!124.entry 品味Spring 的魅力 Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中。   EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中加入符合EJB规范的代码。一些轻量级的COP框架,例如Av...

天堂小工(行者无疆,智者无界) 142

告别OpenAI API调用:手把手在本地CPU/GPU上部署fast-whisper中文语音识别模型

本文详细指导如何在本地CPU/GPU上部署fast-whisper中文语音识别模型,摆脱对OpenAI API的依赖。从环境准备、模型获取与优化,到CPU/GPU环境的具体部署步骤和性能优化技巧,全面覆盖本地化语音识别的实现方案,帮助开发者提升效率并保障数据隐私。

weixin_29988907的博客 307

(一)ANSYS WORKBENCH实践入门

ANSYS-workbench 有限元分析应用基础教程 (张晔)学习笔记

qq_51767372的博客 1万+

标题探索[开发语言]的魅力与实战应用

综上所述,开发语言的魅力在于其作为思想工具的强大表达能力和在实战中解决复杂问题的卓越效能。没有一种语言是万能的,但总有一种语言是最适合特定任务的。优秀的开发者不仅精通一门或多门语言,更懂得如何在具体的应用场景中做出最恰当的技术选型。未来,随着云计算、物联网、人工智能的深入发展,开发语言也将继续演化,或许会出现更专业化、更高抽象层次的语言,但核心目标始终如一:赋能人类,用代码塑造更智能、更便捷的未来世界。

hhl0910的专栏 267

Android系统开发面试指南:系统Launcher岗位解析

本文针对上海礼聪Android系统开发岗位(侧重系统Launcher、充电/电池/USB底层开发)提供面试指南。内容涵盖应用开发(启动流程优化)、系统底层(充电状态机、USBOTG)、编程能力(线程安全LRU实现)、问题排查(ANR分析)及沟通协作等核心考点。通过5类典型问题及技术深度解析,帮助候选人系统准备,重点考察Framework源码理解、系统调试能力和工程思维。建议结合PowerManagerService等模块源码和systrace工具进行实践准备,同时注重技术表达与协作能力的展现。

郑伟强dev的专栏 934

七剑与java开源工具

shaily读书学习 943

基于通义千问2.5-7B-Instruct的技术深度解析

通义千问2.5-7B-Instruct是一个基于Transformer架构的大型语言模型,具有70亿参数。它通过自注意力机制和前馈神经网络处理输入序列,能够捕捉长距离依赖关系,适用于多种NLP任务。微调是指在预训练模型的基础上,使用特定任务的数据进行进一步训练,以使模型更好地适应特定任务。微调可以显著提高模型在特定任务上的性能。通义千问2.5-7B-Instruct是一个强大的语言模型,适用于多种NLP任务。通过深入理解其架构、微调方法和核心代码,可以更好地应用于实际场景。

zhangjiaofa的专栏 1569

Meta新开源多语种语音基座Omnilingual ASR

Meta FAIR 团队最近祭出了,这不仅仅是对 MMS (Massively Multilingual Speech) 的简单升级,而是一次从“多任务学习”向“上下文学习(In-Context Learning)”的范式跃迁。通过将 Wav2Vec 2.0 编码器扩展至 70 亿参数,并引入 LLM 风格的 Decoder,Omnilingual ASR 不仅原生支持 1600+ 种语言,更具备了类似 GPT 的“零样本”扩展能力——只需给出几个音频-文本对,即可解锁从未见过的语言。

kakaZhui的博客 146

Java文创产品商城(毕设源码+mysql+lw)

文创产品作为文化产业的重要组成部分,以其独特的艺术魅力和文化内涵,深受消费者的喜爱。因此,建立一个专门的文创产品商城,集中展示和销售各类优质的文创产品,不仅可以满足消费者的多元化需求,也有助于推动文创产业的发展。通过商城的销售数据,可以了解到消费者对于各类文创产品的喜好程度,从而为文创产品的设计和生产提供参考。通过销售具有地方特色的文创产品,可以传播和推广当地的文化,提升城市的知名度和影响力。通过商城,消费者可以了解到各种文创产品的详细信息,包括设计理念、制作工艺、价格等,从而做出更明智的购买决策。

路可程序设计 469

阅文集团大数据面试题及参考答案

在 Flink 中,watermark 是一种用于处理乱序事件时间的机制。实现接口:通常需要实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks 接口。前者会周期性地生成 watermark,后者则是基于某些特定事件来生成 watermark ,比如接收到某个特定值的消息时。定义位置:可以在数据源处或者在流处理的中间操作中定义 watermark。在数据源定义时,能更精准地根据数据的产生特性设置 watermark;

大模型大数据攻城狮的专栏 1088

【附源码】java食谱app(ssm毕业设计+maven+vue+计算机专业)

通过食谱app,用户可以不受时间和空间的限制,随时浏览各式各样的菜谱,从家常小炒到国际美食,从简单快餐到精致宴请,满足不同人群的饮食需求。这些功能不仅丰富了用户的饮食生活,也促进了美食文化的交流与传播,使得每个人都能在繁忙之余,享受烹饪带来的乐趣,提升生活品质。随着智能手机的普及和移动互联网的发展,一款集合了多样菜式、详细烹饪步骤和营养搭配的食谱app应运而生。开发这款app的初衷在于利用科技的力量,将传统烹饪艺术与现代生活方式完美结合,让每一位用户都能在指尖上轻松探索世界各地的美味佳肴。

路可程序设计 449

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm/php/node/python二手球鞋转卖系统

通过购买二手球鞋,消费者可以以较低的价格购买到心仪的球鞋,从而降低了购买成本。这种系统有助于减少浪费。许多人在购买球鞋后,可能因为各种原因而不再穿它们,这些闲置的球鞋如果能够通过二手市场进行流通,不仅可以为其他人提供便利,还能减少资源浪费。二手球鞋转卖系统为消费者提供了一个更加便捷、经济、环保的购物选择,同时也为球鞋文化的传承和发展提供了有力支持。后端SSM框架结合了Spring的依赖注入和事务管理、SpringMVC的模型-视图-控制器架构以及MyBatis的数据持久化功能,为后端开发提供全面的支持。

yiyue02的博客 417

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android应用开发以及设计思想深度剖析(1)

本文内容,主题是透过应用程序来分析Android系统的设计原理与构架。我们先会简单介绍一下Android里的应用程序编程,然后以这些应用程 序在运行环境上的需求来分析出,为什么我们的Android系统需要今天这样的设计方案,这样的设计会有怎样的意义, Android究竟是基于怎样的考虑才变成今天的这个样子,所以本文更多的分析Android应用程序设计背后的思想,品味良好架构设计的魅力。分五次连 载

springsen的专栏 2068

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm/php/node/pythonAndroid服装搭配

它不仅可以利用大数据和人工智能技术为用户推荐搭配方案,还可以根据用户的喜好和场合需求进行个性化定制,大大节省了用户的时间成本,同时也提升了穿搭的趣味性和便捷性。从更深层次来看,“r894k”通过智能推荐系统减少了服装浪费,有助于推动可持续时尚的发展,这对于环境保护和资源节约具有重要的意义。在部署阶段,前端编译生成的静态文件(HTML, CSS, JavaScript等)和后端编译的Java代码一同部署在Tomcat服务器上,从而使得整个Web应用能够在服务器上运行并被用户访问。

vcd601的博客 779

struts2 mysql 分页代码_struts2+spring+hibernate分页代码[比较多]第5/7页

struts2+spring+hibernate分页代码[比较多]第5/7页更新时间:2008年09月27日 15:27:36 作者:J2EE系统中分页显示,修改dao层,service层,action层,两个分页类文件,代码如下分页辅助工具类:Java代码package com.last999.im.news.web;public class PageTool{private int cur...

weixin_33124479的博客 105

2529基于Springboot+Vue的诗词学习鉴赏平台

在当今数字化时代,互联网技术的迅猛发展深刻改变了人们获取信息与学习知识的方式。中华诗词作为中华民族传统文化的瑰宝,承载着数千年的历史、文化与情感,其深厚的内涵与独特的艺术魅力,始终吸引着无数人去探索与品味。然而,在快节奏的现代生活中,诗词的学习与鉴赏面临着诸多挑战。传统的诗词学习途径,如书籍、课堂等,存在着一定的局限性。纸质书籍携带不便,查找特定诗词耗费时间与精力,且书中的鉴赏分析往往较为单一。课堂学习受时间与空间限制,无法满足人们随时随地深入探究诗词的需求。此外,传统方式缺乏互动性,难以激发学习者的积极性

z459382737的博客 626

web一课一得

在深入研习 Spring Boot 与 Vue 协同构建项目管理博客的过程中,点滴积累汇聚成丰富的知识与实操经验,每一步都蕴含着值得反复品味的收获。

jiangke84的博客 1752

2026最新 SpringBoot+Vue校园二手交易系统的设计与实现

摘要 本文分享了基于SpringBoot+Vue+MyBatis的智能停车系统源码资源,提供夸克和百度网盘下载链接(含完整教程)。系统采用主流技术栈:SpringBoot简化配置、Vue实现响应式前端、MyBatis管理数据库操作。核心功能包括:车位查询/预定、停车记录管理、费用结算等,通过Controller代码示例展示了车位分页查询、预定、增删改查等接口实现。系统支持用户停车记录查询、未缴费订单统计,并附带多张功能界面截图展示实际效果。(149字)

Hypoxia_9的博客 542

深入理解Java多态:从方法重写、向上转型到设计模式实践

多态是面向对象编程的核心概念之一,它允许同一操作作用于不同的对象,产生不同的执行结果。其实现原理主要基于方法重写和向上转型,通过动态绑定机制在运行时确定具体调用的方法。这一特性极大地提升了代码的可扩展性和可维护性,是实践开闭原则的关键技术。在软件设计中,多态常用于消除复杂的条件分支,实现依赖倒置原则,让高层模块依赖于抽象而非具体实现。例如,在支付系统、图形渲染等场景中,通过接口或抽象类定义统一契约,不同子类提供具体实现,使得系统能够灵活应对变化。结合方法重写、向上转型等机制,多态为构建可插拔的架构提供了基础

weixin_33919950的博客 406

SpringBoot+Vue校园二手交易系统的设计与实现

本文介绍了一个基于SpringBoot+Vue+MyBatis的全栈开发项目,由资深全栈工程师开发。项目采用SpringBoot简化后端配置,Vue实现响应式前端,MyBatis处理数据库操作。提供了车位管理系统的完整实现方案,包括车位预定、添加、更新和删除功能,并配有详细的代码示例和系统截图。项目源码完整可运行,适合作为毕业设计或学习参考。作者提供技术咨询和项目定制服务,帮助解决开发中的各类问题。

qq_42631286的博客 1083

基于SpringBoot框架的中华美食网站(计算机毕业设计)+万字说明文档

现如今信息技术飞速发展,人们生活水平不断攀升,人们对美食有了更高的追求。传统获取美食信息和菜谱都是通过电视、广播、书籍等方式,方式比较落后实用性不强,采用互联网技术开发一款美食网站的话就可以随时随地的来查看或者分享美食信息,学习美食做法,拓宽人们获取美食资讯的途径,提高管理员管理效率。本文通过对美食系统的研究,希望开发出一款符合人们需求的线上中华美食网站,来弥补当前市场上对新型技术框架结合美食产业的空缺。

weixin_42100694的博客 649
上一篇: Java数据对象(JDO)的前世今生-Java基础-Java-编程开发
下一篇: 学习 是一条漫长的道路-Java基础-Java-编程开发
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值