то и serverpc и serverpc1 будут ссылаться на один и тот же объект поскольку как помним у синглтона может быть только один экземпляр.
Если бину serverPCBean в конф. файле установить scope="prototype", то в приведенном примере создадутся два разных экземпляра.
Также есть:
request (при каждом запросе к сервлету создается новый экземпляр (bean)),
session (при каждой новой сессии пользователя создается новый экземпляр (bean))
global-session (экземпляр распространяется на всё приложение).
Давайте сконфигурируем два бина. У одного будет scope singleton у другого prototype.
applicationContext.xml:
Давайте же теперь проверим определенные бины и их скоупы в Java программе.
Пример программы:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import java.io.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.someclasses.ServerPC;
@WebServlet(“/springservlet”)
public class SpringServlet extends HttpServlet{
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(
“applicationContext.xml”);
//Поскольку serverPCBeanpSingletonScope
//имеет scope singleton ниже
//создадутся две ссылки на один
//и тот же объект serverPCBeanpSingletonScope.
//То есть при каждом вызове getBean из context
//извлекается один и тот же
//объект serverPCBeanpPototypeScope
ServerPC serverpcSingleton =
context.getBean(
“serverPCBeanpSingletonScope”,ServerPC.class);
ServerPC serverpcSingleton1 =
context.getBean(
“serverPCBeanpSingletonScope”,ServerPC.class);
//Проверим правда ли обе ссылки ссылаются
//на один и тот же объект
//serverPCBeanpSingletonScope.
//Установим значение поля pcid
//у бина serverPCBeanpSingletonScope
//через ссылку serverpcSingleton,
serverpcSingleton.setPcid(“1233425”);
//и теперь извлечем его
//через другую ссылку – serverpcSingleton1
resp.getWriter().write(
serverpcSingleton1.getPcid());
//Поскольку serverPCBeanpPototypeScope
//имеет scope prototype ниже
//создадутся две ссылки на разные
//объекты serverPCBeanpPototypeScope.
//То есть при каждом вызове getBean создается
//новый объект serverPCBeanpPototypeScope
ServerPC serverpcPrototype =
context.getBean(
“serverPCBeanpPototypeScope”,ServerPC.class);
ServerPC serverpcPrototype1 =
context.getBean(
“serverPCBeanpPototypeScope”,ServerPC.class);
//Проверим правда ли обе ссылки ссылаются
//на разные объекты serverPCBeanpPototypeScope.
//Установим значение поля pcid
//у бина serverPCBeanpPototypeScope
//через ссылку serverpcPrototype,
serverpcPrototype.setPcid(“1233425”);
//и теперь извлеч это значение через
//ссылку serverpcPrototype1 не получится
//так как serverpcPrototype1 ссылается
//на другой объект.
resp.getWriter().write(
serverpcPrototype1.getPcid());
}
}
Компилируем Java файлики. Файл сервлета при этом компилируем с использованием jar файлов спринг:
Запускаем Tomcat и открываем страницу сервлета по пути /springservlet:
Как видим выведено было pcid только у бина синглтона. Через первую ссылку на него serverpcSingleton мы установили значение поля pcid, а через вторую ссылку serverpcSingleton1 на него вывели это значение.
В случае же с serverPCBeanpPototypeScope создавалось два бина и ссылки ссылались на разные обьекты, поэтому через ссылку serverpcPrototype1 ничего не вывести не получилось.
Теперь должно быть понятно что представляют собой скоупы. Остальные же скоупы демонстрировать не будем так как там ничего особо сложного нет.
Изучите жизненный цикл Spring-бина: создание через BeanFactory, внедрение зависимостей, вызов init/destroy методов. Практический пример с XML-конфигурацией и сервлетом.
Изучите мощь аннотации @Autowired в Spring - внедрение зависимостей без конструкторов и сеттеров. Практический гайд по автоматическому связыванию компонентов.