JAVA QQ技术群(984253785)
- 什么是注解
// 注解是代码标记 格式 @注解名称(属性名称=属性值,属性名称=属性值,…)
// 注解 可以在类 方法 属性上 都可以加注解
// 注解的目的: 简化xml配置
// @Component (把普通实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)
// @Service // 一般用在 实现层
// @Controller // 一般用在控制层 //把当前类 注入到 spring 管理
// @Repository // 用在 DAO层
// 以上注解 都可以用来创建bean 实例 功能是一样的
//@ResponseBody // 代表这个类下面所有的返回值 都是 直接写给浏览器的 不是跳转到某个页面
@RestController //这个注解就是 @Controller 和@ResponseBody 两个注解的合体应用
// @Autowired 根据属性类型进行自动注入 只针对 对象
// @Qualifier 根据属性名称进行注入 只针对 对象
// @Qualifier 注解使用 和 @Autowired 一起使用
// 当 一个接口有多个实现类时 就需要需要使用这个注解 指定 你要使用的 哪个类
// @Qualifier(value = "userDaoImpl1111") value 指定的类名
// @Resource 可以根据类型注入 也可以根据名称注入 只针对 对象
// 他属于 javax 里的注解 不属于 spring里的注解 所以一般不建议使用
// @Value 注入普通类型属性
@Configuration //把当前类作为 配置类 替代xml配置文件
@ComponentScan(basePackages = {“com.spring.json.aopSpring”})
//@ComponentScan 代替得就是 xml配置文件中 开启组件扫描
// <context:component-scan base-package=“com.spring.json.aopSpring” ></context:component-scan>
//标签
@Aspect //生成代理对象 用于 aop
@EnableAspectJAutoProxy //开启 Aspect 生成代理对象
//代替的就是 aop:aspectj-autoproxy</aop:aspectj-autoproxy> 这个标签
//前置通知 value 可省略 用于 aop
@Before(value = "execution(* com.spring.json.aopSpring.User.add(..))")
//后置通知 或者(返回通知) 在返回值之后 执行 有异常不会通知
@AfterReturning("execution(* com.spring.json.aopSpring.User.add(..))")
//最终通知 有异常也会执行
@After("execution(* com.spring.json.aopSpring.User.add(..))")
//异常通知 如果这个通知执行了 Around 环绕之后 和 AfterReturning() 后置通知 不会执行
@AfterThrowing("execution(* com.spring.json.aopSpring.User.add(..))")
//环绕通知 在方法之前 和 方法之后都通知
@Around("execution(* com.spring.json.aopSpring.User.add(..))")
//相同切入点 抽取 可以把相同切入点 提取出来 封装 一下
@Pointcut(value = "execution(* com.spring.json.aopSpring.User.add(..))")
@order(数字类型值) 有多个增强类 对同一个方法进行增强 设置增强优先级 数字类型越小 优先级越高
@Transactional //事务注解 可以添加到类上面 也可以添加 到方法上面
// 这个注解有相关参数
//1. propagation 事务传播行为
// 多事务调用方法的过程 叫做 事务传播行为
// 通俗讲解 就是 一个加事务注解 调用没有事务注解的方法的过程
// 事务有7中传播类型 以下 前两种 最常见
//REQUIRED add 方法有事务 调用 没有事务的update方法 update 使用的 add 事务
//REQUIRES_NEW add 方法调用update方法 如果add无论是否有事务 都会创建新的事务
//2. isolation 事务隔离级别
// 事务有特性位隔离性 多事务操作之间不会产生影响 不考虑隔离会产生很多问题
// 有三个读得问题 脏读 、 不可重复读、 虚(幻)读 一般在并发情况下会出现
// 通过设置事务得隔离级别 可以解决这三个问题
// 脏读 一个未提交事务读取到另一提交事务修改得数据
// 不可重复读 一个未提交得事务 读取到了一个提交过事务得数据 这是一种现象
// 虚(幻)读 一个未提交事务读取到另一提交事务添加数据
// 脏读 不可重复读 虚(幻)读
// read uncommitted(读未提交) 有 有 有
// read committed(读已提交) 无 有 有
// repeatable read(可重复读) 无 无 有 mysql 默认隔离级别
// serializable(串行化) 无 无 无
//3. timeout 超时时间 单位 秒 spring 默认 -1 永不超时
// 事务要在一定得时间内进行提交 如果在一定时间内不提交 就会回滚
//4. readOnly 是否只读 默认 false 如果为 true 只能读操作
//5. rollbackFor 回滚
// 设置出现哪些异常进行回滚
//6. noRollbackFor 不回滚
// 这只出现哪些异常进行不回滚
@Bean
// 表示 在 ioc 容器中进行创建对象
注解 @Bean是一个方法级别的注解,
主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。
相当于xml配置文件
@Bean是将组件注册到Bean,让IOC容器知道这个组件存在。
Spring中@AutoWired和@Bean的区别
@AutoWired是组件和组件相互调用的时候,自动从ioc中取出来需要用的组件。比如Service,Controller,Dao的关系,这三个组件都分别加上了注册的注解:@Service,@Controller,@Component,ioc中已经有了注册信息,但是Service要用到Dao操作数据,所以在Service中的Dao头上就要用@Autowired来给Dao自动赋值,来供Service用,同理,Controller中也要用到Service,那么就要在Service上边加上@Autowired
@Component 和@Bean 区别
- 作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。
2.@Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。
@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
-
@Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。
-
比如引入了第三方的 sdk 或者 依赖类 这时候 有些类 需要交给 spring 管理 就可以创建一个方法
-
方法里new 一个这样的类 然后在方法上打上 bean 注解 就可以交给 spring管理了
-
就比如 以下这个 创建数据库连接池的例子
//创建数据库连接池
// 注解 @Bean是一个方法级别的注解,
// 主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。
// 表示 在 ioc 容器中进行创建对象
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource druidDataSource=new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java_test");
druidDataSource.setUsername("root");
druidDataSource.setPassword("");
return druidDataSource;
}
//如果容器中存在某个组件(对象) 再去执行某个方法或者某个类
@ConditionalOnBean(name = "tom")
//如果容器中不存在某个组件(对象) 再去执行某个方法或者某个类
@ConditionalOnMissingBean(name = "tom")
当然 还有判断 类的 不存在某个类的 存在某个类 等等
这些 都属于 @Conditional 的子注解 用的适合可以详细百度
@ImportResource("classpath:beans.xml")// 导入一个 资源
前提时 这个类 必须交给 spring 管理
@ConfigurationProperties(prefix = "mycar") //根据配置文件的前缀
把配置文件 配置参数 赋值到 对象属性上
//1. 开启car 的配置绑定功能
//2. 把这个car这个组件自动注册到容器中
@EnableConfigurationProperties(Car.class) // 应用场景 比如 你用的时第三方的包
需要把配置信息注入到第三方里 就可以使用这种
@PathVariable("name") String name //获取url路径中的值
@RequestHeader("Host") String host //获取请求头里的值
@RequestParam("age") String age //获取请求参数
@CookieValue("_ga") String SFS //获取cookie
@RequestBody //获取请求体里的值
//矩阵变量
// url 里 已分号 分割的 参数 叫做 矩阵变量
// cars/path;low=3;brand=bay,auid,yd; 一个变量多个值 可以用逗号分隔
// 在页面开发中 cookie 被禁用了 session 里面内容怎么使用 ?
// 就可以使用 这种方式 获取 路径重写
// springboot 默认禁用了 矩阵变量 所以要开启
@MatrixVariable("low") Integer low
@ControllerAdvice 用法
顾名思义,@ControllerAdvice就是@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。
@ControllerAdvice最常见的使用场景就是全局异常处理
@ExceptionHandler注解我们一般是用来自定义异常的。