Попробуйте добавить
<context:annotation-config/>
в ваш конфигурационный файл Spring.
Мне нравится это:
var yourNamespace = {
foo: function() {
},
bar: function() {
}
};
...
yourNamespace.foo();
JavaScript doesn’t поддерживает пространство имен по умолчанию. Таким образом, при создании какого-либо элемента (функция, метод, объект, переменная) затем, это становится глобальным, и загрязните глобальное пространство имен. Давайте возьмем пример определения двух функций без любого пространства имен,
function func1() {
console.log("This is a first definition");
}
function func1() {
console.log("This is a second definition");
}
func1(); // This is a second definition
Это всегда называет второе функциональное определение. В этом случае пространство имен решит проблему коллизии имени.
Я использую такой подход:
var myNamespace = {}
myNamespace._construct = function()
{
var staticVariable = "This is available to all functions created here"
function MyClass()
{
// Depending on the class, we may build all the classes here
this.publicMethod = function()
{
//Do stuff
}
}
// Alternatively, we may use a prototype.
MyClass.prototype.altPublicMethod = function()
{
//Do stuff
}
function privateStuff()
{
}
function publicStuff()
{
// Code that may call other public and private functions
}
// List of things to place publically
this.publicStuff = publicStuff
this.MyClass = MyClass
}
myNamespace._construct()
// The following may or may not be in another file
myNamespace.subName = {}
myNamespace.subName._construct = function()
{
// Build namespace
}
myNamespace.subName._construct()
Внешний код может быть таким:
var myClass = new myNamespace.MyClass();
var myOtherClass = new myNamepace.subName.SomeOtherClass();
myNamespace.subName.publicOtherStuff(someParameter);
Другой способ сделать это, который я считаю немного менее ограничивающим, чем буквальная форма объекта, заключается в следующем:
var ns = new function() {
var internalFunction = function() {
};
this.publicFunction = function() {
};
};
Вышеупомянутое во многом похоже на модуль и , нравится вам это или нет , он позволяет вам сделать все ваши функции общедоступными, избегая при этом жесткой структуры литерала объекта.
После переноса нескольких моих библиотек в разные проекты и необходимости постоянно менять пространство имен верхнего уровня (со статическим именем), я переключился на использование этого небольшая (с открытым исходным кодом) вспомогательная функция для определения пространств имен.
global_namespace.Define('startpad.base', function(ns) {
var Other = ns.Import('startpad.other');
....
});
Описание преимуществ можно найти в моем сообщении в блоге . Вы можете скачать исходный код здесь .
Одно из преимуществ, которое мне действительно нравится, - это изоляция модулей в отношении порядка загрузки. Вы можете обратиться к внешнему модулю ДО того, как он будет загружен. И полученная вами ссылка на объект будет заполнена, когда код станет доступен.
Есть ли более элегантный или лаконичный способ сделать это?
Да. Например:
var your_namespace = your_namespace || {};
тогда вы можете иметь
var your_namespace = your_namespace || {};
your_namespace.Foo = {toAlert:'test'};
your_namespace.Bar = function(arg)
{
alert(arg);
};
with(your_namespace)
{
Bar(Foo.toAlert);
}
Я создал пространство имен , вдохновленное модулями Erlang. Это очень функциональный подход, но именно так я сейчас пишу свой код JavaScript.
Он дает замыканию глобальное пространство имен и предоставляет определенный набор функций внутри этого замыкания.
(function(){
namespace("images", previous, next);
// ^^ This creates or finds a root object, images, and binds the two functions to it.
// It works even though those functions are not yet defined.
function previous(){ ... }
function next(){ ... }
function find(){ ... } // A private function
})();
Это продолжение ссылки пользователя 106826 на Namespace.js. Похоже, проект переехал на GitHub. Теперь это smith/namespacedotjs.
Я использовал этот простой помощник JavaScript для своего крошечного проекта, и пока он кажется легким, но достаточно универсальным, чтобы управлять пространством имен и загрузкой модулей/классов. Было бы здорово, если бы это позволило мне импортировать пакет в пространство имен по моему выбору, а не только в глобальное пространство имен... вздох, но это не главное.
Это позволяет вам объявить пространство имен, а затем определить объекты/модули в этом пространстве имен:
Namespace('my.awesome.package');
my.awesome.package.WildClass = {};
Другой вариант — объявить пространство имен и его содержимое одновременно:
Namespace('my.awesome.package', {
SuperDuperClass: {
saveTheDay: function() {
alert('You are welcome.');
}
}
});
Дополнительные примеры использования см. в файле example.js. в источнике .