博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring~Bean的作用域(单例模式、原型模式)等, Bean的自动装配方法, @AutoWired和@Resource的区别
阅读量:4050 次
发布时间:2019-05-25

本文共 3614 字,大约阅读时间需要 12 分钟。

文章目录

Bean的作用域

单例模式

  • 创建的实例只有一个,也就是通过相同的id获取bean对象获取的是同一个bean
  • 使用scope="singleton"指定是单例模式, 而且在Spring中默认就是单例模式,
public class Demo {
public static void main(String[] args) {
} @Test public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContex.xml"); User user = (User)context.getBean("user1"); User user1 = context.getBean("user1", User.class); System.out.println(user == user1); System.out.println(user.toString()); System.out.println("================"); }}

在这里插入图片描述

  • 由结果看出是同一个bean对象

原型模式

  • 使用原型模式就是使同一个id获取的bean对象是不一样的, 每次get都会产生新的对象
  • 使用scope="prototype"指定是原型模式
public class Demo {
public static void main(String[] args) {
} @Test public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContex.xml"); User user = (User)context.getBean("user"); User user1 = context.getBean("user", User.class); System.out.println(user == user1); System.out.println(user.toString()); System.out.println("================"); }}

在这里插入图片描述

  • 由结果看出, 得到的不是同一个bean对象

其余三个作用域

  • 其余request、session、application, 这些在web开发中使用, request就是一个bean对象在请求中一直活在, session就是在一个会话中一直活在, application就会全局一直活在

Bean的自动装配

  1. Bean的自动装配, spring满足bean依赖的一种方式, spring会在上下文中自动寻找, 并自动给bean进行装配, 在spring中有三种自动装配的方式
  2. 一: xml中显示的配置
  3. 二: 在java中显示配置
  4. 三: 隐式的自动装配bean(重点) : 就是使用byname的时候, 必须是注入的bean的id是唯一的, 使用bytype就是是注入的bean的class是唯一的
  • byname的形式
    用AutoWired的byName自动装配, 因为是使用byname所以需要注入的属性的名字和bean的id必须相同 , 也就是byname自动在上下文中进行查找, 和自己对象set方法后面的值所对应的beanId
  • bytype的形式
    使用AutoWired的bytype进行自动装配, 使用bytype的时候, 会自动在上下文中寻找, 和自己对象属性类型相匹配的beanId, 也就是名字可以不一样, 但是这个相匹配类型的beanId只能是一个, 如果有多个就会出错, 还有一点就是使用bytype的时候, 类型相匹配的那个beanId是可以省略的

注解装配

  • 使用注解实现自动装配: @AutoWired和@Resource
public class People {
@Autowired private Dog dog; @Resource private Cat cat; private String name;
  • 在使用前必须
  1. 导入约束xmlns:context=“http://www.springframework.org/schema/context”

完整就是

xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:context=“http://www.springframework.org/schema/context”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd”>

  1. 配置注解的支持,

注意使用@AutoWired给对象自动加注入的时候, 还要保证属性名字和IOC中已经存在的bean的名字要相同 ,这个注解可以加在属性上, 也可以加在set方法上, 当然你加到属性上的时候set方法可以省略

  • 给类中字段加上注解之后就可以按上述这样写, 就会帮我们完成字段的装配, 当然类中的注解也可以使用@Resource, 但是又有不同点
  • 额外注解知识给属性字段加了@Nullable意思就是这个字段可以为空, 也就是即使我们不为他注入依赖, 当我们访问的时候也不会报错
public void setName(@Nullable String name) {
this.name = name; }
  • 在使用@AutoWired(required=false) 就表示这个属性可以为空, 不会报错, 默认是true不容许为null的
  • @Qualifier(value=“XXX”) 可以指定自动装配的是哪个bean, 使用@AutoWired的时候, 被注入的那个bean的type是唯一才可以, 如果是多个的时候, 我们就可以使用这个指定那个bean注入, 所以这个注解是配套@AutoWired去使用的
  • 使用java原生的注解去自动装配@Resource, 这个字段装配是先判断name唯一匹配, 如果找不到再去使用type唯一匹配, 这个注解也可以指定加@Resource(name=“XXX”) 去指定一个bean去装配, 使用这个功能强大一点, 但是效率略低

@AutoWired和@Resource的区别

  • 相同点就是: 都是用来自动装配的, 都可以放在属性字段上,
  • 不同点:
    @AutoWired通过bytype的方式实现, 找不到就报错, 也可以通过@Quailfire(value指定name去找, 是spring自带的装配方式
    @Resource是默认找byname的方式, 但是找不到还会使用bytype的方式去找,俩种方式都找不到了才会报错, 如果需要找到指定bean的时候, Resource直接加(name 指定就行
@Autowired    @Qualifier(value = "dog1")    private Dog dog;    @Resource(name = "cat1")    private Cat cat;

转载地址:http://ljsci.baihongyu.com/

你可能感兴趣的文章
2440机器码
查看>>
c语言内存分配
查看>>
结构体file_operations
查看>>
TFT LCD
查看>>
双向链表
查看>>
二级指针与指针数组的关系
查看>>
Linux系统限制
查看>>
C预处理器标识
查看>>
static用法总结
查看>>
const用法小结
查看>>
malloc、free与内存碎片
查看>>
C语言实现库函数
查看>>
Tarball的管理
查看>>
变量在Linux中的应用
查看>>
对象的深拷贝
查看>>
父组件访问子组件属性--方法--
查看>>
组件访问--子组件访问父组件(很少用)
查看>>
获取子组件插槽里面的 数组----数据
查看>>
es6模块化---记录
查看>>
webpack的配置使用------记录
查看>>