Внедрение сеттера с использованием конфигурации Java - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть Runnable (т.е. реализующий класс Runnable).Есть один SpringBean, где я использую этот Runnable, вызывая его Contstructor.Я хочу сделать этот Runnable Spring Bean.

Пример.

Class RunTest implements Runnable {

    Object object;

    public RunTest(Object a){
        this.object=a;
    }

    public void run() {
        //using attributes of a 
    }

}

Теперь у меня есть Spring Bean

@Named
Class TestSpringBean {

    public void someMethod(){
        Object a;
        new RunTest(a)
    }

}

Могу ли я внедрить RunTestClass внутри TestSpringBean и использовать.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Описание:

TaskExecutor - это абстракция для работы с исполнителями, представленная начиная с Spring 2.0. Интерфейс TaskExecutor от Spring можно считать идентичным java.util.concurrent.Executor интерфейс.Существует также ряд встроенных реализаций TaskExecutor, включенных в дистрибутив Spring.Прочитайте их здесь: https://docs.spring.io/spring/docs/2.5.x/reference/scheduling.html


Как:

1.Определите конфигурацию TaskExecutor для вашего приложения пружины:

@Configuration
public class MultiThreadConfig {

    @Bean
    public TaskExecutor threadPoolTaskExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(5);
        executor.setThreadNamePrefix("DEFAULT");
        executor.initialize();

        return executor;
    }

}

2.Определите, что вы работаете как Prototype

  • Убедитесь, что вы изменили Object на требуемый пользовательский тип

    @Component
    @Scope("prototype")
    public class RunTest implements Runnable {
    
        @Autowired
        ChangeObjectToYourNeed object ;
    
        public RunTest(ChangeObjectToYourNeed a) {
            this.object = a;
        } 
    
        @Override
        public void run() {
            // your code
        }
    }
    

3.Внедрите исполнителя в ваши службы для выполнения запускаемых экземпляров:

@Service
public class AsynService {

    @Autowired
    private TaskExecutor taskExecutor;

    @Autowired
    private ApplicationContext applicationContext;

    public void executeAsync() {
        RunTest runTest = applicationContext.getBean(MyThread.class);
        taskExecutor.execute(runTest);
    }

}
0 голосов
/ 20 сентября 2018

Отметьте класс RunTest как @Component, введите его экземпляр в класс TestSpringBean и завершите настройку в методе someMethod*:

@Component
class RunTest implements Runnable {
    public RunTest() {}
}

class TestSpringBean {

    @Autowired
    private RunTest runnable;

    public void someMethod() {
        ...
        runnable.set(a);
    }

}

* Обратите внимание, что выпредполагается получить уже настроенный компонент, поэтому никаких других настроек не требуется.Это единственный экземпляр, поэтому изменения здесь будут отражены и в других местах.

Другими словами, синглтоны должны оставаться без гражданства.Вот почему это простое решение следует пересмотреть, либо найдя способ получить завершенный объект, либо исключив этот объект из класса задач.

** Вы можете изменить область действия на "prototype", но Spring все равно не сможет 't предоставить полностью настроенный экземпляр.Возникает вопрос: должен ли Spring вообще управлять этим классом?

*** Как указал @lucumt, убедитесь, что класс видим для механизма сканирования компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...