Возможно, вы захотите заняться разработкой своего основного приложения с подключаемыми функциями на основе интерфейсов.
Например, скажем, ваше базовое приложение имеет некоторую концепцию объекта User
и нуждается в поддержке общих пользовательских задач. Создать UserStore
интерфейс;
public interface UserStore
{
public User validateUser(String username, String password) throws InvalidUserException;
public User getUser(String username);
public void addUser(User user);
public void deleteUser(User user);
public void updateUser(User user);
public List<User> listUsers();
}
Затем вы можете закодировать свое основное приложение (логику входа в систему, логику регистрации и т. Д.) В этом интерфейсе. Возможно, вы захотите обеспечить реализацию этого интерфейса по умолчанию в вашем основном приложении, например DatabaseUserStore
, которая фактически будет DAO.
Затем вы определяете UserStore
как бин Spring и внедряете его в случае необходимости;
<bean id="userStore" class="com.mycorp.auth.DatabaseUserStore">
<constructor-arg ref="usersDataSource"/>
</bean>
Это позволяет настраивать или расширять основное приложение в зависимости от потребностей конкретного клиента. Если клиент хочет интегрировать основное приложение со своим сервером Active Directory, вы пишете класс LDAPUserStore
, который реализует ваш интерфейс UserStore
с использованием LDAP. Сконфигурируйте его как Spring bean-компонент и упакуйте пользовательский класс как зависимый jar.
То, что у вас осталось, - это основное приложение, которым пользуются все, и набор пользовательских расширений, которые вы можете предоставлять и продавать отдельно; черт, вы даже можете попросить клиента написать свои собственные расширения.