1、Spring是什么?
Spring是轻量级的JAVAEE应用开源框架
2、Spring的好处?
IOC:控制反转
AOP:面向切面 粘合剂:整合其他技术和框架
1、耦合
耦合:对象之间的依赖关系(service依赖于dao),耦合度越高维护的成本越高
产生耦合的原因:硬编码
2、IOC
控制:控制对象的创建
IOC (Inverse of Control)即控制反转:正传是自己创建对象;反转是由工厂创建依赖对象
3、工厂模式的IOC解决程序耦合
1.把dao和service配置到beans.properties
2.读取beans.properties
3.通过反射创建对象,并装到容器中
4.在使用时,直接从容器中获得
4、spring的IOC解决程序耦合
1.pom.xml
org.springframework
spring-context
5.1.8.RELEASE
org.slf4j
slf4j-log4j12
1.7.30
2.log4j.properties
复制mybatis
3.applicationContext.xml
4、测试
//带IOC容器的工厂
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ac.getBean("userService", UserService);
1、什么是DI?
DI(Dependency Injection)依赖注入:将依赖对象从容器中拿出来赋值给调用者
2、DI的方式
1、构造方法注入
public UserServiceImpl(UserDao userDao, String msg){
this.userDao=userDao
this.msg=msg
}
2、set方法注入
public setUserDao(UserDao userDao){
this.userDao=userDao
}
public setMsg(String msg){
this.msg=msg
}
3、自动注入
//遍历map,并判断每个bean的类型,如果类型符合则赋值
ApplicationContext:子接口,加载配置文件时就创建对象
BeanFactory:顶级接口,使用对象时才创建
singleton:单例,ioc容器
prototype:多例,newInstance()
request:request域
session:session域
application:servletContext域
配置方式:
单例和多例的使用场景?
单例:service、dao、sqlSessionFactroy
多例:connnect、sqlSession
1、案例:
public class UserServiceImpl{
private UserDao userDao;
public UserServiceImpl(){
}
public setUserDao(){
}
public void init(){
}
public void destroy(){
}
}
2、实验
单例:
[容器启动]---->构造方法(实例化)---->set方法(注入)---->init方法(初始化)---->[容器关闭]---->destroy方法(销毁bean)
多例:
[使用对象]---->构造方法(实例化)---->set方法(注入)---->init方法(初始化)---->[JVM垃圾回收]---->destroy方法(销毁bean)
1、配置步骤
1)pom.xml
spring-context、slf4j-log4j12
2.log4j.properties
复制mybatis
3)applicationContext.xml
4、ioc
@Repository //
public class UserDaoImpl{
}
5、DI
public class UserServiceImpl{
@Autowired
private UserDao userDao;
}
2、常用注解
1)IOC
@Controller:web
@Service:service
@Repository:dao
@Component:三层架构之外
@Scope("prototype"):指定bean的作用域范围,eg:singleton、prototype、request、session、application
2)DI
@Resource(name=""):按名称注入
@Autowired:按类型
@Value("${}"):注入基本类型和String类
1、为什么要使用AOP?
有一万个service类,要求每个方法执行前打印日志,执行后打印日志
2、什么是AOP?
AOP(Aspect Oriented Programming)面向切面编程:把程序中重复的代码抽取出来,使用动态代理的技术去执行,
从而实现对方法的增强(不修改源代码对方法进行增强)
2、代理模式
1)静态代理
角色:
公共接口:Star
真实角色:RealStar(周杰伦.唱歌)
代理角色:ProxyStar(宋吉吉.面谈.订机票.签合同.[调周杰伦唱歌].收尾款)
客户类:Client(小孩.调宋吉吉)
缺陷:1.大量代码重复 2.只能代理Star类型的对象
2)jdk动态代理
角色:
公共接口:Star
真实角色:RealStar(周杰伦.唱歌)
代理工厂:ProxyFactroy{生成ProxyStar(宋吉吉.面谈.订机票.签合同.[调周杰伦唱歌].收尾款)}
客户类:Client(小孩.调宋吉吉)
3)Cglib动态代理
cglib和jdk动态代理的区别:cglib真实角色没有接口
3、aop的核心概念
切点(pintcut):要增强的方法,eg:add()、update()
通知/增强(advice):要搞的事情,eg:日志
前置通知:aop:before
后置通知:aop:after-returning【try】
最终通知:aop:after【finally】
异常通知:aop:after-throwing【catch】
环绕通知:aop:around
try{
...
return aop:after-returning
}catch(Exception e){
...
aop:after-throwing
}finally{
...
aop:after
}
切面(aspect):把增强应用到切点上
4、切点表达式
格式:execution([修饰符] 返回值 报名.类名.方法名(参数))
eg:execution(* com.by.service.*.*(..))
5、基于xml的aop配置
1)pom.xml
spring-context、spring-aspects、slf4j-log4j12
2)advice
public class MyLogAdvice {
public void before(){
System.out.println("前置通知....");
}
}
2)aop
1)pom.xml
spring-context、spring-aspects、slf4j-log4j12
2)advice
@Component
@Aspect
public class MyLogAdvice {
@Before("execution(* com.by.service.*.*(..)")
public void before(){
System.out.println("前置通知....");
}
}
3、开启spring对aop注解的支持
1、pom.xml
参考6.1.1
2、applicationContext.xml
1、pom.xml
spring-test、junit
2、test
@RunWith(SpringJUnit4ClassRunner.class) //单元测试运行时带上spring环境
@ContextConfiguration("classpath:applicationContext.xml")
public class Client {
@Autowired
private UserService userService;
}
1)什么是事务?
执行多条sql,要么全部执行,要么全部回滚
2)事务的特点
原子性:事务是最小执行单位
一致性:事务前后数据都是正确的
隔离性:事务之间看不到彼此的中间状态
持久性:事务一旦提交不可再回滚
3)mysql控制事务
START TRANSACTION;
sql1;
sql2;
COMMIT 或 ROLLBACK;
4)jdbc控制事务
try{
conn.setAutoCommit(false);
....
conn.commit();
}catch(Exception e){
conn.rollback();
}
1、PlatformTransactionManager
作用:是一个事务管理器,负责开启、提交或回滚事务
实现类:DataSourceTransactionManager(sqlSession)
2、TransactionDefinition
作用:定义事务的属性
实现类:DefaultTransactionDefinition
属性:
1)隔离级别【有默认值】
DEFAULT:默认值,等价于REPEATABLE_READ
READ_UNCOMMITTED x x x
READ_COMMITTED 脏读 x x
REPEATABLE_READ 脏读 不可重复度
SERIALIZABLE 脏读 不可重复度 幻读
2)事务的传播行为【有默认值】
REQUIRED:默认值,methodB()会加入到methodA()事务中
3)事务超时【有默认值】
默认-1:永不超时
4)是否只读【有默认值】
readOnly = false:默认值,适用于增删改
readOnly = true:不记录log(效率快),适用于查询
5)回滚规则
可省略:运行时异常回滚,编译时异常不回滚
3、TransactionStatus
作用:代表一个事务
注意:方法名必须和事务属性的配置保持一致,eg:get或select开头
@Transactional
public class UserServiceImpl implements UserService {
}