文章目录
- @Lazy 懒加载
- @ConditionalOnMissingBean(RedisConfig.class)
- @EnableAsync
- Enable***注解说明
- 测试相关注解
- @SuppressWarnings
- @Bean(initMethod = "init",destroyMethod = "destory")
- @Scope("singleton") 与@Scope("prototype")
- @Configuration
- @ComponentScan(basePackages = "controller")
- @Value
- @ConfigurationProperties(prefix = "result")
- @JsonIgnore
- @JsonIgnoreProperties
- @JsonFormat
- @Transient
- SpringMVC常用注解
- 该类被容器管理,且这个类只有一个有参构造方法
- 注入属性的方式
- xml使用注解配置
- @Autowired与@Resource
- @Import(TestBean.class)
- @Order(-1)
- @Primary
- @Profile("dev")
- 给容器中注入组件
- @Transactional的使用
- 问题
@Lazy 懒加载
@ConditionalOnMissingBean(RedisConfig.class)
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;
@ConditionalOnMissingBean(RedisConfig.class)
@Configuration
public class RedisConfig {
}
没有Result 类型的 Bean时这个条件 才生效
@EnableAsync
配置类中 通过此注解
开启对异步任务的支持
Enable***注解说明
这些注解主要是用来开启对xxx的支持
:
- @EnableAspectAutoProxy:开启对 AspectJ自动代理的支持;
- @EnableAsync:开启 异步方法的支持;
- @EnableScheduling:开启 计划任务的支持;
- @EnableWebMvc:开启 web MVC的配置支持;
- @EnableConfigurationProperties:开启对
@ConfigurationProperties
注解配置Bean的支持; - @EnableJpaRepositories:开启对SpringData JPA Repository的支持;
- @EnableTransactionManagement:开启注解式事务的支持
测试相关注解
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@SpringBootTest // 可以当成 Spring容器,能注入属性!!
@RunWith(SpringRunner.class)
class EurekaClientApplicationTests {
@Resource
private Result result;
@Test
void contextLoads() {
}
}
@SuppressWarnings
@SuppressWarnings("all")
压制警告
@Bean(initMethod = “init”,destroyMethod = “destory”)
先构造方法再initMethod,容器销毁前执行destory
@Scope(“singleton”) 与@Scope(“prototype”)
@Configuration
设置该类为 Spring容器的一个
配置类
@ComponentScan(basePackages = “controller”)
配置
包扫描路径
----->指定Spring扫描注解
@Value
从 Spring的配置文件中获取属性, 如 yaml,properties文件,该类必须被容器管理
import org.springframework.beans.factory.annotation.Value;
@Value("${result.code}")
private Integer code;
@ConfigurationProperties(prefix = “result”)
- 从 配置文件中 获取属性的类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "result")
public class Result {
private Integer code;
private String message;
}
- yaml
result:
code: 200
message: 小飞棍来喽
- 测试
@RestController
public class TestController {
@Resource
private Result result;
@GetMapping("test")
public String test(){
System.out.println(result.toString());
return result.toString();
}
}
@JsonIgnore
1)作用
在 json序列化时将 java bean中的一些属性忽略掉,序列化和反序列化都受影响。
2)使用方法
一般标记在属性或者方法上,返回的 json数据即不包含该属性。
3)注解失效
如果注解失效,可能是因为你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize = false)
,使用方法一样。
@JsonIgnoreProperties
此注解是类注解,作用是 json序列化时将java bean中的一些属性忽略掉
,序列化和反序列化都受影响。
写法将此标签加在user类的类名上 ,
可以多个属性也可以单个属性
// 生成Json时将 name和age属性过滤
@JsonIgnoreProperties({"name"},{"age"})
public class User {
private String name;
private int age;
}
@JsonFormat
此注解用于
属性或者方法
上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式
,比如:
public class User{
@JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)
private Date date;
}
@Transient
如果一个属性
并非数据库表的字段映射
,就务必将其标示为@Transient
,否则ORM框架默认其注解为@Basic
SpringMVC常用注解
1、@EnableWebMvc
在配置类中开启Web MVC的配置支持
2、@Controller
3、@RequestMapping
用于映射web请求,包括访问路径和参数。
4、@ResponseBody
支持将返回值放到response内,而不是一个页面,通常用户返回json数据。
5、@RequestBody
允许 request 的参数在request体中,而不是在直接连接的地址后面。(放在参数前)
@GetMapping("test")
public String test(@RequestBody User user) {
return "success";
}
6、@PathVariable
用于接收路径参数,比如@RequestMapping(“/hello/{name}”)声明的路径,将注解放在参数前,即可获取该值,通常作为Restful的接口实现方法。
7、@RestController
该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
8、@ControllerAdvice
全局异常处理
全局数据绑定
全局数据预处理
ControllerAdvice的常用场景
9、@ExceptionHandler
用于全局处理控制器里的异常。
该类被容器管理,且这个类只有一个有参构造方法
@Service
class ServiceImpl {
private String name;
public ServiceImpl(String name) {
this.name = name;
}
}
只有一个
有参构造方法时
,方法中的参数从容器中获取,前提这个类被容器管理@Service
注入属性的方式
@Service
class ServiceImpl {
@Autowired // 属性注入
private String fieldAuto;
@Autowired // 通过set方法注入
public void setFieldAuto(String fieldAuto) {
this.fieldAuto = fieldAuto;
}
// 注入给参数
public void autoParam(@Autowired String name) {
}
}
xml使用注解配置
需要
开启注解支持
和 要扫描的包
<context:component-scan base-package="com.guo"></context:component-scan>
<context:annotation-config/>
@Autowired与@Resource
@Autowired 默认按类型装配,默认情况下必须要求依赖对象必须存在
,如果要允许null值 @Autowired(required = false)
@Resource(name = “”,type = TestBean.class) 默认按照名称进行装配
,当找不到
与名称匹配的bean时才按照类型进行装配
@Import(TestBean.class)
导入其他配置类
@Order(-1)
过滤器的执行顺序 默认
int最大值
,越小越先执行
@Primary
标注相同类型的bean
优先被使用权
与@Autowired一起使用,优先使用标注了@Primary的bean
@Profile(“dev”)
标注环境,没有则任何环境下都能使用
spring:
profiles:
active: dev
给容器中注入组件
1)包扫描+组件标注注解
-
@Component:泛指各种组件
-
@Controller、@Service、@Repository 都可以称为 @Component。
-
@Controller:控制层
-
@Service:业务层
-
@Repository:数据访问层
2)@Bean(initMethod = “init”,destroyMethod = “destory”)
导入
第三方包里面的对象
3)@Import
@Import(
要导入到容器中的组件
)---->使用TestBean.class
形式
@Transactional的使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.22</version>
</dependency>
import org.springframework.transaction.annotation.Transactional;
@Transactional
- @Transactional所在的方法必须为public
- 所在的类必须
被spring容器管理!!
@Component - 数据库
必须支持事务
,如InnoDB 支持事务,MyISAM不支持! - 默认情况下, @Transactional 注解
只对抛出的 RuntimeException 异常有效
- 指定异常时的事务回滚,使用如下配置
// Exception.class 是所有异常的父类
@Transactional(rollbackFor={RuntimeException.class, Exception.class})
- @Transactional 必须加在指定类或方法上,而不是接口上
- 没有事务的方法调用本类中另一个@Transactional的方法
此时事务
不生效
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class TestBean {
public void test() {
testTransactional();
}
@Transactional
public void testTransactional() {}
}
解决方法
启动类加@EnableAspectJAutoProxy
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@SpringBootApplication
@EnableAspectJAutoProxy //必须加注解
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
修改后代码
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class TestBean {
public void test() {
//事务想要生效,还得利用代理来生效!!!
//获取代理对象(proxy)
// 启动类加上 @EnableAspectJAutoProxy
TestBean proxy = (TestBean) AopContext.currentProxy();
proxy.testTransactional();
}
@Transactional
public void testTransactional() {
}
}
- 出现异常
手动回滚
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Component
public class TestBean {
@Transactional
public void testTransactional(User user) {
try {
save(user);
} catch (Exception ex) {
ex.printStackTrace();
// 手动标记回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
private void save(User user) {
}
}
问题
Spring Boot Configutation Annotation Processor
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>