1Spring是什么
Spring是一个包含众多工具方法的IoC容器
1.1什么是容器
用来存放物品的装置,比如LIst/map就是数据存储容器,Tomcat就是web容器
1.2IoC(Inversion of Control)控制反转
控制反转就是控制权反转,获取依赖的过程被反转了,当我们需要某个对象时,传统开发模式需要自己通过new来创建对象,但是现在不需要了,把这一过程交给容器,程序中只需要注入即可.
1.2.1IoC的优点
- 资源集中管理:IoC容器帮我们管理一些资源,我们需要使用的时候只需要从IoC容器中获取就可以
- 我们在创建实例的时候不需要了解其中的细节,降低使用资源双方的依赖程度
1.3DI(Dependency Injection)依赖注入
容器在运行期间,动态的为应用程序提供运行时所需要的资源.
IoC是一种思想,一种指导原则,DI就是这种思想的具体实现
1.4IoC和DI的使用
//通过这个注释,把这个实现类交给Spring管理 @Component public class BookService { //通过这个注解将之间交给Spring管理的在注入运行时需要的的依赖对象 @Autowired private BookDao bookDao; public List<BookInfo> getBookList() { List<BookInfo> books = bookDao.mockData(); for (BookInfo book : books) { if (book.getStatus() == 1) { book.setStatusCN("可借阅"); } else { book.setStatusCN("不可借阅"); } } return books; } }
1.6高内聚,低耦合
高内聚指的是:一个模块中各个元素之间联系非常紧密.
低耦合:软件各个层或者模块之间依赖的关联度是与低越好..修改一处代码其他模块的代码改动越小越好
1.7IoC详解
1.7.1Bean的存储
- 类注解:@controller(控制器存储),@Service(服务存储),@Repository(仓库存储),@Component(组件存储),@Configuration(配置存储)
- 方法注解:@Bean
下面这个代码是通过名称来获取对象,一般来说把类名变成小驼峰的形式就可以了
不过有一个例外当类名的前两位都是大写字母时将保留原始的不进行改变
面试题ApplicationContextVSBeanFactory
- 继承和功能方面:两个都是spring的顶级接口:Bean Factory和ApplicationContxet.B提供了基础的访问容器的功能,而A时B的子类,他又独特的功能国际化的支持,资源访问支持,以及事件传播等方面的支持
- 从性能方面来说:A时一次性加载并初始化所有的Bean对象,而B是需要那个才加载那个更加的轻量
1.7.2类注解的功能
这些类注解,可以代表不同的功能,这样可以使程序员一眼就知道接下来的代码是干嘛的了和应用分层对应
不过我们通过源代码来看其中四个注解都是@compent的衍生注解,所以他们的功能都是相同的,只不过使用在不同的场景下,比如在业务逻辑层使用@Component和@Service一样的,不过明显@Service更加合适,比如生活中刷牙杯和喝水杯,功能是一样的,我们可以用刷牙杯来喝水,不过明显还是喝水杯更加合适
1.7.3方法注解@bean
类注解确实好用不过是要加在类上,当我们使用外部类的时候就不方便了,而且当一个类中有多个对象,就需要使用@Bean
注意:使用@bean使需要搭配五大注解来使用,这样注解才能将对象正常储存到Spring中
1.7.3.1定义多个对象
当有多个对象时我们就不可以使用类名来获取对象了,只能通过名字来获取
可以重命名
当我们使用了注解就一定会生效吗,只有扫描到了该注解才会生效,在启动类中@SpringBootApplication有这个注解,默认会扫描启动类所在的包或者其子包.,如果我们需要扫描的地方不在这里就需要通过 @ComponentScan({"com.example.demo"})注解来指定扫描的位置.
1.8DI详解
1.8.1属性注入
属性注入以类型进行匹配,与注入的属性名称无关,当一个类型中有多个对象时,优先进行名称匹配,如果名称都匹配不上就会报错
优点:简洁使用方便
缺点:只能用于IoC容器并且不能注入final修饰的属性
1.8.2构造方法注入
如果只有一个构造方法,那么@Autowired就可以省略,如果有多个够着方法,就要加上.
优点:1.可以注入final修饰属性
2.注入的对象不可以修改
3.依赖对象在使用前一定会被完全初始化,因为依赖是在类的构造方法中执行的而构造方法是在类加载阶段就会执行的方法
4通用性好是JDK支持的所有更换任何框架都是适用的
1.8.3Setter注入
1.8.4@Autowired相关问题
当一个类中存在多个bean,使用@Autowired会有相关问题
1.属性名和你需要的对象名一致
2.使用@Primary注释来标识默认的对象
3.使用@Qualifier,不能单独使用必须和@Autowired一起使用
4.使用@Resource,按照bean的名称进行注入.
相关面试题@autowired和@Resource区别
- @Resource来自jdk的注解,@autowired是来自spring
- @autowired是按照类型进行注入,@Resource是按照名称来进行注入
Spring,SpringBoot和SpringMVC的关系以及区别
Spring:Spring是一个开发应用框架,轻量级一站式模块化,目的是用来简化企业级应用程序开发,具有高度开放性可以选择部分或者全部,也可以继承第三方框架
SpringMVC:是spring的一个子框架,按照mvc的模式设计了一个MVC框架,更加简约
SpringBoot:是对Spring的一个封装,为了简化Spring而开发
SpringMVC和SpringBoot都属于Spring,SpringMVC是基于Spring的⼀个MVC框架,⽽SpringBoot是基于Spring的⼀套快速开发整合包.