• Springboot2 注解


    一.底层注解

    1、@Configuration

    Full模式:配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

    Lite模式:配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断

    1. #############################Configuration使用示例######################################################
    2. /**
    3. * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
    4. * 2、配置类本身也是组件
    5. * 3、proxyBeanMethods:代理bean的方法
    6. * Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
    7. * Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
    8. * 组件依赖必须使用Full模式默认。其他默认是否Lite模式
    9. *
    10. *
    11. *
    12. */
    13. @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    14. public class MyConfig {
    15. /**
    16. * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
    17. * @return
    18. */
    19. @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    20. public User user01(){
    21. User zhangsan = new User("zhangsan", 18);
    22. //user组件依赖了Pet组件
    23. zhangsan.setPet(tomcatPet());
    24. return zhangsan;
    25. }
    26. @Bean("tom")
    27. public Pet tomcatPet(){
    28. return new Pet("tomcat");
    29. }
    30. }
    31. ################################@Configuration测试代码如下########################################
    32. @SpringBootConfiguration
    33. @EnableAutoConfiguration
    34. @ComponentScan("com.atguigu.boot")
    35. public class MainApplication {
    36. public static void main(String[] args) {
    37. //1、返回我们IOC容器
    38. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
    39. //2、查看容器里面的组件
    40. String[] names = run.getBeanDefinitionNames();
    41. for (String name : names) {
    42. System.out.println(name);
    43. }
    44. //3、从容器中获取组件
    45. Pet tom01 = run.getBean("tom", Pet.class);
    46. Pet tom02 = run.getBean("tom", Pet.class);
    47. System.out.println("组件:"+(tom01 == tom02));
    48. //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
    49. MyConfig bean = run.getBean(MyConfig.class);
    50. System.out.println(bean);
    51. //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
    52. //保持组件单实例
    53. User user = bean.user01();
    54. User user1 = bean.user01();
    55. System.out.println(user == user1);
    56. User user01 = run.getBean("user01", User.class);
    57. Pet tom = run.getBean("tom", Pet.class);
    58. System.out.println("用户的宠物:"+(user01.getPet() == tom));
    59. }
    60. }

    2、@Bean、@Component、@Controller、@Service、@Repository

    spring 中的老注解

    3、@ComponentScan、@Import

    1. * 4@Import({User.class, DBHelper.class})
    2. * 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
    3. *
    4. *
    5. *
    6. */
    7. @Import({User.class, DBHelper.class})
    8. @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    9. public class MyConfig {
    10. }

    4、@Conditional

    条件装配:满足Conditional指定的条件,则进行组件注入

    1. =====================测试条件装配==========================
    2. @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    3. //@ConditionalOnBean(name = "tom")
    4. @ConditionalOnMissingBean(name = "tom")
    5. public class MyConfig {
    6. /**
    7. * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
    8. * @return
    9. */
    10. @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    11. public User user01(){
    12. User zhangsan = new User("zhangsan", 18);
    13. //user组件依赖了Pet组件
    14. zhangsan.setPet(tomcatPet());
    15. return zhangsan;
    16. }
    17. @Bean("tom22")
    18. public Pet tomcatPet(){
    19. return new Pet("tomcat");
    20. }
    21. }
    22. public static void main(String[] args) {
    23. //1、返回我们IOC容器
    24. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
    25. //2、查看容器里面的组件
    26. String[] names = run.getBeanDefinitionNames();
    27. for (String name : names) {
    28. System.out.println(name);
    29. }
    30. boolean tom = run.containsBean("tom");
    31. System.out.println("容器中Tom组件:"+tom);
    32. boolean user01 = run.containsBean("user01");
    33. System.out.println("容器中user01组件:"+user01);
    34. boolean tom22 = run.containsBean("tom22");
    35. System.out.println("容器中tom22组件:"+tom22);
    36. }

    5、@ImportResource

    原生配置文件引入,导入Spring的配置文件(xml)

    1. ======================beans.xml=========================
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    6. <bean id="haha" class="com.atguigu.boot.bean.User">
    7. <property name="name" value="zhangsan">property>
    8. <property name="age" value="18">property>
    9. bean>
    10. <bean id="hehe" class="com.atguigu.boot.bean.Pet">
    11. <property name="name" value="tomcat">property>
    12. bean>
    13. beans>
    1. @ImportResource("classpath:beans.xml")
    2. public class MyConfig {}
    3. ======================测试=================
    4. boolean haha = run.containsBean("haha");
    5. boolean hehe = run.containsBean("hehe");
    6. System.out.println("haha:"+haha);//true
    7. System.out.println("hehe:"+hehe);//true

    6、配置绑定

    6.1 @Component + @ConfigurationProperties

    在Bean上标注

    1. /**
    2. * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
    3. */
    4. @Component
    5. @ConfigurationProperties(prefix = "mycar")
    6. public class Car {
    7. private String brand;
    8. private Integer price;
    9. public String getBrand() {
    10. return brand;
    11. }
    12. public void setBrand(String brand) {
    13. this.brand = brand;
    14. }
    15. public Integer getPrice() {
    16. return price;
    17. }
    18. public void setPrice(Integer price) {
    19. this.price = price;
    20. }
    21. @Override
    22. public String toString() {
    23. return "Car{" +
    24. "brand='" + brand + '\'' +
    25. ", price=" + price +
    26. '}';
    27. }
    28. }

    6.2 @EnableConfigurationProperties + @ConfigurationProperties

    在Bean上标注@ConfigurationProperties,在Bean Configure上标注@EnableConfigurationProperties

    1. @EnableConfigurationProperties(Car.class)
    2. //1、开启Car配置绑定功能
    3. //2、把这个Car这个组件自动注册到容器中
    4. public class MyConfig {
    5. }

    二.自动配置

    • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
    • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
    • 生效的配置类就会给容器中装配很多组件
    • 只要容器中有这些组件,相当于这些功能就有了
    • 定制化配置用户直接自己@Bean替换底层的组件用户去看这个组件是获取的配置文件什么值就去修改。)

    xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties

    7、@SpringBootApplicaiton  引导加载自动配置类

    相当于以下3个注解,是一个合成注解

    1. @SpringBootConfiguration
    2. @EnableAutoConfiguration
    3. @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    4. @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    5. public @interface SpringBootApplication{}

    7.1 @SpringBootConfiguration

    @Configuration。代表当前是一个配置类

    7.2 @ComponentScan

    指定扫描哪些,Spring注解;

    7.3 @EnableAutoConfiguration

    相当于以下2个注解,是一个合成注解

    1. @AutoConfigurationPackage
    2. @Import(AutoConfigurationImportSelector.class)
    3. public @interface EnableAutoConfiguration {}

    7.3.1 @AutoConfigurationPackage

    自动配置包?指定了默认的包规则

    1. @Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
    2. public @interface AutoConfigurationPackage {}
    3. //利用Registrar给容器中导入一系列组件
    4. //将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

    7.3.2 @Import(AutoConfigurationImportSelector.class)

    1. 1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
    2. 2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
    3. 3、利用工厂加载 Map> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
    4. 4、从META-INF/spring.factories位置来加载一个文件。
    5. 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
    6. spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

    8、@Conditional  按需开启自动配置项,修改默认配置

    1. 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
    2. 按照条件装配规则(@Conditional),最终会按需配置。
    1. @Bean
    2. @ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
    3. @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
    4. public MultipartResolver multipartResolver(MultipartResolver resolver) {
    5. //给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
    6. //SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
    7. // Detect if the user has created a MultipartResolver but named it incorrectly
    8. return resolver;
    9. }
    10. 给容器中加入了文件上传解析器;
    1. @Bean
    2. @ConditionalOnMissingBean
    3. public CharacterEncodingFilter characterEncodingFilter() {
    4. //SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
    5. }

    三.SpringMVC请求处理

    9、注解

    @PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody

    1. @RestController
    2. public class ParameterTestController {
    3. // car/2/owner/zhangsan
    4. @GetMapping("/car/{id}/owner/{username}")
    5. public Map getCar(@PathVariable("id") Integer id,
    6. @PathVariable("username") String name,
    7. @PathVariable Map pv,
    8. @RequestHeader("User-Agent") String userAgent,
    9. @RequestHeader Map header,
    10. @RequestParam("age") Integer age,
    11. @RequestParam("inters") List inters,
    12. @RequestParam Map params,
    13. @CookieValue("_ga") String _ga,
    14. @CookieValue("_ga") Cookie cookie){
    15. Map map = new HashMap<>();
    16. // map.put("id",id);
    17. // map.put("name",name);
    18. // map.put("pv",pv);
    19. // map.put("userAgent",userAgent);
    20. // map.put("headers",header);
    21. map.put("age",age);
    22. map.put("inters",inters);
    23. map.put("params",params);
    24. map.put("_ga",_ga);
    25. System.out.println(cookie.getName()+"===>"+cookie.getValue());
    26. return map;
    27. }
    28. @PostMapping("/save")
    29. public Map postMethod(@RequestBody String content){
    30. Map map = new HashMap<>();
    31. map.put("content",content);
    32. return map;
    33. }
    34. //1、语法: 请求路径:/cars/sell;low=34;brand=byd,audi,yd
    35. //2、SpringBoot默认是禁用了矩阵变量的功能
    36. // 手动开启:原理。对于路径的处理。UrlPathHelper进行解析。
    37. // removeSemicolonContent(移除分号内容)支持矩阵变量的
    38. //3、矩阵变量必须有url路径变量才能被解析
    39. @GetMapping("/cars/{path}")
    40. public Map carsSell(@MatrixVariable("low") Integer low,
    41. @MatrixVariable("brand") List brand,
    42. @PathVariable("path") String path){
    43. Map map = new HashMap<>();
    44. map.put("low",low);
    45. map.put("brand",brand);
    46. map.put("path",path);
    47. return map;
    48. }
    49. // /boss/1;age=20/2;age=10
    50. @GetMapping("/boss/{bossId}/{empId}")
    51. public Map boss(@MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge,
    52. @MatrixVariable(value = "age",pathVar = "empId") Integer empAge){
    53. Map map = new HashMap<>();
    54. map.put("bossAge",bossAge);
    55. map.put("empAge",empAge);
    56. return map;
    57. }
    58. }

    10、Servlet API

    WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId

    1. @Override
    2. public boolean supportsParameter(MethodParameter parameter) {
    3. Class paramType = parameter.getParameterType();
    4. return (WebRequest.class.isAssignableFrom(paramType) ||
    5. ServletRequest.class.isAssignableFrom(paramType) ||
    6. MultipartRequest.class.isAssignableFrom(paramType) ||
    7. HttpSession.class.isAssignableFrom(paramType) ||
    8. (pushBuilder != null && pushBuilder.isAssignableFrom(paramType)) ||
    9. Principal.class.isAssignableFrom(paramType) ||
    10. InputStream.class.isAssignableFrom(paramType) ||
    11. Reader.class.isAssignableFrom(paramType) ||
    12. HttpMethod.class == paramType ||
    13. Locale.class == paramType ||
    14. TimeZone.class == paramType ||
    15. ZoneId.class == paramType);
    16. }

    11、复杂参数

    Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder

    Map map,  Model model, HttpServletRequest request 都是可以给request域中放数据,request.getAttribute();

    Map、Model类型的参数,会返回 mavContainer.getModel();---> BindingAwareModelMap 是Model 也是Map,mavContainer.getModel(); 获取到值的

    12、自定义对象参数

    可以自动类型转换与格式化,可以级联封装。

    1. /**
    2. * 姓名: <input name="userName"/>
    3. * 年龄: <input name="age"/>
    4. * 生日: <input name="birth"/>
    5. * 宠物姓名:<input name="pet.name"/>
    6. * 宠物年龄:<input name="pet.age"/>
    7. */
    8. @Data
    9. public class Person {
    10. private String userName;
    11. private Integer age;
    12. private Date birth;
    13. private Pet pet;
    14. }
    15. @Data
    16. public class Pet {
    17. private String name;
    18. private String age;
    19. }
    20. result

    四.其他

    13. Lombok

    @NoArgsConstructor

    生成无参构造器
    @AllArgsConstructor

    生成有参构造器
    @Data

    自动生成 get set 方法
    @ToString

    重写toString方法
    @EqualsAndHashCode

    重写hash方法

    @Slf4j

    日志

    14. Servlet API

    web原生组件注入:

    @ServletComponentScan(basePackages = "com.atguigu.admin") :指定原生Servlet组件都放在那里

    @WebServlet(urlPatterns = "/my"):效果:直接响应,没有经过Spring的拦截器?

    @WebFilter(urlPatterns={"/css/*","/images/*"})

    @WebListener

    15. Mybatis

    @Mapper

    @MapperScan

    @TableName

    MybatisPlus 中将表和Mapper映射

  • 相关阅读:
    设计模式学习笔记——抽象工厂模式
    数据结构——红黑树(详解性质+C++模拟)
    百度智能云千帆推出大模型普惠计划,0成本切换
    50天50个前端小项目(纯html+css+js)第十八天(背景轮播图)
    ant Design vue中a-row 内容不会垂直居中
    文献 | “科研狗”不配拥有健康的心理?
    SHAP解释模型(二)
    C语言打印九九乘法表
    2、JSP——配置Tomcat服务器
    Linux 内核开发 - NetFilter
  • 原文地址:https://blog.csdn.net/xd592319702/article/details/126073093