boot的几个依赖 spring_Spring 单例Bean依赖多例Bean时,多例Bean始终是同一个

当单例Bean依赖多例Bean时,单例Bean只有一次初始化的机会,它的依赖关系只有在初始化阶段被设置,而它所依赖的多例Bean会不断更新产生新的Bean实例,这将导致单例Bean所依赖的多例Bean得不到更新,每次都得到的是最开始时生成的Bean,这就违背了使用多例的初衷。

解决该问题有两种解决思路:

1.放弃依赖注入:主动向容器获取多例,可以实现ApplicationContextAware接口来获取ApplicationContext实例,通过ApplicationContext获取多例对象。

2.利用方法注入:方法注入是让Spring容器重写Bean中的抽象方法,该方法返回多例,Spring通过CGLIb修改客户端的二进制代码来实现。

没有使用方法注入时:

@Controller

public class MyController {

@Autowired

public UserService userService;

@RequestMapping("/showView")

public String showView(HttpServletRequest request) {

userService.deleteUser("1");

request.setAttribute("name", "张三");

return "showView";

}

}

public class UnitServiceImpl implements UnitService {

}

public class UserServiceImpl implements UserService {

private UnitService unitService;

public void setUnitService(UnitService unitService) {

this.unitService = unitService;

}

public void deleteUser(String id) {

System.out.println(unitService);

}

}

class="com.it.springbiz.user.service.impl.UnitServiceImpl" scope="prototype">

class="com.it.springbiz.user.service.impl.UserServiceImpl">

两次请求http://localhost:8080/springWeb/showView.action,得到的内存地址是一样的。

com.it.springbiz.user.service.impl.UnitServiceImpl@7a4076

com.it.springbiz.user.service.impl.UnitServiceImpl@7a4076

使用方法注入时:

@Controller

public class MyController {

@Autowired

public UserService userService;

@RequestMapping("/showView")

public String showView(HttpServletRequest request) {

userService.deleteUser("1");

request.setAttribute("name", "张三");

return "showView";

}

}

public class UnitServiceImpl implements UnitService {

}

public abstract class UserServiceImpl implements UserService {

// 此方法由Spring来实现,每次调用返回最新的UnitService

public abstract UnitService getUnitService();

public void deleteUser(String id) {

UnitService unitService=getUnitService();

System.out.println(unitService);

}

}

class="com.it.springbiz.user.service.impl.UnitServiceImpl" scope="prototype">

class="com.it.springbiz.user.service.impl.UserServiceImpl">

两次请求http://localhost:8080/springWeb/showView.action,得到的内存地址是一样的。

com.it.springbiz.user.service.impl.UnitServiceImpl@7a4076

com.it.springbiz.user.service.impl.UnitServiceImpl@7a4076

分享到:

2014-04-09 11:39

浏览 9999

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值