spring的注入及bean的作用域

本文探讨了Spring框架中依赖注入的基本概念,并通过具体代码示例展示了不同作用域(singleton和prototype)下bean实例的行为差异。同时介绍了如何通过XML配置文件来定义bean及其属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java项目中:
1.建User类
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setusername-----"+name);
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}[code="java"][/code]

2.建二个接口,和实现类
public class TestSpringImpl implements TestSpring{

private User user;

public void setUser(User user){
this.user = user;
this.user.setName("TestSpringImpl---testUser");
}

public void save(String name){
// System.out.println("TestSpringImpl---"+name);
System.out.println(this.user.getName());
}
}


public class SecondTestImpl implements SecondTest {

private User us;

public void setUs(User us){
this.us = us;
this.us.setName("SecondTestImpl--testUser");
}

public void del(User user){
//System.out.println("SecondTestImpl--User="+user.getName());
System.out.println(this.us.getName());
}
}

3.application.xml


<bean id="testSpringImpl" class="TestSpringImpl">
<property name="user" ref="user">
</property>
</bean>

<bean id="secondTestImpl" class="SecondTestImpl">
<property name="us" ref="user"></property>
</bean>

<bean name="user" class="User" scope="prototype"/>

<bean id="test" class="Test">
<!-- //setter 注入
<property name="ts" ref="testSpringImpl"></property>-->
<constructor-arg ref="testSpringImpl"></constructor-arg>
<constructor-arg value="i LOEVE YOUE"></constructor-arg>
<constructor-arg ref="secondTestImpl"></constructor-arg>
</bean>


当user类的,scope 为singleton
TestSpringImpl 修改了user的 name 为TestSpringImpl---testUser
SecondTestImpl 也修改了user的 name 为SecondTestImpl--testUser
save 和 del 输出的 user的 name 都是 SecondTestImpl--testUser
当user类的,scope 为prototype 时.
输出的分别是TestSpringImpl---testUser,SecondTestImpl--testUser
springAPI:
当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。默认

Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值