当前位置: 首页 > 面试题库 >

Spring,使用@Configuration和@Bean批注

越正阳
2023-03-14
问题内容

我有一个代码:

@Configuration
public class BeanSample {

    @Bean(destroyMethod = "stop")
    public SomeBean someBean() throws Exception {
        return new SomeBean("somebean name1");
    }


    class SomeBean {

        String name;

        public SomeBean(String name) {
            this.name = name;
        }

        public void stop() {
            System.out.println("stop");
        }
    }

    public static void main(String[] args) throws Exception {

        BeanSample beanSample = new BeanSample();
        SomeBean someBean1 = beanSample.someBean();

        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
                new String[] {"appContext.xml"});

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean1 == someBean2) System.out.println("OK");

    }
}

我期望一旦启动应用程序BeanSample.getSomeBean(),然后SomeBean将开始由“ someBean”提供。

现在我有一个错误: 没有定义名为“ someBean”的bean

实际上,我有点不明白应该使用哪个应用程序上下文来提取我的豆子?

关于@Configuration

有什么原因,为什么我应该在这里使用@Configuration注释?(通过这一步,我的IDE突出了我的类,因为那时它是与Spring相关的,所以应该很有意义)

- 好的:得到答案后,我的代码如下:

 public static void main(String[] args) throws Exception {

        AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean2 != null) System.out.println("OK");

    }

问题答案:

首先,如果使用Java配置,则必须实例化上下文,如下所示:

new AnnotationConfigApplicationContext(BeanSample.class)

其次,@Configuration注释不会使被注释的类脱离bean。仅使用@Bean方法来创建bean。

如果您也想要一个BeanSamplebean,则必须创建另一个@Bean方法来创建一个bean
。但是话又说回来,你为什么要那样?我认为@Configuration该类仅应用作配置容器,而不能用于其他任何东西。

第三,其默认bean名称@Bean不遵循属性getter的约定。方法名称直接使用,这意味着在您的示例中,bean将被命名为getSomeBeannot
someBean。将方法更改为此:

@Bean(destroyMethod = "stop")
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

最后,@Configuration该类不应实例化。它的方法仅用于创建bean。然后,Spring将处理其生命周期,注入属性等。相反,如果实例化该类并直接调用方法,则返回的对象将是与Spring无关的普通对象。



 类似资料:
  • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!

  • 问题内容: 我有以下配置文件: 我使用以下VM选项运行应用程序: 因此,我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,目前未处理注释,属性为。另一方面,如果我已经通过xml文件进行了配置,那么一切都会按预期进行。Xml文件示例: 如果我尝试将属性值注入到另一个Spring配置文件中- 它已正确注入。如果将我的bean创建移动到该配置文件-字段值再次为null。 解决方法是,使用以

  • 问题内容: 使用基于Java的配置时,Spring如何防止再次调用bar()? 我想知道编译时注释处理还是通过代理方法? 问题答案: 假设您创建的上下文有点像 由于,Spring将创建一个类型的bean 并对其进行代理,因为它具有方法。你应该检查出的实施细则。 这些方法不会直接在对象上调用。显然,它们不能,因为在编译时不知道它们。通过在代理服务器上进行反射来调用它们。 所以当你有 相当于 该指的是

  • 本文向大家介绍Spring中基于Java的配置@Configuration和@Bean用法详解,包括了Spring中基于Java的配置@Configuration和@Bean用法详解的使用技巧和注意事项,需要的朋友参考一下 一、首先,需要xml中进行少量的配置来启动Java配置: 二、定义一个配置类 用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于

  • 我在Spring Batch中遇到了一个问题,这通常很简单。 我有多个步骤,面向块处理。对于每个步骤,我都想使用相同的ItemReader。 这是我的步骤宣言: 我的请求有一些参数,我想用准备状态设置器替换它们。 所以我的意图是为每个bean创建多个bean(对于每个步骤),以便为每个bean调用特定的准备语句。 我有以下错误: 我做错了什么?如果你需要更多的细节,请告诉我。 谢谢你的帮助。

  • 我是Spring框架的新手。我尝试在@component中使用@bean注释配置2bean。之后,我尝试getBean(按名称),得到一个NoSuchBeanDefinitionException。请帮我解决一下。 这是我的代码:-组件: