Spring~Bean的作用域(单例模式、原型模式)等, Bean的自动装配方法, @AutoWired和@Resource的区别

it2025-12-21  7

文章目录

Bean的作用域单例模式原型模式其余三个作用域 Bean的自动装配注解装配 @AutoWired和@Resource的区别

Bean的作用域

单例模式

创建的实例只有一个,也就是通过相同的id获取bean对象获取的是同一个bean使用scope="singleton"指定是单例模式, 而且在Spring中默认就是单例模式, <!--使用p命名直接注入值, 相当于property, 但是在使用前必须加约束xmlns:p="http://www.springframework.org/schema/p"--> <bean id="user1" class="User" p:name="Listen" p:age="20" scope="singleton"/> 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"指定是原型模式 <bean id="user" class="User" p:name="Listen" p:age="20" 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的自动装配

Bean的自动装配, spring满足bean依赖的一种方式, spring会在上下文中自动寻找, 并自动给bean进行装配, 在spring中有三种自动装配的方式一: xml中显示的配置二: 在java中显示配置三: 隐式的自动装配bean(重点) : 就是使用byname的时候, 必须是注入的bean的id是唯一的, 使用bytype就是是注入的bean的class是唯一的 byname的形式 用AutoWired的byName自动装配, 因为是使用byname所以需要注入的属性的名字和bean的id必须相同 , 也就是byname自动在上下文中进行查找, 和自己对象set方法后面的值所对应的beanId <!-- 使用spring创建对象, 在spring中这些都称为bean --> <bean id="cat1" class="model.Cat"/> <bean id="cat" class="model.Cat"/> <bean id="dog" class="model.Dog"/> <bean id="people" class="model.People"> <property name="name" value="Listen"/> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> </bean> <bean id="people1" class="model.People" autowire="byName"> <property name="name" value="Bike"/> </bean> bytype的形式 使用AutoWired的bytype进行自动装配, 使用bytype的时候, 会自动在上下文中寻找, 和自己对象属性类型相匹配的beanId, 也就是名字可以不一样, 但是这个相匹配类型的beanId只能是一个, 如果有多个就会出错, 还有一点就是使用bytype的时候, 类型相匹配的那个beanId是可以省略的 <bean id="cat" class="model.Cat"/> <bean id="dog" class="model.Dog"/> <bean id="people" class="model.People"> <property name="name" value="Listen"/> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> </bean> <bean id="people2" class="model.People" autowire="byType"> <property name="name" value="Flake"/> </bean>

注解装配

使用注解实现自动装配: @AutoWired和@Resource public class People { @Autowired private Dog dog; @Resource private Cat cat; private String name; 在使用前必须 导入约束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”>

配置注解的支持, <context:annotation-config/>

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

<bean id="people3" class="model.People"> <property name="name" value="Mink"/> </bean> 给类中字段加上注解之后就可以按上述这样写, 就会帮我们完成字段的装配, 当然类中的注解也可以使用@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;
最新回复(0)