Springboot

2023/4/27复习下Springboot

SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC

一.重要注解

1.JavaConfig: 使用java类作为xml配置文件的替代, 是配置spring容器的纯java的方式。 在这个java类这可以创建java对象,把对象放入spring容器中(注入到容器)

(1)@Configuration : 放在一个类的上面,表示这个类是作为配置文件使用的

(2)@Bean

2.@ImporResource (了解)导入其他的xml配置文件

3.@PropertyResource(了解)读取properties属性配置文件

4.@SpringBootApplication  (核心注解
复合注解:由
(1)@SpringBootConfiguration

使用了@SpringBootConfiguration注解标注的类,可以作为配置文件使用的,可以使用Bean声明对象,注入到容器
(2)@EnableAutoConfiguration

启用自动配置, 把java对象配置好,注入到spring容器中。例如可以把mybatis的对象创建好,放入到容器中
(3)@ComponentScan 扫描器

找到注解,根据注解的功能创建对象,给属性赋值等等。
默认扫描的包: @ComponentScan所在的类所在的包及其子包。 

5.@ConfigurationProperties: 把配置文件的数据映射为java对象。

属性:prefix 配置文件中的某些key的开头的内容。


@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {

    private String name;

    private String website;

    private String address;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "SchoolInfo{" +
                "name='" + name + '\'' +
                ", website='" + website + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

application.properties

#配置端口号
server.port=8082
#context-path
server.servlet.context-path=/myboot

#自定义key=value
school.name=动力节点
school.website=www.bjpowernode.com
school.address=北京的大兴区

site=www.bjpowernode.com

6.汇总

创建对象的:
@Controller: 放在类的上面,创建控制器对象,注入到容器中
@RestController: 放在类的上面,创建控制器对象,注入到容器中。
             作用:复合注解是@Controller , @ResponseBody, 使用这个注解类的,里面的控制器方法的返回值                   都是数据

@Service : 放在业务层的实现类上面,创建service对象,注入到容器
@Repository : 放在dao层的实现类上面,创建dao对象,放入到容器。 没有使用这个注解,是因为现在使用MyBatis框               架,  dao对象是MyBatis通过代理生成的。 不需要使用@Repository、 所以没有使用。
@Component:  放在类的上面,创建此类的对象,放入到容器中。 

赋值的:
@Value : 简单类型的赋值, 例如 在属性的上面使用@Value("李四") private String name
          还可以使用@Value,获取配置文件者的数据(properties或yml)。 
          @Value("${server.port}") private Integer port

@Autowired: 引用类型赋值自动注入的,支持byName, byType. 默认是byType 。 放在属性的上面,也可以放在构造             方法的上面。 推荐是放在构造方法的上面
@Qualifer:  给引用类型赋值,使用byName方式。   
            @Autowird, @Qualifer都是Spring框架提供的。

@Resource : 来自jdk中的定义, javax.annotation。 实现引用类型的自动注入, 支持byName, byType.
             默认是byName, 如果byName失败, 再使用byType注入。 在属性上面使用


其他:
@Configuration : 放在类的上面,表示这是个配置类,相当于xml配置文件

@Bean:放在方法的上面, 把方法的返回值对象,注入到spring容器中。

@ImportResource : 加载其他的xml配置文件, 把文件中的对象注入到spring容器中

@PropertySource : 读取其他的properties属性配置文件

@ComponentScan: 扫描器 ,指定包名,扫描注解的

@ResponseBody: 放在方法的上面,表示方法的返回值是数据, 不是视图
@RequestBody : 把请求体中的数据,读取出来, 转为java对象使用。

@ControllerAdvice:  控制器增强, 放在类的上面, 表示此类提供了方法,可以对controller增强功能。

@ExceptionHandler : 处理异常的,放在方法的上面

@Transcational :  处理事务的, 放在service实现类的public方法上面, 表示此方法有事务


SpringBoot中使用的注解
    
@SpringBootApplication : 放在启动类上面, 包含了@SpringBootConfiguration
                          @EnableAutoConfiguration, @ComponentScan


    
MyBatis相关的注解

@Mapper : 放在类的上面 , 让MyBatis找到接口, 创建他的代理对象    
@MapperScan :放在主类的上面 , 指定扫描的包, 把这个包中的所有接口都创建代理对象。 对象注入到容器中
@Param : 放在dao接口的方法的形参前面, 作为命名参数使用的。
    
Dubbo注解
@DubboService: 在提供者端使用的,暴露服务的, 放在接口的实现类上面
@DubboReference:  在消费者端使用的, 引用远程服务, 放在属性上面使用。
@EnableDubbo : 放在主类上面, 表示当前引用启用Dubbo功能。
    

二、Springboot项目结构 


三、Springboot的配置文件

配置文件名称: application

扩展名有: properties( k=v) ;  yml ( k: v)

使用application.properties,   application.yml

3.1多环境配置(面试题)

有开发环境, 测试环境, 上线的环境。

每个环境有不同的配置信息, 例如端口, 上下文件, 数据库url,用户名,密码等等

使用多环境配置文件,可以方便的切换不同的配置。

使用方式: 创建多个配置文件, 名称规则: application-环境名称.properties(yml)

创建开发环境的配置文件: application-dev.properties( application-dev.yml )

创建测试者使用的配置: application-test.properties

然后在application.properties/yml

spring:
  profiles:
    active: dev

四、Spring Boot 中使用 ApplicationContext 手工获取容器中的对象(了解)

你想通过代码,从容器中获取对象。

通过SpringApplication.run(Application.class, args)的返回值获取容器对象

ConfigurableApplicationContext : 接口,是ApplicationContext的子接口
public interface ConfigurableApplicationContext extends ApplicationContext

例如:

@SpringBootApplication
public class A010SpringbootContainerApplication {

    public static void main(String[] args) {
        //获取容器对象
        ConfigurableApplicationContext run = SpringApplication.run(A010SpringbootContainerApplication.class, args);
        UserService userServiceImpl = (UserService) run.getBean("userServiceImpl");
        userServiceImpl.sayHello("李四");


    }

}

五、ComnandLineRunner 接口 , ApplcationRunner接口(了解)

开发中可能会有这样的情景。需要在容器启动后执行一些内容(某个时机?)。比如读取配置文件,数据库连接之类的。SpringBoot 给我们提供了两个接口来帮助我们实现这种需求。这两个接口 分别为 CommandLineRunner 和 ApplicationRunner。他们的执行时机为容器启动完成的时候。 这两个接口中有一个 run 方法,我们只需要实现这个方法即可。这两个接口的不同之处在于: ApplicationRunner 中 run 方 法 的 参 数 为 ApplicationArguments , 而 CommandLineRunner 接口中 run 方法的参数为 String 数组

总结:

这两个接口都 有一个run方法。 执行时间在容器对象创建好后, 自动执行run()方法。我们只需要实现run方法即可

可以完成自定义的在容器对象创建好的一些操作。

例子:

@SpringBootApplication
public class A011SpringbootRunnerApplication implements CommandLineRunner {

    @Autowired
    private HelloService helloService;


    public static void main(String[] args) {
        System.out.println("准备创建容器对象");
        SpringApplication.run(A011SpringbootRunnerApplication.class, args);
        System.out.println("创建容器对象之后");
    }

    @Override
    public void run(String... args) throws Exception {
        String lisi = helloService.sayHello("Lisi");
        System.out.println(lisi);
        //可做自定义的操作,比如读取文件
        System.out.println("在容器对象创建好之后,执行的方法");
    }

}

六、Web组件——拦截器

和springmvc的拦截器对比一下

使用:

(1)(web文件夹下) 创建类实现 HandlerInterceptor 接口  (和springmvc相同)

public class LoginInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        System.out.println("LoginInterceptor的preHandle方法执行啦");
        return true;
    }


}

