IOC(控制反转)
正控:自己使用,自己创建对象
反控:将对象的管理,生成,销毁交给Spring来管理,在配置好文件后我们只管在哪里使用在哪里注入,不用去关心对象的创建过程。
spring bean管理
在不同的层上加上与之相应注解标签
spring-jdbc
spring数据访问层功能,
提供Jdbctemplate封装的方法操作数据库
主要使用的是其中的事务管理功能
阿里数据源
阿里巴巴开源的数据源管理组件 音译的 德鲁伊
提供与数据库连接实现,还提供数据库连接池功能
数据库连接池 因为频繁创建销毁数据库连接对象(Connection)
开销较大,提出池的概念
事先缓存一部分连接对象,使用时直接从池中获取
用完后不销毁,还回到池中,减少创建销毁的时间开销
10 20
常见的连接组件 c3p0,dbcp, JNDI, 阿里数据源
不使用Bean进行数据库连接设置
使用Bean进行管理,在哪里使用在哪里注入
在哪里使用便将数据源注入
使用spring JdbcTempllate往数据库中管理数据(例如写入一个数据)
查询
在业务开发中,总有一些功能与业务代码耦合度不强
(例如保存日志,提交事务,权限验证,异常处理......)
可以将其提取到一个工具类中,使用时调用即可.
弊端: 代码已经开发完成,后期需要添加公共功能,就需要改动原来的代码.
需求: 能不能在不修改原来代码的情况下,额外的添加其他公共功能.
解决办法: AOP 面向切面编程 底层使用代理对象(动态代理模式) 前提配置
AOP不是spring框架特有的设计思想.
只能给spring Bean管理的对象来增强功能·
-
- <bean id="aopdemo" class="com.ff.spring.aop.AopDemo">bean>
- <aop:config>
-
-
- <aop:pointcut expression="execution(* com.ff.spring.service.UserService.adduser(..))" id="adduser"/>
-
- <aop:pointcut expression="execution(* com.ff.spring.service.UserService.*(..))" id="allmethod"/>
-
-
- <aop:aspect ref="aopdemo">
- <aop:before method="savelog" pointcut-ref="adduser"/>
- <aop:after method="savelog" pointcut-ref="adduser"/>
- <aop:around method="aroundAdvice" pointcut-ref="adduser"/>
- <aop:after-throwing method="exceptionAdvice" pointcut-ref="allmethod" throwing="e" /> aop:aspect>
- aop:config>
- public void around(ProceedingJoinPoint joinPoint){
- System.out.println("之前开启事务");
- try {
- joinPoint.proceed();//调用切点的方法
- } catch (Throwable throwable) {
- System.out.println("系统忙"+throwable.getMessage());
- }
- System.out.println("之后提交事务");
-
- }
先将xml中的aop移走在使用注解标签
用标签来配置增强类
-
- @Component //发现该类
- @Aspect //Aop配置标签
- public class CommonUtil {
-
- /*
- 目标 : 连接点,切入点所在的类,实际执行者
- 切面: 整个过程
- 代理: 为目标类创建的代理对象
- 通知 实际要增强的功能
- */
- @Before("execution(* com.ffyc.spring.dao.AdminDao.*(..))")
- public void saveLog(){
- System.out.println("保存日志");
- }
-
- @After("execution(* com.ffyc.spring.dao.AdminDao.*(..))")
- public void commit(){
- System.out.println("提交事务");
- }
-
- @AfterThrowing(value = "execution(* com.ffyc.spring.dao.AdminDao.*(..))",throwing = "e")
- public void exception(Throwable e){
- System.out.println("系统忙"+e.getMessage());
- }
-
- @Around("execution(* com.ffyc.spring.dao.AdminDao.*(..))")
- public void around(ProceedingJoinPoint joinPoint){
- System.out.println("之前开启事务");
- try {
- joinPoint.proceed();//调用切点的方法
- } catch (Throwable throwable) {
- System.out.println("系统忙"+throwable.getMessage());
- }
- System.out.println("之后提交事务");
-
- }
- }
- //@Transactional可以作用在类和方法上,添加在类上,此类中所有的方法,都在事务中管理中进行,
- //添加在某个方法上,只对方法有效.
- /*
- @Transactional自动事务管理会在以下情况中失效
- 1.修饰一个非public方法,会导致事务失效
- 2.方法中出现异常,被try catch捕获了 认为方法没有出现异常,事务正常提交
- 3.默认情况下出现编译期异常,会导致事务失效, rollbackFor = Exception.class 任何异常都不提交事务
- 4.@Transactional 事务传播行为设置错误
- 5.数据库引擎不支持事务 mysql中只有InnoDB引擎支持事务
- 6.在同一个类中的一个非事务方法中,通过this调用事务方法,此时是通过非代理对象调用的,导致事务失效
- */