У меня есть класс A, который создает экземпляр класса B, который в свою очередь делает то же самое для класса C и т.д., Образуя большое дерево. Теперь мне нужно создать экземпляр объекта, который должен быть доступен по всему дереву, и я не хочу, чтобы индивидуально вводить этот объект вручную во всех классах. Я не хочу использовать статический, потому что могут быть разные экземпляры класса A, выполняемые одновременно в разных потоках, и этот общий объект должен быть уникальным для каждого потока. У меня нет большого опыта работы с потокобезопасными операциями.
Используйте Spring
для управления экземпляром. Таким образом, вы можете ввести свой экземпляр в любой класс, который ему нужен, и при условии, что создание родительского класса будет управляться весной, инжектируемый компонент будет заполнен.
Более подробно, что вы можете сделать, это определить класс.
public class MyBean {
// Add your class details.
}
И убедитесь, что Spring
либо сканирует свой пакет, либо вы определили bean-компонент в файле applicationContext.xml
как это. Следующий этап - inject
этот компонент, где вам нужно, используя @Autowired
аннотацию.
@Autowired
private MyBean myBean;
И при создании этого класса myBean
будет заполнен тем же экземпляром MyBean
который был изначально создан.
преимущества
Выполнение этого способа означает, что ваше решение хорошо масштабируется. Вы можете вводить его в любом месте без постоянно меняющихся конструкторов (и когда вы создаете все больше и больше подклассов и отношений между классами, это главный кандидат на хирургию стрельбы.
Всегда полезно узнать о тех технологиях, которые используются в промышленности.
Управление одним экземпляром класса с использованием других методов (например, шаблона Singleton
) обычно является плохой идеей.
Недостатки
Дополнительное чтение
Взгляните на основной учебник по весне, чтобы вы начали.
Посмотрите на различные области, с которыми вы можете создавать бобы, в случае, если некоторые из них лучше подходят вашим потребностям.
Вам либо нужна локальная ссылка в контексте, который вы хотите использовать, либо вам нужна статическая ссылка. Поскольку вы не хотите использовать static, вам нужно получить локальную ссылку. Вы можете сделать это, передав объект в конструкторе или добавив метод setter. Затем выше дерево, где вы строите дочерний узел, который вы передаете в нужном объекте.
Например, вы можете иметь "параллельный синглтон", т.е. Вместо того, чтобы иметь только один экземпляр, он будет хранить столько же экземпляров, сколько есть потоков, в хэш-карте с объектом, связанным с потоком, являющимся ключом.