Spring 5 学习

书中人 2020年05月08日 1,739次浏览

Spring 5

@RestController
public class WebFluxController {

    @RequestMapping("getJson")
    public Mono<User> getJson() {
        User user = new User();
        user.setPassword("123456");
        return Mono.just(user);
    }

    @RequestMapping("getflux")
    public Flux<User> getFlux() {
        User user = new User();
        user.setUsername("czbcxy");
        return Flux.fromArray(new User[] {
                user,user
        });
    }
}

Spring5的新特性

简化开发,解放双手
提供内置的解决方案,IOC,AOP,BOP(面向Bean编程)
声明式事物,TransactionManager管理事物
提供诸多的工具类,温饶Spring生态来实现的,比如JdbcTemplate,RestTemplate

BeanFactory和ApplicationContext有什么区别?

ApplicationContext是BeanFactory的实现类
BeanFactory顶层设计,而ApplicationContext是面向用户的。
功能来说,ApplicationContext相对BeanFactory,更能更加丰富。 BeanFactory只有getBean(),是否单例,是否原型。。。
IOC的功能是在DefaultListableBeanFactory类中完成的。但是有共同的接口,就是BeanFactory

Spring Bean的声明周期?

声明周期: init -> runner --> die
Singleton: 从Spring容器的启动到Spring容器销毁,可能会有lazy的,这类事在调用前创建
Prototype: 在调用前创建,调用后销毁,(作用域决定了声明周期的长短)

Spring bean个作用域之间的区别?

Singleton 作用域全局,跟随spring容器。
Prototype 全局的
Request 再一次请求和结束之前
Session 在创建和session失效,一般默认是30分钟

Spring Bean是线程安全吗?

Spring只是对Bean的管理,是个容器,至于安不安全由用户写的代码决定,和容器没有关系。

Spirng中使用到了那些设计模式?待完善:

工厂模式:
单利模式:
原型模式:
策略模式: 实例化反射在选择cglib还是jdk动态代理时使用。
适配器模式:
包装器模式:
门面模式:
享元模式:
责任连模式:
观察者模式:
解释器模式:

Spirng, Spingboot,SpringCloud区别?

SpringCloud依赖Springboot依赖Spring
Spring是一个java开发生态,已经相当成熟,但是还是不够方便易用,比如xml配置很麻烦,很容易出错。
Springboot出现就是解决了Spring的配置问题,完全使用注解。同时全面的去servlet化,不需要Tomcat和Jetty等容器。可以一键搭建环境,快速开发。
SpringCloud是Spring加入分布式的实践,打造更加全面的Java生态。(设计为可插拔式的组件,更加方便用户开发使用)

注册中心,服务发现,配置中心,负载,熔断,监控(链路追踪)。。。。

Spring事物怎么传播?

TransactionManager 代理模式

    数据库pool连接池:
    before() {
        comm.setAutoCommit(false);
    } 
    
    execute() {
       获取DataSource();
       获取Connection(); 
    }
    
    after(){
        if(condition) {
            conn.rollback();
        }else {
            conn.commit();
        }
    }

Spring如何接管Mybatis的事物?

Spring是通过代理管理事物的,所以不管是mybatis和hibernate都是获取连接,对连接操作。所以不用管Mybatis的实现。
扩展:千万别再一个方法中使用for循环去操作数据库,因为会多次链接数据库,导致连接池数据量不可控,(因为for循环数据量不可控)解决方法是:分页(保证for循环数据量可控),缓存和联合查询。

BeanFactory和FactoryBean的区别?

BeanFactory是一个工厂IOC容器的顶层设计ConfigurableBeanFactory,AutowireCapableBeanFactory等实现类,主要方法是getBean();
FactoryBean是用来构建Bean的一个包装类。主要放发是getObject(),创建bean使用