打印非托管的Spring bean名称

时间:2018-05-19 12:26:50

标签: java spring spring-boot

我创建了一个简单的SpringBoot应用程序。 有两个类:

1)ManagedBean类

@Component
class ManagedBean
{
    public void fn()
    {
        System.out.println("B doin nothing");
    }
}

2)NonmangedBean:它具有ManagedBean类的依赖性

class NonmangedBean
{
    @Autowired
    ManagedBean mb;

    public void fn()
    {
        mb.fn();
        System.out.println("doin nothing");
    }
}

第三个服务类有Rest End点。

@RestController
@RequestMapping("/")
class Service
{
    @Autowired 
    AutowireCapableBeanFactory beanFactory;

    @Autowired
    ApplicationContext applicationContext;

    @GetMapping("/getBeanNames")
    public List<String> printBeans() 
    {
        return Arrays.asList(applicationContext.getBeanDefinitionNames());
    }

    @GetMapping("/processBean")
    public String processBean()
    {
        NonmangedBean nb = new NonmangedBean();
        beanFactory.autowireBean(nb);
        nb.fn();

        return "Success";
    }
}

首先,我调用/ processBean端点,它将创建NonmangedBean类的Object并自动装配它。 (这里我的理解是bean将存在于Spring容器中,直到我关闭服务器。)

之后我点击/ getBeanNames端点获取Spring Container中的所有bean名称,但是我没有在列表中找到NonmangedBean。我在该列表中找到了ManagedBean。

问题:

1)这种类型的(NonmangedBean)自动装配的bean是否会存储在Spring Container中? 2)请求流程完成后,这种类型的自动装配豆会死吗? 3)我在printBeans方法中做错了吗?我应该使用除applicationContext以外的任何东西来获取SpringBean列表吗? 打开你的建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

在这里,我理解豆子将存在于Spring容器中直到我   关闭服务器

您的理解是错误的,它会因请求而死亡,即对象的范围仅在该方法(processBean)内。容器将管理您的bean。除此之外,使用

是没有意义的 非托管bean中的

@Autowired。由于容器没有管理它,它将为null(除非你使用beanFactory.autowireBean();注入它)并因此回答你的问题,如果你可以使用spring服务打印任何这样的bean是没有