(2)  注册拦截器对象   (相当于之前在xml中的配置)

注意(来自我的路径专题): 

具体路径后面带一个*:能拦截这个具体路径的子女节点

具体路径后面带两个*:能拦截这个具体路径的所有后代节点(包括这个具体路径自己,但当具体路径是"/"时,则无需被拦截)。

@Configuration
public class MyAppConfig implements WebMvcConfigurer {
    /**
     * 添加拦截器对象 以前是在xml中配置
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建拦截器对象
        HandlerInterceptor hi = new LoginInterceptor();

        //指定拦截的url
        String[] path = {"/user/**"};
        //不拦截的地址
        String[]  exclude = {"/user/login"};

        registry.addInterceptor(hi)
                .addPathPatterns(path)
                .excludePathPatterns(exclude);

    }
}

七、过滤器

使用

(1)(web文件下)创建 Filter 对象

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("执行了MyFilter");
        filterChain.doFilter(request,response);
    }
    
}

(2)注册 Filter   (瑞吉外卖和这里的配置不同 是通过一个注解 复习到再回来补充)

注意: urlPattern    (同样来自我的路径专题 和拦截器不一样)

<url-pattern>/</url-pattern>
会匹配到/springmvc这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。仅仅是路径

<url-pattern>/*</url-pattern>
会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和*.html等)  路径加页面

@Configuration
public class WebapplicationConfig {

    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/user/*");
        return  bean;

    }

}

字符集过滤器的应用(略)

八、 SpringBoot +MyBatis

注意是mybatis  和Mybatis Plus还是不太一样的  

1.@MapperScan和Mapper

可以参考@Mapper 与 @MapperScan 的区别_猎人在吃肉的博客-优快云博客

在 Dao 接口上面加入@Mapper,需要在每个接口都加入注解。当 Dao 接口多的时候不方便。

可以使用如下的方式解决。 主类上添加注解包扫描:@MapperScan("com.bjpowernode.dao")

(瑞吉外卖既有mapperscan又有mapper  建议用了mapperscan就不要用mapper了 )

2.mapper 文件和 java 代码分开管理

➢ 在 resources 创建自定义目录,例如 mapper, 存放 xml 文件

➢ 把原来的 xml 文件剪切并拷贝到 resources/mapper 目录

在 application.properties 配置文件中指定映射文件的位置,这个配置只有接口和映射文件不在同一个包的情况下,才需要指定

#指定mapper文件的位置
mybatis.mapper-locations=classpath:mapper/**.xml

3.事务支持

代码:a019-springboot-tran 事务 注意这里逆向工程的使用

可以看一下八股 


运行A019的代码 有这样一个疑惑   

"无论是运行时/编译时异常 ,throw抛出异常后代码停止,try-catch-finally解决后代码继续运行"

这里并不是说整个程序会宕掉, 特殊: 对于编译时异常 如果在main中仍然上抛(抛给了JVM)那么会宕掉   。重点是发生异常处后面的代码会不会执行  (至于spring(boot)整个程序会不会宕  目前不清楚)

对于FileInputStream这个检查时异常也是可以在controller中抛出的   同样 会返回原生错误信息到客户端  那么我认为对于检查时异常也是可以用统一异常处理

理解: 

通常会将事务配置在 Service 层, 当数据库操作失败时, 让 Service 层抛出运行时异常, 而不进行 try-catch 处理, Spring 事物管理器就会进行回滚. 为了事务回滚

但 Service 层抛出后. 在 Controller 层就需要 try-catch 去捕获异常, 否则会返回原生错误信息到客户端(如下图). 但是, 如果在 Controller 层的每个方法体里面都写一些模板化的 try-catch 的代码, 代码不但不美观, 也增加了维护的难度, 特别是还需要对 Service 层的不同异常进行不同处理的时候.   因此 统一异常处理


九、RESTful

9.1概念

REST : (英文: Representational State Transfer , 中文: 表现层状态转移)是一种接口的架构风格和设计的理念,不是标准。优点: 更简洁,更有层次

一句话概括:使用http中的动作(请求方式), 表示对资源的操作(CURD)

9.2通过5个重要注解来实现的

(1) @PathVariable   (一般传的参数不是数据库表的字段,可以不采用斜杠

(2) @PostMapping

(3) @DeleteMapping 

(4) @PutMapping 

(5) @GetMapping

保证url+请求方式唯一 , 否则会产生歧义

9.3 在页面中或者ajax中,支持put,delete请求

了解 具体看笔记

补充问题 

1.working directory 

注意下图的  

"src\\main\\resources\\a02.xml" 和 D:\java动力节点\Spring_gaoji\code\show 

前者是相对路径  后者是起始路径 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值