赞
踩
Spring 框架作为 JavaEE 开发的灵魂框架,以下是我在学习 Spring 框架时写下的一些总结和个人心得。
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC
(Inverse Of Control:
反转控制)和 AOP
(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring
MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多
著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。
方便解耦,简化开发
IoC
容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。因为 Spring 通过 DI
(依赖注入)将对象的创建交给了 Spring 来实现,避免了我们过多的使用 new
关键字来创建对象。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可AOP 编程的支持
AOP
功能,方便进行面向切面的编程,许多不容易用传统 OOP
实现的功能可以通过 AOP
轻松应付。将一些重复的代码(用于增强功能的代码)抽取出来,在不修改源码的情况下对其进行增强。声明式事务的支持
方便程序的测试
IoC 全称 Inversion Of Control 即控制反转。我的理解就是在之前我们对象都是自己创建的,也就是使用 new 关键字创建的,而现在我们不去自己创建对象了,而是让框架去帮我们创建对象。它的目的就是为了程序解耦,当然它也只能是削减程序的耦合性,并不是完全消除,毕竟不可能完全消除掉程序的耦合性。框架实现的方式就是依赖注入即 DI
。
DI 全称 Dependency Injection 依赖注入。我们告诉框架我们要使用的类的全类名,然后在要使用的时候直接通过框架来获取这个类的实例对象。
使用方式分为两种,xml 文件配置和注解,而且这两种方式可以结合起来使用,也是比较推荐的使用方式。毕竟纯注解或是纯配置文件的方式来使用,都是有一定的繁琐的。
首先是在配置文件中使用 bean
标签来配置让框架创建的对象。
<bean id="accountService" class="xkx.ssm.service.impl.AccountServiceImpl" scope="singleton">
id
给对象在容器中提供一个唯一标识。用于获取对象。class
指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。scope
指定对象的作用范围。常用两个属性 singleton
(单例,默认值)和 prototype
(多例)。然后在需要使用这个对象时,通过以下代码来获取。
//1.使用ApplicationContext接口,就是在获取spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据bean的id获取对象
IAccountService aService = (IAccountService) ac.getBean("accountService");
首先是在配置文件中要告知框架使用注解是要扫描的包。
<context:component-scan base-package="xkx.ssm"></context:component-scan>
然后在需要让框架创建的类上面加一个注解,并且给这个对象指定一个标识。
@Component("accountService")
它有三个子注解,分别对应着我们的三层框架,这三个子注解并没有特殊的作用,但是推荐对应着使用。
@Controller
对应着 web 层@Service
对应着业务层@Repository
对应着持久层最后在需要使用的时候,使用注解将其注入即可。注入的注解有三个。
@Autowired
自动按照类型注入。@Qualifier
在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和上一个注解一起使用;但是给方法参数注入时,可以独立使用。@Resource
直接按照Bean的id注入。一般情况下,我们自己写的类都是通过注解的方式来使用,而导入类就是通过配置的方式来使用。
AOP:全称是 Aspect Oriented Programming 即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
<!-- 配置通知 --> <bean id="txManager"class="xkx.ssm.utils.TransactionManager"> <property name="dbAssit" ref="dbAssit"> </property> </bean> <aop:config> <!-- 配置切入点表达式 id属性用于指定表达式的唯一标识。expression属性用于指定表达式内容 此标签写在aop:aspect标签内部只能当前切面使用。 它还可以写在aop:aspect外面,此时就变成了所有切面可用 --> <aop:pointcut id="pt1" expression="execution(* xkx.ssm.service.impl.*.*(..))"></aop:pointcut> <!--配置切面 --> <aop:aspect id="logAdvice" ref="logger"> <!-- 配置前置通知:在切入点方法执行之前执行 <aop:before method="beforePrintLog" pointcut-ref="pt1" ></aop:before>--> <!-- 配置后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个 <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>--> <!-- 配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个 <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>--> <!-- 配置最终通知:无论切入点方法是否正常执行它都会在其后面执行 <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>--> <!-- 配置环绕通知--> <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around> </aop:aspect> </aop:config>
首先在配置文件中开启spring对注解AOP的支持
<aop:aspectj-autoproxy/>
在通知类上面写上一个注解 @Aspect
声明它是一个切面类。
然后在它的方法上写上注解来声明它是什么通知,对应着分别有五个注解
@Before
前置通知@AfterReturning
后置通知@AfterThrowing
异常通知@After
最终通知@Around
环绕通知一般情况下都是通过 xml 文件配置来声明事务控制的,因为可以一劳永逸。
<!-- 配置事务管理器 --> <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务的通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 配置事务的属性 isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。 propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。 read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。 timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。 rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。 no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。 --> <tx:attributes> <tx:method name="*" propagation="REQUIRED" read-only="false"/> <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method> </tx:attributes> </tx:advice> <!-- 配置aop--> <aop:config> <!-- 配置切入点表达式--> <aop:pointcut id="pt1" expression="execution(* xkx.ssm.service.impl.*.*(..))"></aop:pointcut> <!--建立切入点表达式和事务通知的对应关系 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor> </aop:config>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。