1.Spring概念【托管很多对象的框架】
一个包含了众多工具方法的IoC容器。
1.1 什么是容器?
容器是用来容纳各种物品的(基本)装置。--来自百度百科
之前常见的容器有:
List/Map-》数据存储容器
Tomcat-》Web容器
1.2什么是IoC?
IoC=Inversion of Control翻译成中文就是“控制反转”的意思,也就是说Spring是一个“控制反转”的容器。
控制反转:对象的创建权反转给别人了
比如:
创建一个类,A类引用B类,B类引用C类,C类引用D类的时候直接在构造函数里面new,
会有一个问题,当一个构造方法发生变化的时候,整个调用链都要发生变化,不在new了,
而是把当前的对象传入进来,这个时候虽然整个调用链还是A调用B,B类引用C类,C类引用D类,但是当D发生变化的时候,CBA不需要进行代码修改,从而解决了代码的耦合性,也就是IOC
降低代码的耦合性。
基本功能:
1.将对象存入容器。
2.从容器中取出对象。
1.3 DI概念说明
DI=Dependency Injection,依赖注入。所谓以来注入就是由IoC容器在运行期间,动态的将某种以来关系注入到对象之中。所以,以来注入和控制反转是从不同的角度描述同一间事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。
从广义上来说IoC=DI,从不同维度来描述同一个问题。IoC是设计思想,DI是具体实现。
2.Spring概念【托管很多对象的框架】【单例+懒汉】
1.创建maven项目
2.添加Spring框架依赖(spring-context,spring-beans)
3.创建启动类
2.1 Spring对象的存储
1.先创建Bean对象
2.将对象存入到bean中
(a)在resources下创建一个spring配置文件
(b)将bean对象配置到spring配置文件中
3.从spring中读取到Bean对象
(a)根据名称获取Bean
(b)根据Bean类型获取Bean【容易出错:当Spring中存在相同的对象时,使用类型来获取Bean就会报错】
(c)根据Bean名称+Bean类型获取Bean对象
获取Spring对象的两种方式:ApplicationContext和BeanFactory
相同点:
- 都可以得到Spring上下文对象
- 都是来自Spring的顶级接口
不同点:
继承关系和功能:ApplicationContext属于BeanFactory的子类:BeanFactory只有最基础访问Bean的能力,而ApplicationContext除了拥有BeanFactory功能之外,还包含了更多的功能:如国际化支持、资源访问、事件传播等。
ApplicationContext是一次性加载并初始化所有的Bean对象,所以在后面访问Bean对象时会很快。而BeanFactory是需要某个Bean对象时,采取加载Bean对象,所以他在执行Bean获取时,比较慢。
更加简单的讲对象存储到Spring中
3. 五大类注解
@Controller:控制器
@service:服务
@Respository:仓库
@Component:组件
@Configuration:配置
4.方法注解:@Bean-》将当前修饰方法的方法对象存储到Spring当中。
约定>配置
1.如果类名首字母是小写,要怎么从Spring中获取Bean?
和首字母是大写的是一致的,都是用的将类名首字母小写的方式来获取对象
2.如果首字母和第二字母都是大写,会怎么样?
当使用默认规则,首字母小写获取Bean对象时,会失败,正确获取Bean的方式是使用原类名,就能成功获取到了
3.项目中没有目录,所有的类都写在java根路径下,怎么存取Bean对象?
最佳方案:给项目创建合适的路径【配置根路径**加载比较慢,因为配置了根路径下所有的】
结论:当使用5大类注解的时,默认情况下获取Bean对象,只需要将类名的首字母小写即可;然而当Bean对象首字母和第二个字母都是大写的时候,此时需要使用原类名才能正确获取到Bean对象。
5.为什么需要五个类注解?
a)通过类注解可以了解当前类的用途(看到车牌 陕A 就知道这是西安的车一样)
b)功能由细微的不同
五大类注解的用途
程序的工程分层,调用流程如下所示:
1.@Controller(控制器):表示的是业务逻辑层,用来控制用户的行为,它用来检查用户此参数的有效性。
2.@Service(服务):归属于服务层,调用持久化类实现相应的功能。【不直接和数据库交互的,类似于控制中心】
3.@Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository
4.@Configuration(配置):归属于配置层,是用来配置当前项目的一些信息。
5.Component(组件):归属于公共工具类。提供某些公共方法。
6.五大类注解的关系
@Component是除了@Component的所有类的父类。
存对象到Spring中实现方式2:
使用@Bean方法注解:将返回的对象存储到Spring中。
注意事项:@Bean注解一定要配合5大类注解一块使用,否则是无效的注解。
当给@Bean设置了name属性之后,使用原方法名就不能获取到对象了,只能使用设置的方法名
注入的三种方式:
@Autowired、@Resource
1.属性注入
优点:实现简单
缺点:
- 不能注入不可变(final)的对象、
- 只适用IoC容器、
- 更容易违背单一设计原则
2.setter方法注入
优点:更加符合单一设计原则
缺点:
- 不能注入不可变(final)的对象、
- 注入对象可被修改【set方法是普通set方阿飞,可以被重复调用,在调用的时候就存在被修改的风险】
3.构造方法注入【当一个类中只有一个构造方法的手,可以省略@Autowired】
优点:
- 可以注入不可变的对象
- 注入的对象不会被修改
a)加了final修饰符
b)构造方法是随着类加载只执行一次的(不像set有可能执行多次被修改的)
- 注入的对象会被完全初始化【使用构造方法带来的优点】
- 通用性更好
缺点:没有属性注入简单
小结:日常开发中,使用属性注入实现更简单的读取Bean,依然是主流的实现方式。
@Autowired、@Resource的区别?
相同点:都是用来实现依赖注入的
不同点:
1.功能支持不同:
@Autowired支持属性注入,setter注入、构造方法注入
@Resource支持属性注入和setter注入,但不支持构造方法注入
2.出身不同:@Autowired来自Spring框架,@Resource来自JDK
3.参数支持不同:@Resource支持更多的参数设置,而@Autowired只支持required参数