【程序员不圆3】【Spring3】Spring问题集中答疑1

159 阅读3分钟

Spring模块

大模块小模块作用
核心容器Beans和core一起提供控制反转和依赖注入。你不再需要编程去实现单例模式,允许你把依赖关系的配置和描述从程序逻辑中解耦。
核心容器Core同上
核心容器ContextSpring容器。上下文模块从Beans模块继承其功能,并添加支持国际化(使用,例如,资源集合),事件传播,资源负载,并且透明创建上下文
核心容器SpEL提供了强大的表达式语言去支持查询和操作运行时对象图
面向切面AOP提供了一个符合AOP联盟(要求)的面向方面的编程实现
面向切面Aspects单独的spring-aspects模块,提供了与AspectJ的集成。
类植入Instrumentation支持和类加载器的实现,可以应用在特定的应用服务器中
消息Messaging传输消息
数据访问/集成JDBC连接数据库等
数据访问/集成ORM对象关系映射
数据访问/集成OXM提供了一个支持对象/ XML映射实现的抽象层
数据访问/集成JMS包含用于生产和消费消息的功能
数据访问/集成Transactions事务
WebWebsocketwebsocket主要功能就是实现网络通讯,比如说最经典的客服聊天窗口、您有新的消息通知,或者是项目与项目之间的通讯,都可以采用websocket来实现。
WebServletServlet容器
WebWeb提供基本的面向Web的集成功能,例如多部分文件上传功能,以及初始化一个使用了Servlet侦听器和面向Web的应用程序上下文的IoC容器
WebPortlet类似Servlet
测试Test进行单元测试集成测试

SpringMVC的发展

Spring SpringMVC Springboot的关系

Springboot包含了Spring并做了扩展 如加入Starter来简化Maven配置

Spring包含了SpringMVC

Springboot > Spring > SpringMVC

SpringMVC 和 Springboot中的模块差别在哪

去掉了servlet.xml的配置

事务

事务的分类

  • 声明式事务

  • 编程式事务

编程式事务

手动提交事务

public class UserService {
    @Resource
    UserDAO userDAO;
    @Resource
    DataSource dataSource;
    @Resource
    PlatformTransactionManager transactionManager;
    public void addUser(User user) throws Exception {
        TransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // [1] 插入纪录
            userDAO.insert(user);
            // [2] 范例抛出异常
            Integer i = null;
            if (i.equals(0)) {
            }
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
        return;
    }
}

声明式事务

指定某一个函数为事务

方式:

  • 基于TransactionInterceptor的声明式事务;
  • 基于TransactionProxyFactoryBean的声明式事务;
  • 基于/命名空间的声明式事务;
  • 基于标注(@Transactional)的声明式事务。

事务的传播行为

当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

传播行为存在事务不存在事务场景
propagation_requierd运行创建事务正常事务,失败后全体回滚
propagation_supports运行非事务运行查询
propagation_mandatory运行抛出异常强制由事务调用
propagation_required_new挂起当前事务创建事务失败不影响当前事务
propagation_not_supported挂起当前事务非事务运行本身不以事务运行
propagation_never抛出异常非事务运行整个系统不以事务运行
propagation_nested嵌套运行创建事务根据小事务决定大事务

单例的循环依赖

A的构造函数中有B

B的构造函数中有A

判断

如果存在在ealySingletonObjects或者singletonObjects都算是循环依赖

三级缓存

  • singletonFactories : 单例对象工厂的cache
  • earlySingletonObjects :提前暴光的单例对象的Cache
  • singletonObjects:单例对象的cache
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);

/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);

/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);

原理

  • Spring是通过递归的方式获取目标bean及其所依赖的bean的;
  • Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。

参考资料

blog.csdn.net/weixin_3962…

juejin.cn/post/684490…

blog.csdn.net/Mutou_ren/a…

zhuanlan.zhihu.com/p/63117304