Что такое standalone приложение

Что такое standalone приложение

Standalone-приложение («Stand» и «Alone», что на русский дословно переводится как «остаться одному») — это программное обеспечение (ПО), которое не нуждается в каких-либо дополнительных программах и зависимостях для его установки и функционирования, в отличие от SaaS.

В магазинах, продающих лицензионное программное обеспечение, standalone-приложения имеют альтернативное название — коробочная версия (или коробка), ввиду того, что комплект поставки предполагает наличие сопроводительной документации, лицензию (лицензионный ключ) и сам носитель с записанной на него программой, готовой к установке.

К преимуществам таких приложений можно отнести:

  • быструю установку на рабочий компьютер (или другое устройство);
  • отсутствие необходимости запрашивать дополнительные материалы, заполнять формы покупки и т.п.;
  • анонимность (большинство коробочных версий ПО не предполагают регистрацию пользователей в каких-либо сервисах).

Недостатки:

  • требуется самостоятельная установка и настройка standalone-приложений;
  • приобрести коробочные версии можно только у официальных дилеров (в торговых точках);
  • боксовые (от англ. Box — «Коробка») версии чаще всего стоят дороже OEM (предустановленных) или Retail (розничные, продаваемые онлайн) лицензий ПО. Хотя все перечисленные типы ПО подходят под описание «Standalone».

Термин «standalone-приложение» может применяться и по отношению к программам, взаимодействующим с Интернет-сервисами, в этом случае «standalone» будет обозначать то, что для работы такого приложения нет необходимости запускать браузер или другое вспомогательное ПО. Все необходимое для взаимодействия с сервисом есть внутри программы.

Например, standalone-приложение для социальной сети «Вконтакте» будет запускаться без браузера, а токен (ключ доступа программы к сервису посредством API-интерфейса) уже встроен в исполняемый код.

Примеры:

  • Операционная система для ПК (Microsoft Windows, Linux, Mac OS) или смартфона (Android, iOS).
  • Пакет офисных программ Microsoft Office или OpenOffice. В противоположность им, Google Документы являются SaaS-продуктом, доступ к которому осуществляется через браузер.
  • Мобильное приложение Facebook. В то же время веб-сайт Facebook будет являться SaaS.

Здравствуйте.
Подскажите, пожалуйста, не очень понимаю.. метод https://new.vk.com/dev/messages.send и прочие, с помощью которых можно отправлять сообщение пользователям, можно ли подключить к своему сайту ?

Там написано, что "Данный метод доступен только Standalone-приложениям."
Что такое Standalone? Под это описание PHP сайты подходят? Или приложения вконтакте? Или расширения для браузера? Или только windows программы? Или мобильные приложения?

  • Вопрос задан более трёх лет назад
  • 25937 просмотров

