springboot笔记

1.更改banner

在resources目录创建以banner开头的文件,txt或jpg都可以

2.注入bean

MyConfig.class

@Configuration
public class MyConfig {

    @Bean
    public User user(){
        return new User();
    }
}

Test类

@SpringBootTest
class Demo01ApplicationTests {

    @Autowired
    ApplicationContext ioc;

    @Test
    void contextLoads() {
        boolean res = ioc.containsBean("user");    // true
        System.out.println(res);
    }

}

3.导入启动器目录以外的配置类

3.1@import注解导入配置类

@Configuration
@Import(MyConfigA.class)    // 多个参数用逗号分隔
public class MyConfig {

}

3.2包扫描导入配置类

@SpringBootApplication
@ComponentScan(basePackages = "com.example.config")    // 包扫描的方式加载配置类
public class Demo01Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo01Application.class, args);
    }

}

4.指定使用Bean

4.1使用 @Qualifier

MyConfigA.class

@Configuration
public class MyConfigA {

    @Bean("user1")
    public User getUser1(){
        return new User("张三user1",18);
    }

    @Bean("user2")
    public User getUser2(){
        return new User("李四user2",20);
    }
}

Text类

@SpringBootTest
class Demo01ApplicationTests {

    @Autowired
    ApplicationContext ioc;

    @Autowired
    @Qualifier("user1")    // 当有多个bean返回同一个对象时,可以用此注解指定用哪一个bean
    private User user;

    @Test
    void contextLoads() {
        boolean res = ioc.containsBean("user1");    // true
        System.out.println(res);
    }

    @Test
    void test2(){
        System.out.println(user);    // User(name=张三user1, age=18)
    }

}

4.2使用@Primary指定默认使用此Bean

这样就可以即使不使用@Qualifier注解,也不会报错,默认使用带@Primary的Bean
@Primary 主要的,当IOC容器里有相同的Bean,那么对有冲突,可以使用这个注解标记它为主要的使用对象

@Bean("user1")
@Primary
public User getUser1(){
    return new User("张三user1",18);
}

5.springboot热部署

添加相关依赖即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

6.开启验证数据格式

@validated

7.日期格式化注解

@DateTimeFormat
前台传给后台时指定日期格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
后台传给前台时指定日期格式

8.派生注解

必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项

自动配置类必须在一定的条件下才能生效;

我们怎么知道哪些自动配置类生效;

==我们可以通过启用 debug=true属性;来让控制台打印自动配置报告==,这样我们就可以很方便的知道哪些自动配置类生效;

9.web静态资源访问规则

9.1springboot访问静态资源的几种方式

==1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;==

​ webjars:以jar包的方式引入静态资源;

http://www.webjars.org/

localhost:8080/webjars/jquery/3.3.1/jquery.js

<!--引入jquery-webjar-->在访问的时候只需要写webjars下面资源的名称即可
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

==2)、"/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射==

"classpath:/META-INF/resources/", 
"classpath:/resources/",
"classpath:/static/", 
"classpath:/public/" 
"/":当前项目的根路径

localhost:8080/abc === 去静态资源文件夹里面找abc

==3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;==

​ localhost:8080/ 找index页面

==4)、所有的 **/favicon.ico 都是在静态资源文件下找;==

9.2自定义静态文件配置的方式

@Configuration
//1.5的版本是继承WebMvcConfigurerAdapter  2.0是直接实现WebMvcConfigurer的接口
public class MyWebConfig implements WebMvcConfigurer {
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/test/**","/test2/**")     // 请求的地址
                .addResourceLocations("classpath:/mystatic/");                 // 转发的地址
        /**
         * 浏览器访问http://localhost:8080/test/index.html
         * 实际访问的地址为http://localhost:8080/mystatic/index.html
         */
    }
}

9.3修改yml文件

#配置静态资源访问路径,会覆盖原springboot的四个静态资源路径,顺序在前面的优先级高
spring:
  resources:
    static-locations: classpath:/mystatic/,classpath:/static/

10.AOP开发

10.1先加如依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

10.2被依赖的类

@Component
public class Man {

    public String eat(){
        System.out.println("人吃饭");
        return "吃饱了";
    }

    public String write(String txt){
        System.out.println("写" + txt);
        return "1000";
    }

    public void count(){
        Integer i = 1 / 0;
    }

}

10.3写增强类

@Aspect
@Component
@EnableAspectJAutoProxy // 可以不加
public class ManAspect {

    // 声明切入点
    public static final String POINTCUT1 = "execution(* com.example.demo01.domain.Man.eat(..))";

    @Before(value = POINTCUT1)
    public void eatBefore(){
        System.out.println("饭前洗手");
    }

    @AfterReturning(value = POINTCUT1,returning = "res") // 有返回值
    // @After(value = POINTCUT1) 没有返回值
    public void eatAfter(Object res){
        System.out.println("饭后走一走");
        System.out.println("返回值:" + res);
    }

    // 环绕通知
    @Around(value = "execution(* com.example.demo01.domain.Man.write(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取方法的参数
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }
        System.out.println("写之前");
        Object proceed = joinPoint.proceed(); // 方法有返回值一定要接收参数返回,否则被增强的方法会没有返回值
        System.out.println("写之后");
        return proceed;
    }

    // 异常通知
    @AfterThrowing(value = "execution(* com.example.demo01.domain.Man.count(..))",throwing = "ex")
    public void afterThrowing(Throwable ex){
        System.out.println("异常通知" + ex);
    }

}

11.拦截器

11.1创建拦截器

public class MyHandlerInteceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

11.2添加拦截器

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    public void addViewControllers(ViewControllerRegistry registry) {
        // 请求转发,只能转发到页面,不能转发到请求
        // 转发是去templates文件夹找
        registry.addViewController("/index/hello")
                .setViewName("/hello");
        // 请求重定向,既可以重定向到页面,也可以重定向到请求
        // 重定向是去springboot的默认静态资源访问路径中找,找不到就报错
        registry.addRedirectViewController("/index/userlist","/userlist.html");

        registry.addRedirectViewController("/index/getone","/getone");

    }

    public void addInterceptors(InterceptorRegistry registry) {
        MyHandlerInteceptor myHandlerInteceptor = new MyHandlerInteceptor();
        registry.addInterceptor(myHandlerInteceptor)
                .addPathPatterns("/**")             // 拦截所有
                .excludePathPatterns("/getuser");   // 除了/getuser请求
    }

}

12.使用内嵌Jetty服务器

更改pom文件即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>

    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>

</dependency>

<!-- 引入jetty的启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Last modification:March 16th, 2020 at 08:52 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment