为了降低 Java 开发的复杂性,Spring 采取了以下4种关键策略
-
基于 POJO 的轻量级和最小侵入性编程;
-
通过依赖注入和面向接口实现松耦合;
-
基于切面和惯例进行声明式编程;
-
通过切面和模板减少样板式代码;
优点
-
方便解耦,简化开发,可以将所有对象的创建和依赖关系的维护,交给 Spring 管理。
-
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
-
声明式事务的支持只需要通过配置就可以完成对事务的管理,而无需手动编程。
-
方便程序的测试,可以通过注解方便的测试Spring程序。
-
方便集成各种优秀框架。(如:Struts、Hibernate、MyBatis等)
-
Spring 对 JavaEE 开发中非常难用的一些API(JDBC、JavaMail、远程调用 等),都提供了封装,使这些API应用难度大大降低。
缺点
-
Spring依赖反射,反射影响性能
-
使用门槛升高,入门 Spring 需要较长时间
1、依赖注入和面向接口编程,实现了程序上的松耦合;
2、AOP 面向切面编程和注解的形式,实现声明式编程,减少样板式代码;
3、IOC 容器和依赖注入,简化开发,能够让程序员专注于业务;
spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的 JDBC 编码和数据库厂商特有的错误代码解析,用于简化 JDBC;
spring aop:提供面向切面编程的功能;
spring web:提供了针对 Web 开发的集成特性;
spring test:提供测试功能;
1、单例模式:bean 默认是单例模式;
2、工厂方法模式:BeanFactory 创建 bean 实例;
3、模板方法模式:这可太多了,几乎每一个虚构类及其子类的实现,都实现了该模式;
4、动态代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
5、观察者模式:Spring 中 listener 的实现,ApplicationListener;定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新;
实际上,spring 作为一个非常优秀的框架,基本实现了所有的设计模式;
1、ContextRefreshedEvent:容器刷新的时候,触发该事件;
2、ContextStartedEvent:容器加载完成,开始工作的时候,触发该事件;
3、ContextStoppedEvent:容器停止的时候,触发该事件;
4、ContextClosedEvent:容器关闭的时候,触发该事件;
DefaultListableBeanFactory 类当中有很多 ConcurrentHashMap;
Map 中的 key 是 String 类型,一般都是 bean 对应类名首字母小写,value 就是 bean 对象;
ApplicationContext:作为 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,还提供了更完整的框架功能:
-
-
提供在监听器中注册bean的事件。
-
同时加载多个配置文件。
-
BeanDefinition 接口的实现类,用于存储创建一个 bean 所需的元数据、bean 的生命周期、bean 的依赖;
spring 首先从 xml 配置文件或者注解形式或者 Java 代码配置的方式,获取将要创建的 bean 的定义信息,封装为 BeanDefinition 接口实现类;
这些 BeanDefinition 存储在 DefaultListableBeanFactory 中;
当 spirng 开始创建这些 bean 的时候,就从 DefaultListableBeanFactory 中取出 BeanDefinition 集合;
依次遍历该集合,调用执行 createBean 方法;
9.
-
-
如果查询的结果不止一个,那么 @Autowired 会根据名称来查找;
-
备注:本文内容部分来自马士兵学院、大厂学院,部分是我自己的理解和体会,感兴趣的同学,可以百度搜索马士兵或者大厂学院;