Standalone в понимании вконтакта — то приложение, которое может получить из адресной строки браузера текст (а точнее — токен). Ибо токен с расширенными правами можно получить только с сервера вконтакта ( на него идёт редирект. Никаким js`ом его не вытащить, не имея доступа к браузеру )
Получить с сервера вконтакта токен с помощью скрипта пхп не получится, отсюда и урезанные права)

Можно получить точен вручную — затем вставить его в скрипт PHP и иметь равные со standalone приложениями права.

в итоге приходит 15 ошибка (no access to call this method)
Почему так?? Не пойму..

Рассмотрим базовые возможности dependency injection (внедрения зависимостей), которые открывает нам Spring.

Создадим обычный maven-проект, где в pom.xml добавим сам Spring (артефакт spring-context) и секцию build со стандартным плагином maven-compiler-plugin, в котором указываем версию java в source и target.

Теперь создадим главный класс TestApp, который будет точкой запуска приложения.

public class TestApp <

public static void main(String[] args) <
ApplicationContext context = new ClassPathXmlApplicationContext( "app-config.xml" );
MainService service = context.getBean(MainService. class );
service.doWork();
>
>

Здесь мы создаём контекст на основе конфигурационного файла Spring, который после сборки maven’ом окажется внутри jar-файла. В данном случае мы используем ClassPathXmlApplicationContext, но есть и много других реализаций. Затем из контекста получаем главный бин MainService и вызываем у него целевой метод.

Поскольку все бины мы будем конфигурировать прямо в коде при помощи аннотаций (секция annotation-config), содержимое app-config.xml будет минимальным. Мы лишь указываем базовый пакет (секция component-scan), внутри которого Spring автоматически будет искать все бины.

version= "1.0" encoding= "UTF-8" ? >
xmlns= "http://www.springframework.org/schema/beans"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context= "http://www.springframework.org/schema/context"
xsi:schemaLocation= "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd ">

:annotation-config / >
:component-scan base-package= "ru.devmark.test" / >

Теперь определим интерфейс нашего главного бина MainService. В связи с особенностями работы Spring, инициализация бина происходит быстрее, если у него есть интерфейс. Да и вообще, с точки зрения ООП всегда хорошо выделять интерфейс. Просто возьмите это за правило.

public interface MainService <

Его реализация MainServiceImpl, помеченная аннотацией @Service.

@Service
public class MainServiceImpl implements MainService <

private Handler handler;

@Autowired
public MainServiceImpl(Handler handler) <
this .handler = handler;
>

@Override
public void doWork() <
System.out.println(handler.getString());
>
>

Все spring-бины помечаются одной из четырёх аннотаций:

  1. Controller — бины, содержащие маппинг входящих http-запросов
  2. Service — бины, реализующие бизнес-логику приложения
  3. Repository — бины, работающие с БД
  4. Component — все остальные бины

Component — наиболее обобщённая аннотация и три другие являются её частными случаями. По большому счёту, разницы между ними нет и почти любой бин будет работать с любой аннотацией, но с точки зрения логики приложения лучше придерживаться такого деления.

Также обратите внимание на аннотацию @Autowired. Она указывает, что в данный конструктор в качестве аргумента нужно поместить бин с подходящим интерфейсом. В нашем примере это некий интерфейс Handler.

Сам интерфейс Handler предельно прост. В нём только один метод, который возвращает строку.

public interface Handler <

Предположим, одной из его реализаций может быть бин, возвращающий текущее время в виде строки.

@Component
public class DateHandler implements Handler <

@Override
public String getString() <
return LocalDateTime.now().toString();
>
>

Обратите внимание, что данный бин DateHandler помечен аннотацией @Component.

Хорошей практикой является создание бинов таким образом, чтобы они не имели внутреннего состояния. Например, не создавать поля класса, которые могут менять значения между вызовами методов. Зачем это нужно? Дело в том, что по умолчанию Spring создаёт каждый бин в одном экземпляре, который затем будет передан во все бины, которые в нём нуждаются. И если ваш бин будет хранить состояние, то неизвестно, как он будет себя вести, если его состояние будут одновременно менять различные компоненты.

Теперь, если вы запустите приложение, то увидите на экране текущее время.

Давайте теперь рассмотрим более интересный вариант, когда один бин от другого отличается незначительно. Например, пусть один из них возвращает всё время одну строку, а второй — другую. Создавать ещё два класса было бы излишне. Поэтому сделаем такую реализацию, в которую константное значение будем передавать при инициализации бина. И при этом НЕ будем снабжать её какой-либо аннотацией.

public class NameHandler implements Handler <

private final String name;

public NameHandler(String name) <
this .name = name;
>

@Override
public String getString() <
return name;
>
>

Теперь нам потребуется специальный конфигурационный класс с аннотацией @Configuration, который позволяет более гибко инициализировать бины.

@Configuration
public class AppConfiguration <

@Bean
public Handler firstNameHandler() <
return new NameHandler( "Alice" );
>

@Bean
public Handler secondNameHandler() <
return new NameHandler( "Bob" );
>
>

Здесь всё просто: один метод с аннотацией @Bean — один бин. В конструктор мы передаём ему константу. В итоге Spring создаст два бина, один из который всё время будет возвращать «Alice», а другой — «Bob».

Теперь для вызова новых обработчиков нам нужно внедрить их в наш сервис MainServiceImpl. Можно конечно прописать ещё два поля, но и тут Spring облегчает нам задачу. Достаточно создать одно поле, представляющее из себя коллекцию List из интерфейсов Handler, в которую Spring автоматически добавит ВСЕ бины, имеющие этот интерфейс. Вот ещё одна причина, по которой удобно использовать интерфейсы.

Наш сервис примет такой вид:

@Service
public class MainServiceImpl implements MainService <

private List handlers;

@Autowired
public MainServiceImpl(List handlers) <
this .handlers = handlers;
>

@Override
public void doWork() <
handlers.forEach(h -> System.out.println(h.getString()));
>
>

В итоге в нашей коллекции обработчиков будет ровно три бина (DateHandler и два экземпляра NameHandler).

Для отображения значения каждого из них воспользуемся Stream API из Java 8, что равносильно обычному циклу foreach и вызову метода getString() у каждого из элементов.

Ссылка на основную публикацию
Что означает ошибка 110
Ошибка 110 в Android происходит главным образом при обновлении или установке приложений из Google Play. Случается это из-за несовместимости ОС:...
Что выбрать windows 7 или windows 10
Сегодня в нашем блоге «Чо?! Чо?!» я раскрою все преимущества и недостатки новой операционной системы для ноутбуков, сравнив ее с...
Что в китае дешевле чем в россии
Я экономлю тысячи рублей, покупая товары из Китая через интернет Сегодня я расскажу Вам о том, что выгодно покупать в...
Что означает ошибка 963
Ошибки в Google Play дело достаточно частое, это не удивительно, ведь Плей маркет – это один из крупнейших магазинов приложений....