目录
1.Spring是什么?IoC和DI有什么区别?
2.Spring中如何存储Bean对象?
3.Spring中又是如何读取Bean对象?
4.存储Bean对象的注解。
5.获取Bean对象的注解
一.Spring是什么?IoC和DI有什么区别?
1.Spring是什么?
简而言之,Spring是包含多个工具方法的IoC容器。
核心功能:如何将对象存入Spring中,再从Spring中获取对象。
2.那么,IoC容器?IoC又是什么?
IoC:控制反转(Inversion of Control)
例如编写车辆启动程序时,先创建类车辆Car,车身Framework,底盘Bottom,车轮Tire.
在传统编码中:Car依赖Framework,Framework依赖Bottom,Bottom依赖Tire。
即在Car中new Framework(),同样在Framework中new Bottom(),在Bottom中new Tire()。就引入了一个问题,在实际开发过程中,Tire类的构造函数不能确定,可能有颜色要求,长度要求等,所以一旦减少或增加,就需要改变之前的所有类中的代码。
IoC:在构造每个类时,都不创建所依赖的对象,改用传递的方式,则只在Tire类·中构造对应的函数,达到了解耦的效果,所以如果要减少或者增加属性时,只需要修改Tire类即可。
DI:注入依赖(Dependency Injection)
DI就是IoC的一个实现方式。要想实现IoC,就得在相应类中注入所需要下一个类的对象,而不在本类中new该对象。
既然清楚了Spring是什么,那么Spring又是如何将对象存入Spring中?再从Spring中获取对象?
二.Spring中如何存储Bean对象?
首先得先有一个Bean对象,则先创建一个Bean对象。
创建好Bean之后就要将Bean注册到Spring中,即在Resources中创建spring-config.xml,并引入依赖。
注意:base-package为Bean所在包的路径,如果路径错误,就会导致读取时找不到Bean对象。
三.Spring中又是如何读取Bean对象?
首先创建启动类,在启动类中使用ApplicationContext创建上下文对象。
也可以使用BeanFoctory创建上下文。
此时涉及到一个经典面试题:
ApplicationContext和BeanFoctory有什么区别?
共同点:
都是用来获取spring上下文对象。
不同点:
1.继承关系和功能:
ApplicationContext 属于BeanFactory 的子类,ApplicationContext 具有BeanFactory 的所有功能。
BeanFactory 只具备最基础访问Bean的能力,
ApplicationContext 具备多能力,比如国际化支持,资源访问支持。
2.性能和加载方式:
ApplicationContext 是一次性加载并初始化所有的Bean对象。
BeanFactory是需要哪个再加载哪个,更加轻量。
注意:ClassPathXmlApplicationContext中的文件名一定不要写错,最好使用粘贴复制不要手敲。
之后就可以获取指定Bean对象了,对象id的命名规则使用小驼峰,但是如果类的首字母和第二个字母都为大写时,对象id与类名相同。
四.存储Bean对象的注解
1.类注解:@Controller, @Service,@Repository,@Component,@Configuration
@Controller:控制器存储 把数据存储到spring中
验证前端传递的参数 安全检查
@Service:服务存储 把数据存储到服务器中
服务调用的编排和汇总
@Repository:仓库存储 把数据存储到数据库中
直接操作数据库
@Component:组件存储
通用化的工具类
@Configuration:配置存储
项目的所有配置
2.方法注解:@Bean
类内部使用,必须搭配5大类注解使用。
五.获取Bean对象的注解
@Autowired
(1)属性注入(Field Injection)
自动装配 ,先根据类型查询 再根据名称查询
优点:写法简单。只需要给对象添加一个注解 @Autowired,不需要new对象的情况下,直接引入注入对象。
缺点:1.功能性问题:不能注入一个final修饰的对象;
解决方式:(1)使用时直接复制 (2)在构造方法中赋值
2.通用性问题:只能适应于IoC容器;
3.设计原则问题:更容易违背单一设计原则。
(2)Setter注入(Setter Injection)
优点:
符合单一设计原则(一个Setter针对一个对象)
缺点:1.不能注入一个final修饰的对象;
2.注入对象可被修改。
set可能被多次调用
(3)构造方法注入(Constructor Injection)
只有一个构造方法 @Autowired可以省略
可以有多个构造方法 但是只能有一个构造方法添加@Autowired注解
优点:1.可注入一个final修饰的对象;
2.注入对象不会被修改;
构造方法在对象创建时只会被执行一次,一次不存在对象被随时修改的情况。
3.注入对象会被完全初始化;
依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化。
4.通用性好。
构造方法是java JDK底层框架实现的。
@Resource
当同一类型有多个Bean对象时,使用@Resource(name = "XXX")
或者@Qualifier(value = "user2")来选择多个Bean对象中的一个。
@Autowired和@Resource有什么不同?
@Autowired和@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
出身不同,@Autowired是按类型的,是Spring的,而@Resource是按名称的,是JDK的;
使用时设置参数不同,@Resource支持多种参数。