Spring中存取Bean的注解

目录

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类的构造函数不能确定,可能有颜色要求,长度要求等,所以一旦减少或增加,就需要改变之前的所有类中的代码。

Spring中存取Bean的注解_第1张图片

IoC:在构造每个类时,都不创建所依赖的对象,改用传递的方式,则只在Tire类·中构造对应的函数,达到了解耦的效果,所以如果要减少或者增加属性时,只需要修改Tire类即可。

Spring中存取Bean的注解_第2张图片

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的注解_第3张图片

 三.Spring中又是如何读取Bean对象?

首先创建启动类,在启动类中使用ApplicationContext创建上下文对象。

也可以使用BeanFoctory创建上下文。

此时涉及到一个经典面试题:

ApplicationContext和BeanFoctory有什么区别?

共同点:

都是用来获取spring上下文对象。

不同点:

1.继承关系和功能:

ApplicationContext 属于BeanFactory 的子类,ApplicationContext 具有BeanFactory 的所有功能。

BeanFactory 只具备最基础访问Bean的能力,

ApplicationContext 具备多能力,比如国际化支持,资源访问支持。

2.性能和加载方式:

ApplicationContext 是一次性加载并初始化所有的Bean对象。

BeanFactory是需要哪个再加载哪个,更加轻量。

注意:ClassPathXmlApplicationContext中的文件名一定不要写错,最好使用粘贴复制不要手敲。

Spring中存取Bean的注解_第4张图片

 之后就可以获取指定Bean对象了,对象id的命名规则使用小驼峰,但是如果类的首字母和第二个字母都为大写时,对象id与类名相同。

 四.存储Bean对象的注解

1.类注解:@Controller, @Service,@Repository,@Component,@Configuration

@Controller:控制器存储  把数据存储到spring中
验证前端传递的参数 安全检查

@Service:服务存储 把数据存储到服务器中
服务调用的编排和汇总

@Repository:仓库存储  把数据存储到数据库中
直接操作数据库

@Component:组件存储
通用化的工具类

@Configuration:配置存储
项目的所有配置

2.方法注解:@Bean

类内部使用,必须搭配5大类注解使用。

五.获取Bean对象的注解

@Autowired

(1)属性注入(Field Injection)

自动装配 ,先根据类型查询 再根据名称查询

Spring中存取Bean的注解_第5张图片

优点:写法简单。只需要给对象添加一个注解 @Autowired,不需要new对象的情况下,直接引入注入对象。

缺点:1.功能性问题:不能注入一个final修饰的对象;

解决方式:(1)使用时直接复制 (2)在构造方法中赋值

2.通用性问题:只能适应于IoC容器;

3.设计原则问题:更容易违背单一设计原则。

 (2)Setter注入(Setter Injection)

Spring中存取Bean的注解_第6张图片

优点:

符合单一设计原则(一个Setter针对一个对象)

缺点:1.不能注入一个final修饰的对象;

2.注入对象可被修改。

set可能被多次调用

(3)构造方法注入(Constructor Injection)
 只有一个构造方法 @Autowired可以省略
 可以有多个构造方法 但是只能有一个构造方法添加@Autowired注解

Spring中存取Bean的注解_第7张图片

优点: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支持多种参数。

你可能感兴趣的:(spring,java,mybatis)