Пример областей применения бобов

Пример области применения бобовых

В Spring область действия bean-компонента используется для определения, какой тип экземпляра bean-компонента должен возвращаться из контейнера Spring вызывающей стороне.

Поддерживается 5 типов областей действия bean:

  1. singleton - возвращает один экземпляр компонента для контейнера Spring IoC

  2. prototype - каждый раз по запросу возвращать новый экземпляр компонента

  3. request - возвращает один экземпляр компонента на HTTP-запрос. *

  4. session - возвращает один экземпляр компонента на сеанс HTTP. *

  5. globalSession - возвращает один экземпляр компонента на глобальный сеанс HTTP. *

В большинстве случаев вы можете иметь дело только с основной областью действия Spring - singleton и prototype, а область по умолчанию - singleton.

P.S * means only valid in the context of a web-aware Spring ApplicationContext

Синглтон против Прототипа

Вот пример, чтобы показать вам, в чем разница между областью видимости компонента:singleton иprototype.

package com.example.customer.services;

public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

1. Пример синглтона

Если в файле конфигурации компонента не указана область действия компонента, по умолчанию используется синглтон.



       

Запустить его

package com.example.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.customer.services.CustomerService;

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext context =
         new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});

        CustomerService custA = (CustomerService)context.getBean("customerService");
        custA.setMessage("Message by custA");
        System.out.println("Message : " + custA.getMessage());

        //retrieve it again
        CustomerService custB = (CustomerService)context.getBean("customerService");
        System.out.println("Message : " + custB.getMessage());
    }
}

Выход

Message : Message by custA
Message : Message by custA

Поскольку bean-компонент «customerService» находится в одноэлементной области, при втором извлечении с помощью «custB» также будет отображаться сообщение, установленное с помощью «custA», даже если оно получено с помощью нового метода getBean (). В синглтоне только один экземпляр на контейнер Spring IoC, независимо от того, сколько раз вы извлекаете его с помощью getBean (), он всегда будет возвращать один и тот же экземпляр.

2. Пример прототипа

Если вам нужен новый экземпляр компонента «customerService», каждый раз, когда вы вызываете его, используйте вместо него прототип.



   

Запустите это снова

Message : Message by custA
Message : null

В области прототипа у вас будет новый экземпляр для каждого вызываемого методаgetBean().

3. Аннотация областей применения бобов

Вы также можете использовать аннотацию для определения вашей области действия компонента.

package com.example.customer.services;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Включить автоматическое сканирование компонентов



       

Скачать исходный код

Скачать -Spring-Bean-Scopes-Example.zip (7 КБ)