Spring常用注解和总结笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44692896/article/details/102730354

常用注解:

@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类似的操作

猜你喜欢

转载自blog.csdn.net/qq_44692896/article/details/102730354
今日推荐