1、SpringBoot 注解
@SpringBootApplication
这个注解是Spring Boot最核心的注解,用在Spring Boot类的主类上,标识这是一个Spring Boot应用,用来开启Spring Boot的各项能力。
实际上这个注解是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解的组合,由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。
@SpringBootApplication
public class Application{
public static void main(String [] args){
SpringApplication.run(Application.class,args);
}
}
@SpringBootConfiguration : 继承@Configuration注解,主要用于加载配置文件
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@EnableAutoConfiguration 开启自动配置功能
EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成
@ComponentScan : 组件扫描和自动装配
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。
2、Spring 声明bean的注解
@Component:当组件不好归类的时候,我们可以使用这个注解进行标注。
@Controller、@Service、@Repository是@Component的一种特殊形式,都可以称为@Component,在Spring MVC中使用@Controller来定义controller,@Service用于在服务层中保存业务逻辑的注释类。
当组件不好归类的时候,我们可以使用这个注解进行标注,比如一些工具类,我们使用@Component比较好
@Controller:控制层、@Service:业务层、@Repository:数据访问层
@Service是@Component注解的一个特例,作用在类上
@Service注解作用域默认为单例,使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
@Service用于标注服务层组件,表示定义一个bean
@Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
@Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字
@Bean : 产生一个bean的方法
作用在方法上,明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”)
@DependsOn:配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象
@Scope:用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围
@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。
当一个Spring Bean被声明为prototype(原型模式)时,在每次需要使用到该类的时候,Spring IoC容器都会初始化一个新的改类的实例;
当@Scope的作用范围设置成Singleton时,被此注解所标注的类只会被Spring IoC容器初始化一次。在默认情况下,Spring IoC容器所初始化的类实例都为singleton。
Singleton:单例,一个Spring容器中只有一个bean实例,默认模式
Protetype:每次调用新建一个bean
Request:web项目中,给每个http request新建一个bean
Session:web项目中,给每个http session新建一个bean
GlobalSession:给每一个 global http session新建一个Bean实例
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@order,定义了组件的加载顺序
@order使用注解方式使bean的加载顺序得到控制,
@order标记定义了组件的加载顺序,值越小拥有越高的优先级,可为负数。值越小,越先被加载。
3、Spring bean自动装配的注解
@Autowired:由Spring提供
默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
@Autowired
@Qualifier("cache-messageListenerAdapter")
private MessageListenerAdapter messageListenerAdapter;
spring是支持基于接口实现类的直接注入的;支持注入map,list等集合中,不用做其他的配置,直接注入;
为什么要用这种方式注入bean呢?
使用场景:
适用于一个接口有多个实现类,然后根据不同的参数选择执行不同的实现类,其实就是策略模式。
Spring 会在启动时,自动查找实现了该接口的 bean,放到这个Map中去。
key为bean的名字,value为 实现了该接口的所有的 bean。
注意:这里只有在map的key为string类型时才有效;
@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 name 作为 Map 的 key。
在SpringBoot开发中,当一个接口A有多个实现类时,通过@Autowired, spring会很智能的将bean注入到List或Map
@Qualifier:指定注入Bean的名称
@Inject:由JSR-330提供
@Resource:由JSR-250提供
默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@Autowired和@Resource两个注解的区别:
(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
4、 导入配置文件
@PropertySource注解
//引入单个properties文件:
@PropertySource(value = {“classpath : xxxx/xxx.properties”})
//引入多个properties文件:
@PropertySource(value = {“classpath : xxxx/xxx.properties”,“classpath : xxxx.properties”})
取值:使用@Value注解取配置文件中的值
@Value(“${properties中的键}”)
private String xxx;
@ImportResource:导入xml配置文件
//引入单个xml配置文件:
@ImportSource(“classpath : xxx/xxxx.xml”)
//引入多个xml配置文件:
@ImportResource(locations = {"classpath:spring-restful-service.xml", "classpath:spring-redis-config.xml"})
@Import:导入额外的配置信息
用来导入配置类或一些需要前置加载的类,其可以通过快速导入的方式实现把实例加入Spring的IOC容器中。
可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar的类。
@Component
@Import(ImConfig.class)
public class ImUtil {
@Resource
private ImConfig imConfig;
}
@Data
@ConfigurationProperties(prefix = "im")
public class ImConfig {
private String clientId;
private String clientSecret;
private String domain;
}
5、切面(AOP)相关注解
Spring支持AspectJ的注解式切面编程
@Aspect:声明一个切面
@After:在方法执行之后执行(方法上)
@Before:在方法执行之前执行(方法上)
@Around:在方法执行之前与之后执行(方法上)
@PointCut:声明切点
@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持
6、异步 和 定时任务
@EnableAsync:配置类中通过此注解开启对异步任务的支持
@Async:在实际执行的bean方法使用该注解来声明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)
@EnableScheduling:在配置类上使用,开启定时计划任务的支持
@Scheduled:来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)
7、事务注解 @Transactional
在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式
编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用
8、全局异常处理
@ControllerAdvice:定义全局异常处理类
@RestControllerAdvice:是在@ControllerAdvice加了一个@ResponseBody注解,用来将返回值写入到响应体
@ExceptionHandler:声明异常处理方法
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
String handleException(){
return "Exception Deal!";
}
}
RestControllerAdvice + ExceptionHandler 不但可以做全局异常处理,还可以做全局响应体自动包装,见
Java后端通用接口设计
9、Enable***注解说明
@EnableAspectAutoProxy:开启对AspectJ自动代理的支持
@EnableAsync:开启异步方法的支持
@EnableScheduling:开启计划任务的支持
@EnableWebMvc:开启web MVC的配置支持
@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持
@EnableJpaRepositories:开启对SpringData JPA Repository的支持
@EnableTransactionManagement:开启注解式事务的支持
@EnableCaching:开启注解式的缓存支持
10、SpringMVC常用注解
1、@EnableWebMvc:在配置类中开启Web MVC的配置支持
2、@Controller 控制层
3、@RequestMapping:用于映射web请求,包括访问路径和参数
4、@ResponseBody:支持将返回值放到response内,而不是一个页面,通常用户返回json数据
5、@RequestBody:允许request的参数在request体中,而不是在直接连接的地址后面
6、@PathVariable:用于接收路径参数,比如@RequestMapping(“/hello/{name}”)声明的路径,将注解放在参数前,即可获取该值,通常作为Restful的接口实现方法。
7、@RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
8、@InitBinder:用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中