Bean
时间:2021-07-15
本文章向大家介绍Bean,主要包括Bean使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Bean
一、Bean 是啥
- bean 是对象,一个或多个不限定。
- bean 由 Spring 中一个叫 IOC 的东西管理。
- 我们的程序由一个个 bean 组成。
二、Bean 分为两类
2.1、注册 Bean
把你要实例化的对象转换成一个 Bean,放在 IOC 容器中。
注解 注册:
@Component
@Repository
@Controller
@Service
@Configuration
- ....
XML 注册:
<bean id="beanId" class="com.xxx"/>
注意:
- 必须确保
beanId
是全局唯一不然会报错。 - 可以不设置
beanId
,但调用的时候就需要使用 类的全限定名。
2.2、使用 Bean
即是把已经在 配置类 或者 xml 文件中配置好的 Bean 拿来使用,完成属性、方法的组装。
- 通过
byType
(@Autowired
) 获取 IOC 容器中的 Bean。 - 通过
byName
(@Resource
)获取 IOC 容器中的 Bean。
三、Bean 作用域
-
单例模式(Spring 默认机制)
<bean id="..." class="..." scope="singleton"/>
-
原型模式:每次从容器中 get 的时候,都会产生一个新对象!
<bean id="..." class="..." scope="prototype"/>
-
Web 使用的作用域
-
request
:在一次请求中创建,创建完失效<bean id="..." class="..." scope="request"/>
-
session
:一直在 session 中活着<bean id="..." class="..." scope="session"/>
-
application
:在 全局中活着
-
四、Bean 的自动装配
自动装配就是指 Spring 容器可以自动装配(autowire)相互协作的 Bean 之间的关联关系。
简化就是:将一个 Bean 注入其它 Bean 的 Property 中。
在 Spring 中有三种装配的方式
- 在 xml 中显示的配置
- 在 java 中显示配置
- 隐式 的自动装配 bean
- 在 XML 文件中使用
autowire
属性即可。
- 在 XML 文件中使用
4.1、XML 配置文件装配
实体类
public class People{
private Cat cat;
public People(){}
public People(Cat cat){
this.cat = cat;
}
public void setCat(Cat cat){
this.cat = cat;
}
public Cat getCat(){
return cat;
}
@Override
public String toString(){
return "People{cat="+
cat +
'}';
}
}
1、byName自动装配
byName
:会自动在容器上下文中,查找和 注入类中的set()
名相同的beanId
并注入。
<bean id="cat" class="com.pojo.Cat"/>
<bean id="people" class="com.pojo.People" autowire="byName"/>
- 注意:
- 被注入类的
beanId
可以随便起,但必须和 注入类中的set()
名相同。
- 被注入类的
2、byType 自动装配
byType
:会自动在容器上下文中,查找和 注入类中的set()
参数名相同的 类名。
<bean class="com.pojo.Cat"/>
<bean id="people" class="com.pojo.People" autowire="byType"/>
- 注意:
- 必须保证 Spring 容器中类的 全限定名 唯一。
- 包名不一样、类名一样的话,
set()
参数类型是哪个就注入那个。
3、constructor 自动装配
constructor
:会自动在容器上下文中,查找和 注入类中的 有参构造器 参数类型
<bean class="com.pojo.Cat"/>
<bean id="people" class="com.pojo.People" autowire="constructor"/>
- 注意:
- 被注入属性的 类型 和 个数必须 注入类中的 有参构造器 参数相同。
4.2、半注解实现自动装配
1. @Resource
- 实体类
public class People {
@Resource
private Cat cat;
@Override
public String toString(){
return "People{" +
"cat=" + cat +
'}';
}
}
- xml 配置文件
<bean id="cat" class="com.pojo.Cat"/>
<bean id="people" class="com.pojo.People"/>
2. @Autowired
- 实体类
public class People {
@Resource
private Cat cat;
@Override
public String toString(){
return "People{" +
"cat=" + cat +
'}';
}
}
- xml 配置文件
<bean class="com.pojo.Cat"/>
<bean id="people" class="com.pojo.People"/>
- 同一个类在 Spring 容器中注册两次
- 一个有
beanId
一个没有beanId
,自动装配会报错。 - 如果其中有一个
beanId
和 绑定注解的属性名 一样就可以。
- 一个有
原文地址:https://www.cnblogs.com/shan-wang/p/15015825.html
- 高性能网站架构方案(三) ——Varnish加速与Gearman任务分发
- mysql 性能优化方案 (转)
- 《Redis设计与实现》读书笔记(一)——简单动态字符串(SDS)
- Comet:基于 HTTP 长连接的“服务器推”技术
- 编码修炼 | 快速了解Scala技术栈
- VFS四大对象之三 struct dentry
- PHP 排序算法实现讲解
- PHP7新特性介绍
- VFS四大对象之四-struct file
- 《Redis设计与实现》读书笔记(二) ——Redis中的字典(Hash)
- 《Redis设计与实现》读书笔记(三) ——Redis中的链表
- 《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
- 解析Linux中的VFS文件系统之文件系统的注册(二)
- vivi虚拟摄像头驱动程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vue项目中简单的store模式
- 5分钟学linux命令之split
- 分母为0一定会抛异常吗?
- 明明有class为什么还是报ClassNotFoundException?
- Maven 错误找不到符号
- 环境变量配置为jdk8,却显示java版本为jdk7
- Python脚本按照当前日期创建多级目录
- linux常用的读取文件内容指令
- Executors.newSingleThreadScheduledExecutor();线程池中放入多个线程问题
- SqlServer批量删除表
- java 获取一天内crontab任务执行的时间点
- Python自学成才之路 魔术方法之一元,二元运算符
- Python自学成才之路 魔术方法之打印对象实例
- Python自学成才之路 装饰器必用的wraps注解
- Python自学成才之路 使用函数作为装饰器