常用注解:
@Component 声明交给spring管理
@Controller
@Service
@Repository
@Configuration 声明配置类
@ComponentScan 扫描
@Resource 依赖注入
@Value(“${xxx}”) 注入简单值
@PropertySource(value = “classpath:db.properties”)加载properties配置文件
@Bean 整合第三方对象(组件)
@Scope 用于设置Bean的作用域 (singleton:默认值,单例的.) (prototype:多例的.)
@PostConstruct 初始化方法,项目启动时执行,只会被调用一次。
@PreDestroy 销毁方法,项目关闭时执行,只会被调用一次。
@Bean(initMethod = “init” ,destroyMethod = “destory”)
@EnableTransactionManagement 开启事务管理
测试类配置:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
面向切面:
/**
* 配置类
*/
@EnableAspectJAutoProxy //配置类上声明开启切面编程
@Configuration //设置为 配置类
@ComponentScan(basePackages = {"com.xxx.demo01"}) // 设置要扫描的包
@EnableAspectJAutoProxy // 设置 开启切面
public class SpringConfig {
}
/**
* 切面类
*/
@Component //交给spring容器管理
@Aspect //声明切面
public class MyAspect01 {
@Before("execution(public void com.czxy.demo01.User.eat())")
public void bf01(){
System.out.println("沐浴更衣 ");
}
}
/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes ={SpringConfig01.class})
public class TestA {
@Resource
private User user;
@Test
public void test01(){
user.eat();
}
}
SpringAOP
Spring AOP 主要通过2种代理技术来实现:动态代理、CGLIB
动态代理:用于对接口+实现类情况进行代理。
@EnableAspectJAutoProxy(proxyTargetClass = false)
CGLIB:用于对仅有实现类情况进行代理。
@EnableAspectJAutoProxy(proxyTargetClass = true)
相关AOP术语
Target(目标对象):
代理的目标对象。
例如:UserServiceImpl
Joinpoint(连接点):
所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
例如:addUser()/ updateUser()
Pointcut(切入点):
所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
例如:addUser()
Advice(通知/增强):
所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
例如:bf()、af()
Aspect(切面):
是切入点和通知的结合。
例如:MyAspect类
Proxy(代理):
一个类被AOP织入增强后,就产生一个结果代理类。
相关注解
注解 描述
@Aspect 把当前类声明成切面类
@Before 把当前方法看成是前置通知
@AfterReturning 把当前方法看成是后置通知。
@AfterThrowing 把当前方法看成是异常通知
@After 把当前方法看成是最终通知
@Around 把当前方法看成是环绕通知
@Pointcut 指定切入点表达式
切入点表达式
execution:
匹配方法的执行(常用)
execution(表达式)
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
写法说明:
全匹配方式:
public void com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
访问修饰符可以省略
void com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
返回值可以使用*号,表示任意返回值
* com.itheima.service.impl.CustomerServiceImpl.saveCustomer()
包名可以使用*号,表示任意包,但是有几级包,需要写几个*
* *.*.*.*.CustomerServiceImpl.saveCustomer()
使用..来表示当前包,及其子包
* com..CustomerServiceImpl.saveCustomer()
类名可以使用*号,表示任意类
* com..*.saveCustomer()
方法名可以使用*号,表示任意方法
* com..*.*()
参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数
* com..*.*(*)
参数列表可以使用..表示有无参数均可,有参数可以是任意类型
* com..*.*(..)
全通配方式:
* *..*.*(..)
抽取公共切入点
使用@PointCut可以将公共的切入点进行抽取,一般都声明在私有方法上。在通知注解使用,通过方法名引用。
@Pointcut("execution(* com.czxy.service..*.*(..))")
private void myPointcut(){
}
@Before("myPointcut()")
public void bf(JoinPoint joinPoint){
System.out.println("前置..." + joinPoint.getTarget());
System.out.println("前置..." + joinPoint.getSignature().getName());
}
事务平台管理器:
spring通过事务管理器来管理事务。事务管理器PlatformTransactionManager提供了事务需要的基本操作
实现类 描述
DataSourceTransactionManager 使用JdbcTemplate或MyBatis需要的事务管理器
Spring隔离级别设置
事务隔离级别反映事务提交并发访问时的处理态度
@Transactional(isolation=Isolation.DEFAULT) 默认级别
@Transactional(isolation=Isolation.READ_UNCOMMITTED) 读未提交
@Transactional(isolation=Isolation.READ_COMMITTED) 读已提交
@Transactional(isolation=Isolation.REPEATABLE_READ) 可重复读
@Transactional(isolation=Isolation.SERIALIZABLE) 串行化
传播行为
传播行为:业务A使用了业务B,AB之间事务共享问题,就是事务的传播行为。spring中事务的传播行为共7种。
注解 描述
@Transactional(propagation=Propagation.REQUIRED) 默认值,支持当前事务,如果当前没有事务,就新建一个事务
@Transactional(propagation=Propagation.SUPPORTS) 支持当前事务,如果当前没有事务,就以非事务方式执行
@Transactional(propagation=Propagation.MANDATORY) 支持当前事务,如果当前没有事务,就抛出异常
@Transactional(propagation=Propagation.REQUIRES_NEW) 新建事务,如果当前存在事务,把当前事务挂起
@Transactional(propagation=Propagation.NOT_SUPPORTED) 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
@Transactional(propagation=Propagation.NEVER) 以非事务方式执行,如果当前存在事务,则抛出异常
@Transactional(propagation=Propagation.NESTED) 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作