您的位置:首页 > 编程语言 > Java开发

手动创建(new)对象,使用spring容器中的bean(ServletContext)。

2016-12-30 14:58 465 查看
场景:一个不受spring管理的静态工厂方法,根据传入的参数不同,返回不同的实现类对象(关键点:实现类对象需要使用spring容器中的数据访问层对象dao或mapper)。

疑难点:如何从spring容器中获取bean,并注入到自己new出来的对象中。

解决方案:使用spring的autoware机制+static,spring的autoware自动装配:只要类实现了ServletContextAware接口,web容器初始化时,就会将servletcontext注入到该类中(注意该类在spring的ioc容器中,自己new出来的类spring是不会帮你注入的),但是静态工厂方法又需要自己亲手new,该怎么办呢?。。。这时我们使用static关键字修饰spring注入的servletContext,以达到共享使用servletContext的效果(注意:这时不是spring帮你注入了,而是第一次spring自己创建对象,它把servletContext注入到它可以管理的bean中,而该bean的servletcontext是用static关键字修饰的-存放到了内存区中;我们再次new时使用的是内存区中的servetContext)。

缺点:spring创建的bean对象,我们并没有使用(使用的是自己new出来的对象),浪费了该资源。

service实现类

@Service
public class BuyerServiceImplTest1 implements ServletContextAware,BuyerService{
private static ServletContext servletContext;

@Override
public void setServletContext(ServletContext servletContext) {
BuyerServiceImplTest1.servletContext = servletContext;
}

public BuyerServiceImplTest1(){
}
静态工厂方法

public class StaticService {
public static BuyerService getBuyerService(String serviceFlag){
if("1".equals(serviceFlag)){
return new BuyerServiceImplTest1();
}
return null;
}
}
使用静态工厂方法获取实现类

public void saveUserLoginInfoToRedis(String uniqueKey, String username) {
BuyerService buyerService = StaticService.getBuyerService("1");
System.out.println(buyerService);
Buyer buyerFirstTest = buyerService.getBuyerByUsername(null);
System.out.println(buyerFirstTest.getRealName());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