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使用
Q.E.D.