Spring的四大优势,你是如何理解的?

栏目: Java · 发布时间: 5年前

内容简介:Spring是分层的 Java SE/EE 应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层SpringMVC和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于

Spring是分层的 Java SE/EE 应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层SpringMVC和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。

用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 通过Spring提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。

spring方便解耦的实现代码:

`ContextStartedEvent:ApplicationContext启动后触发的事件 ContextStoppedEvent:ApplicationContext停止后触发的事件 ContextRefreshedEvent:ApplicationContext初始化或刷新完成后触发的事件 ContextClosedEvent:ApplicationContext关闭后触发的事件

·在tomcat中ContextRefreshedEvent可能会触发两次,SpringBoot中只触发一次`

2、AOP编程的支持

AOP即是面向切面编程,是对OOP面向对象编程的补充和完善。

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引用特点的语法创建“方面”,从而使可以在编译期间织入有关“方面”的代码。 AOP的使用场景:权限,缓存,日志记录,事务,性能优化,异常处理。

通过Spring的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过AOP 轻松应付。

spring AOP编程支持的实现代码: `开发步骤: (1):先引入aop相关的jar文件 spring-aop-3.2.5.RELEASE.jar【去spring3.2源码里面找】 aopalliance.jar【去spring2.5源码/lib/aopalliance文件里面找】 aspectjweaver.jar【去spring2.5源码/lib/aspectj文件里面找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】 aspectjrt.jar【去spring2.5源码/lib/aspectj文件里面找】或者 【aspectj-1.8.2/lib/aspectjrt.jar】  

《注意:用到的spring2.5版本的jar本舰,如果用jd1.7版本可能会出现问题,
             
             需要升级以下aspectj组件,即使用aspectj-1.8.2版本中提供的jar文件aspectjweaver.jar和aspectjrt.jar》

            (2)bean.xml中引入aop名称空间 
                技巧:找到文件
复制代码

spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle         

打开index.html搜索xmlns:aop然后找到下面红色三句话,分别拷贝到bean.xml中         
复制代码

<beans xmlns=" www.springframework.org/schema/bean… "       xmlns:xsi=" www.w3.org/2001/XMLSch… "                                                                                          xmlns:aop=" www.springframework.org/schema/aop "           xsi:schemaLocation=" www.springframework.org/schema/bean…                 www.springframework.org/schema/bean…             www.springframework.org/schema/aop         www.springframework.org/schema/aop/… ">`

3、声明式事务的支持

可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式:使用TransactionProxyFactoryBean: 围绕Poxy的动态代理能够自动的提交和回滚事务 org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

spring声明式事务的支持的实现代码:

` tx:advice id="advice" transaction-manager="transactionManager" tx:attributes tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/ tx:method name="*" propagation="SUPPORTS"/ </tx:attributes></tx:advice>

aop:config aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/ aop:advisor advice-ref="advice" pointcut-ref="pointcut"/ </aop:config>`

4、方便程序的测试 可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 编程式,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。 编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象

spring方便程序测试的实现代码: 1)基类,其实就是用来加载配置文件的@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试  @ContextConfiguration({"/spring/app*.xml","/spring/service/app*.xml"})  //加载配置文件   //------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上 //控制事务,参见下一个实例   //这个非常关键,如果不加入这个注解配置,事务控制就会完全失效! //@Transactional   //这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时 //指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)   //------------   public class BaseJunit4Test {   }   2)接着是我们自己的测试类public class UserAssignServiceTest extends BaseJunit4Test{          @Resource  //自动注入,默认按名称            private IBaseDao baseDao;         @Test   //标明是测试方法       @Transactional   //标明此方法需使用事务       @Rollback(false)  //标明使用完此方法后事务不回滚,true时为回滚        public void insert( ) {                                                                                                                  String sql="insert into user(name,password) values(?,?)";                    Object[] objs=new Object[{"00","000"};                                                                        baseDao.insert( sql , objs );                            String sql1="select * from user where name=? and password=? ";                      List<Map<String,Object>> list=baseDao.queryForList( sql1 , objs );                    System.out.println(list);                     assertTrue(list.size( )>0);             }   } -END-


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新者的解答

创新者的解答

【美】克莱顿•克里斯坦森、【加】迈克尔·雷纳 / 中信出版社 / 2013-10-10 / 49.00

《创新者的解答》讲述为了追求创新成长机会,美国电信巨子AT&T在短短10年间,总共耗费了500亿美元。企业为了保持成功记录,会面对成长的压力以达成持续获利的目标。但是如果追求成长的方向出现偏误,后果往往比没有成长更糟。因此,如何创新,并选对正确方向,是每个企业最大的难题。 因此,如何创新,并导向何种方向,便在于创新结果的可预测性─而此可预测性则来自于正确的理论依据。在《创新者的解答》中,两位......一起来看看 《创新者的解答》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试