- 浏览: 21504831 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2418788
-
Spring杂谈
浏览量:3008937
-
跟开涛学SpringMVC...
浏览量:5639555
-
Servlet3.1规范翻...
浏览量:259959
-
springmvc杂谈
浏览量:1597398
-
hibernate杂谈
浏览量:250248
-
跟我学Shiro
浏览量:5859054
-
跟我学Nginx+Lua开...
浏览量:702035
-
亿级流量网站架构核心技术
浏览量:785263
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
还记得 如下这种配置吗:
1、struts2作用域:每一个Action我们必须设置scope为prototype 每次都做重复的配置,而且有时候忘记配置还会出现bug,想不想删掉它?
<bean id="**Action" class="***Action" scope="prototype">
2、在使用spring集成hibernate时,每次都必须注入sessionFactory,虽然可以用父子bean解决 但还是要写parent="abstractHibernateDao"之类的。
<bean id="***Dao" class="***DaoImpl">
<property name="sessionFactory" ref="sessionFactory">
</bean>
受够了这种配置,得想法解决这个重复配置,怎么解决呢?
补充:
首先感谢downpour大哥的批评:
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
1、sessionFactory注入问题:
如果是注解这个可以写个通用的基类就很容易搞定;
如果是XML 也可以通过在beans标签上使用 default-autowire="byName" default-autowire-candidates="*Dao" 也能解决问题,当我们通过类似于如下方式时,必须在每个相关的配置文件中都写上。
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml </param-value> </context-param>
2、struts2 Action scope问题
如果使用StrutsPrepareAndExecuteFilter可以通过:
<init-param> <param-name>actionPackages</param-name> <param-value>Action所在包前缀</param-value> </init-param>
scope会自动是prototype
使用我说的这种设置方式:我觉得因为只要会Struts2+Spring集成都知道struts2的Action是prototype,可以用;『prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。』这个是这么回事,需要仔细考虑下;当然我可以考虑在配置文件中加上注释 说明一下 告诉其他人是怎么回事。
另外这个功能我想可以改建为检查配置是否正确 类似于spring的依赖检查。欢迎大家拍砖。
思路:
在BeanFactory创建Bean之前查找所有我们需要通用化配置的Bean 然后修改BeanDefinition注入我们的通用数据就可以解决我们这个问题。
Spring提供了BeanFactoryPostProcessor扩展点,用于提供给我们修改BeanDefinition数据的。
还记得org.springframework.beans.factory.config.PropertyPlaceholderConfigurer吗? 替换占位符数据,它就是一个BeanFactoryPostProcessor的实现。
好了思路有了,接下来我们实现一下吧:
1、XML配置方式
*
* 使用方法:<br/>
* <pre>
* <bean class="cn.javass.common.spring.CommonConfigureProcessor">
<property name="config">
<map>
<!-- aspectj表达式 选择所有Action结尾的Bean 注入scope数据 为 prototype -->
<entry key="cn.javass..*Action">
<props>
<prop key="scope">prototype</prop>
</props>
</entry>
<!-- aspectj表达式 选择所有的HibernateDaoSupport实现Bean 注入sessionFactory -->
<entry key="org.springframework.orm.hibernate3.support.HibernateDaoSupport+">
<props>
<prop key="property-ref">sessionFactory=sessionFactory</prop>
</props>
</entry>
</map>
</property>
</bean>
* </pre>
*
* 目前支持三种配置:
* scope:注入作用域
* property-ref:注入Bean引用 如之上的sessionFactory
* propertyName=beanName
* property-value:注入常量值
* propertyName=常量
2、CommonConfigureProcessor源码
package cn.javass.common.spring; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import org.aspectj.bridge.IMessageHandler; import org.aspectj.weaver.ResolvedType; import org.aspectj.weaver.World; import org.aspectj.weaver.bcel.BcelWorld; import org.aspectj.weaver.patterns.Bindings; import org.aspectj.weaver.patterns.FormalBinding; import org.aspectj.weaver.patterns.IScope; import org.aspectj.weaver.patterns.PatternParser; import org.aspectj.weaver.patterns.SimpleScope; import org.aspectj.weaver.patterns.TypePattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.RuntimeBeanNameReference; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.util.StringUtils; /** * * 设置通用配置<br/> * * 使用方法:<br/> * <pre> * <bean class="cn.javass.common.spring.CommonConfigureProcessor"> <property name="config"> <map> <!-- aspectj表达式 选择所有Action结尾的Bean 注入scope数据 为 prototype --> <entry key="cn.javass..*Action"> <props> <prop key="scope">prototype</prop> </props> </entry> <!-- aspectj表达式 选择所有的HibernateDaoSupport实现Bean 注入sessionFactory --> <entry key="org.springframework.orm.hibernate3.support.HibernateDaoSupport+"> <props> <prop key="property-ref">sessionFactory=sessionFactory</prop> </props> </entry> </map> </property> </bean> * </pre> * * 目前支持三种配置: * scope:注入作用域 * property-ref:注入Bean引用 如之上的sessionFactory * propertyName=beanName * property-value:注入常量值 * propertyName=常量 * * @author Zhangkaitao * @version 1.0 * */ public class CommonConfigureProcessor implements BeanFactoryPostProcessor { private Logger log = LoggerFactory.getLogger(CommonConfigureProcessor.class); private Map<String, Properties> config = new HashMap<String, Properties>(); public void setConfig(Map<String, Properties> config) { this.config = config; } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException { log.debug("apply common config start"); for(Entry<String, Properties> entry : config.entrySet()) { String aspectjPattern = entry.getKey(); Properties props = entry.getValue(); List<BeanDefinition> bdList = findBeanDefinition(aspectjPattern, factory); apply(bdList, props); } log.debug("apply common config end"); } private void apply(List<BeanDefinition> bdList, Properties props) { for(Entry<Object, Object> entry : props.entrySet()) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); switch(SupportedConfig.keyToEnum(key)) { case scope : applyScope(bdList, value); break; case propertyRef: applyPropertyRef(bdList, value); break; case propertyValue: applyPropertyValue(bdList, value); break; default: throw new IllegalArgumentException(String.format("错误的配置:[%s]", key)); } } } private void applyPropertyValue(List<BeanDefinition> bdList, String value) { for(BeanDefinition bd : bdList) { String propertyName = value.split("=")[0]; String propertyValue = value.substring(propertyName.length()+1); bd.getPropertyValues().add(propertyName, propertyValue); log.debug("apply property value {} to {}", value, bd.getBeanClassName()); } } private void applyPropertyRef(List<BeanDefinition> bdList, String value) { for(BeanDefinition bd : bdList) { String propertyName = value.split("=")[0]; String propertyValue = value.substring(propertyName.length()+1); bd.getPropertyValues().addPropertyValue(propertyName, new RuntimeBeanReference(propertyValue)); log.debug("apply property ref {} to {}", value, bd.getBeanClassName()); } } private void applyScope(List<BeanDefinition> bdList, String value) { for(BeanDefinition bd : bdList) { bd.setScope(value); log.debug("apply scope {} to {}", value, bd.getBeanClassName()); } } private List<BeanDefinition> findBeanDefinition(String aspectjPattern, ConfigurableListableBeanFactory factory) { List<BeanDefinition> bdList = new ArrayList<BeanDefinition>(); for(String beanName : factory.getBeanDefinitionNames()) { BeanDefinition bd = factory.getBeanDefinition(beanName); if(matches(aspectjPattern, bd.getBeanClassName())) { bdList.add(bd); } } return bdList; } private boolean matches(String aspectjPattern, String beanClassName) { if(!StringUtils.hasLength(beanClassName)) { return false; } return new AspectJTypeMatcher(aspectjPattern).matches(beanClassName); } //支持的操作 private static enum SupportedConfig { scope("scope"), propertyRef("property-ref"), propertyValue("property-value"), error("error"); //出错的情况 private final String key; private SupportedConfig(String key) { this.key = key; } public static SupportedConfig keyToEnum(String key) { if(key == null) { return error; } for(SupportedConfig config : SupportedConfig.values()) { if(config.key.equals(key.trim())) { return config; } } return error; } } public static interface TypeMatcher { public boolean matches(String className); } static class AspectJTypeMatcher implements TypeMatcher { private final World world; private final TypePattern typePattern; public AspectJTypeMatcher(String pattern) { this.world = new BcelWorld(Thread.currentThread().getContextClassLoader(), IMessageHandler.THROW, null); this.world.setBehaveInJava5Way(true); PatternParser patternParser = new PatternParser(pattern); TypePattern typePattern = patternParser.parseTypePattern(); typePattern.resolve(this.world); IScope scope = new SimpleScope(this.world, new FormalBinding[0]); this.typePattern = typePattern.resolveBindings(scope, Bindings.NONE, false, false); } @Override public boolean matches(String className) { ResolvedType resolvedType = this.world.resolve(className); return this.typePattern.matchesStatically(resolvedType); } } public static void main(String[] args) { //System.out.println(new AspectJTypeMatcher("cn.javass..*Action").matches("cn.javass.test.web.action.AbcAction")); //System.out.println(new AspectJTypeMatcher("com.opensymphony.xwork2.ActionSupport+").matches("cn.javass.erp.web.action.MoneyAction")); } }
此类只实现基本的通用配置,欢迎大家提供想法并完善这个工具类。
评论
给你投票去
还有,你的头像笑得好灿烂!!!!
爱笑的人运气不会很差 哈哈
给你投票去
呵呵,他说的是对的,而且很犀利 ,革命尚未成功,同志仍需努力;加油啦
给你投票去
还有,你的头像笑得好灿烂!!!!
给你投票去
不过真的,从我出道后每一个项目,xml方式的,都用了自动装配,
确实也从来没有在doa里配置过sessionFactory
也挺方便的,个人觉得还是应该很多项目都用吧。
而struts2的Action的scope为prototype的,我觉得在我感觉
是一种设计模式的体现,为什么这里要用prototype,这是我第一次看到的疑问,
后来查资料,才学到了点东西,如果这个取消了,确实是语意的缺失吧,
也许自己懂,但或多或少对别人、或者是新手有点...
而且任何东西,我觉得不到万不得已,我都不推荐修改源码...
小弟不才,对不住了,闲的没事也来和你冒下皮皮,
不过依旧支持你,探索的精神和原创的风格都是难得的...
谢谢,掉进坑里了,听了大家的意见 确实此类无用 在此留作纪念 时刻提醒自己有些东西可能有更简单的方案/而有些东西不应该使用所谓的简单方案。
不过真的,从我出道后每一个项目,xml方式的,都用了自动装配,
确实也从来没有在doa里配置过sessionFactory
也挺方便的,个人觉得还是应该很多项目都用吧。
而struts2的Action的scope为prototype的,我觉得在我感觉
是一种设计模式的体现,为什么这里要用prototype,这是我第一次看到的疑问,
后来查资料,才学到了点东西,如果这个取消了,确实是语意的缺失吧,
也许自己懂,但或多或少对别人、或者是新手有点...
而且任何东西,我觉得不到万不得已,我都不推荐修改源码...
小弟不才,对不住了,闲的没事也来和你冒下皮皮,
不过依旧支持你,探索的精神和原创的风格都是难得的...
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
default-autowire="byName" default-autowire-candidates="*Dao" 当多配置文件时,在每个配置文件都得配置这句,你也是这样的吗?
就博主这篇文章而言,我虽然也许不会使用楼主的方案,但是后面很多兄弟的评论提出了自己的方案,不乏很好的,我或许会用上,那么我们是不是可以说博主的文章是有价值的?至少对我是有帮助的,不管是文章本身,还是因文章而引发的评论。
比如struts2的Action的scope为prototype,每次都重复配置,就想不重复配置,不知道你有什么思路。
就博主这篇文章而言,我虽然也许不会使用楼主的方案,但是后面很多兄弟的评论提出了自己的方案,不乏很好的,我或许会用上,那么我们是不是可以说博主的文章是有价值的?至少对我是有帮助的,不管是文章本身,还是因文章而引发的评论。
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
声明:实际做项目我没有这么用过,只是最近在想我天天重复配置 所以想出这个玩意来。
关于prototype的问题 我仔细考虑了一下 的确应该配置 代码写出来首先是人维护(因为只要做struts2基本都知道action是prototype,不知道大哥有没有什么好的思路[比如用@Action注解默认情况下就是prototype])。
因此我想可以把这个类改造成检查相关配置是否配置了,如果没有配置就告警,而不是通用这个配置?
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
仔细考虑了一下
你应该通过candidates限定了。
default-autowire="byName" default-autowire-candidates=""
从这点可以看出sessionFactory没必要用这个。
Autowired有几个真正用过?你做过几个项目?我05年就开始用Autowired,到现在为止没有任何一个项目在DAO里面配置过sessionFactory。
XML配置的核心就是保证配置的语义,把一个attribute省略只能带来语义上的缺失。
像你这样的水平,我真的建议你少发点文章误导别人。你的很多想法还停留在6年前我们讨论最佳实践的水平,给出来的东西都还不是最好的方案。当然你为私塾在线做广告可以,但是千万不要嘴硬觉得自己有多了不起。
iteye就是被你这样的人搞得从一个原本还挺高端的讨论论坛,变成了一个充满错误观点,人气低落的社区。
我没有说我写的是对的,所以发上来探讨,而作为大哥的您觉得我水平不行应该开导,而不是打击, 没有人一开始就什么都会,都是经验和教训总结出来的,所以才发上来,没有讨论那就是自闭,所以你回复我我很感激,我写的东西是很入门 很基础,但我认真写了,现在也在认真的学习,从没有停止过。
我从来没认为我厉害,我水平本来就是很菜,希望像您这样的牛人指点。
每个人都有一个发展历程,就像面向对象一样,可能在您看来都悟透了,可对于我们这种刚刚出道的就没那么多经验/教训去体会为什么。所以每次看都有不同的收获。
我觉得像您这种牛人应该学会鼓励我们这种刚出道不久的如何去研究/思考,而不是打击。
我写的不对 就应该被批评。非常感谢您能回复。
Autowired我认为它的范围太大 对于所有setter都要查找并注入,所以很难排查错误原因,只有在运行期运行到那才会知道。 这是我的体会。
我写这个文章也是想表达一种我的一些思考,为什么每次我都要配置这个东西?而且还是重复的?为什么就不能不配?
Autowired有几个真正用过?你做过几个项目?我05年就开始用Autowired,到现在为止没有任何一个项目在DAO里面配置过sessionFactory。
XML配置的核心就是保证配置的语义,把一个attribute省略只能带来语义上的缺失。
像你这样的水平,我真的建议你少发点文章误导别人。你的很多想法还停留在6年前我们讨论最佳实践的水平,给出来的东西都还不是最好的方案。当然你为私塾在线做广告可以,但是千万不要嘴硬觉得自己有多了不起。
iteye就是被你这样的人搞得从一个原本还挺高端的讨论论坛,变成了一个充满错误观点,人气低落的社区。
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
比如我自己开发维护一个项目,为什么就不能使用呢? 就像spring的占位符替换, 大家都用了自然也就都会了。 当然如果项目是团队协作 而且不了解这个东西 肯定不推荐 如果我熟悉我觉得用用真无妨
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
autowired 有几个真正用过? autowired会使项目更乱不是吗?
prototype不能也该省:是这样 但是如果有东西强制给你加上不是更好吗? 我不能保证我每次都不忘。
sessionFactory这段配置从来就是可以省略的。如果用注解是可以省略,如果用xml 1、做父子Bean;2、使用自动装配(不过这个技术有几个人用?)
如果用注解肯定不会存在这种情况。
prototype属性不能也不该省略,配置是给人看的,要是人看不懂就是垃圾。
综上所述,此方案纯粹脱裤子放屁多此一举。
在没有注解的情况下 继承基类也是需要在xml注入数据 (此处不是讲注解的情况 )
这个可以控制的 只要写的符合某些规则即可 如果无规则那肯定不行
因为此处使用的是aspectj语法
发表评论
-
一段Spring代码引起的调用绑定总结
2014-03-04 07:41 15379代码 @Component public class B ... -
一段Spring代码引起的调用绑定总结
2014-03-02 10:53 0代码 @Component public class ... -
Spring Cache抽象详解
2014-01-08 07:54 151097缓存简介 缓存,我的理解是:让数据更接近于使 ... -
Spring3.1新属性管理API:PropertySource、Environment、Profile
2014-01-07 08:05 72991Spring3.1提供了新的属性管理API,而且功能非常强 ... -
Spring3.1新属性管理API:PropertySource、Environment、Profile
2014-01-07 08:04 0Spring3.1提供了新的属性管理API,而且功能非常强 ... -
Spring动态部署Bean/Controller/Groovy Controller
2014-01-06 08:00 24466最近有好几个咨询如何动态部署Bean/动态部署Spring ... -
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
2013-12-25 07:58 68894Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——JSR310日期时间API的支持
2013-12-24 07:48 39469Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring3.1新属性管理API:PropertySource、Environment、Profile
2013-12-23 21:44 0Spring3.1提供了新的属性管理API,而且功能非常强 ... -
Spring4新特性——更好的Java泛型操作API
2013-12-23 07:43 42013Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——Groovy Bean定义DSL
2013-12-19 07:33 37780Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——Groovy Bean定义DSL
2013-12-18 20:53 0Spring4支持使用Groovy DSL来进行Bean定 ... -
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
2013-12-16 08:10 158129Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
2013-12-15 10:51 0在之前的《跟我学SpringMVC》中的《第七章 注解式控 ... -
Spring4新特性——Web开发的增强
2013-12-14 08:12 270752Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——核心容器的其他改进
2013-12-14 07:23 47764Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring4新特性——核心容器的其他改进
2013-12-13 22:54 311接上一篇《Spring4新特性——泛型限定式依赖注入》,接 ... -
Spring4新特性——泛型限定式依赖注入
2013-12-13 20:46 119576Spring4新特性——泛型限定式依赖注入 Spring ... -
Spring事务超时时间可能存在的错误认识
2013-12-06 09:36 476181、先看代码 1.1、spring-config.xml ... -
采用共享jar包部署struts2+spring集成项目会遇到的问题
2013-11-29 06:45 6356比如tomcat下边有个lib,放着我们需要的struts2 ...
相关推荐
AOP允许我们将日志、事务管理、安全检查等通用功能作为“切面”独立处理,避免了在多个类中重复编写相同代码。切面通过定义切入点(Pointcut)和通知(Advice)来实现,Spring提供了多种通知类型,如前置通知、后置...
- **容器**:Spring提供了两种类型的容器——BeanFactory和ApplicationContext,它们都实现了工厂模式,用于实例化、定位和配置对象或bean。 - **MVC框架**:Spring提供了一个轻量级的MVC框架,方便快速地开发Web...
通过AOP,我们可以定义横切关注点,如日志记录、事务管理等,将这些通用逻辑抽取出来,避免在每个业务方法中重复编写。Spring AOP支持使用注解和XML配置两种方式定义切面,大大提高了代码的可读性和可维护性。 最后...
例如,日志、事务管理等通用功能可以通过切面实现,减少代码重复,提高代码结构清晰度。 3. **IoC容器**:Spring的核心组件,负责管理对象的生命周期和装配。容器读取配置元数据,创建并管理对象,通过依赖注入将...
3. **AOP**:面向切面编程允许开发者将关注点分离,例如日志、事务管理等,可以编写一次,然后在整个应用中通用,减少代码重复。 二、Spring MVC 1. **Model-View-Controller**:Spring MVC 是 Spring 框架的一...
【知识点详解】 在软件开发中,特别是在企业级应用中,数据管理是一个重要的环节。CRUD(Create, Read, Update, Delete)...使用Spring Boot的AOP特性,我们可以高效地实现这一目标,使得CRUD操作更加智能化和自动化。
Spring框架中的AOP(面向方面编程)是其核心特性之一,它是对传统面向对象编程(OOP)的一种补充,用于解决横切关注点的问题,即那些在多个类中重复出现的非核心业务逻辑,如事务管理、日志记录、安全性等。...
**mica:云母——Spring Cloud微服务开发的核心包** mica,取名自云母,是一种在Spring Cloud生态中的微服务开发核心工具集。它为开发者提供了丰富的基础工具类和组件,使得在构建分布式系统时能够更加高效、便捷。...
此外,对于那些通用但需要特殊处理的部分,开发者可以保留接口不生成具体的实现,留待后期根据业务逻辑自行编写。 在Spring框架中,代码生成工具可以生成Service和Controller层的代码,为服务调用和视图展示提供...
- `spring-aop.jar`:此文件包含了Spring的AOP模块,提供了面向切面的编程实现,允许开发者在不修改源代码的情况下,对方法进行拦截和增强,如日志记录、事务管理等。 - `spring-context.jar`:这是Spring框架的...
本主题主要关注的是“templates”——一组用于避免记忆大量无用配置设置的通用模板,尤其与Java编程语言相关。 标题“templates:一组通用模板,以避免记住无用的配置设置”揭示了这个资源的核心价值。这里的...
SSM企业级开发框架是Java领域中常用的三大框架——Spring、SpringMVC和MyBatis的集成,广泛应用于Web应用的开发。这个压缩包提供的内容是基于MySQL数据库的SSM框架实现,适用于学习和理解企业级开发流程。下面将详细...
通过定义切面、通知和切入点,我们可以将这些通用功能模块化,减少代码重复,提高代码质量。 五、数据访问集成 Spring提供了对各种数据库访问技术的支持,如JDBC、Hibernate、MyBatis等。在“holaspring”项目中,...
- **BeanFactory与ApplicationContext:** Spring提供了两个核心接口——BeanFactory和ApplicationContext,前者是最基础的工厂接口,后者提供了更丰富的应用上下文环境。 **2. Spring的IoC容器** - **Bean的生命...
- **数据访问抽象**:Spring提供了一种通用的数据访问抽象层,包括高效且易于使用的JDBC框架,极大地提高了数据库操作的效率并减少了潜在的错误。此外,Spring的数据访问框架还集成了Hibernate等其他对象关系映射...
封装可以提高代码的复用性,例如创建一个BaseController,提供通用的方法如结果集返回、参数校验等,其他Controller可以继承这个基类,减少重复代码。 3. **异常处理**:SpringBoot提供了全局异常处理机制,可以...
1. **减少代码开发量**:框架能够通过一系列预定义的功能模块和通用的设计模式,减少开发者编写重复代码的工作量。 2. **注重流程处理**:框架提供了一套标准化的操作流程,帮助开发者遵循最佳实践,从而提高软件的...
这样既可以利用`List`接口提供的通用方法,又可以利用`ArrayList`的具体实现细节。 #### 4. MVC 模式中控制器的作用 **题目**: MVC模式中,控制器的作用是? - **选项**: - A: 从模型中获取数据并指定这些数据...