স্প্রিং জাভা কনফিগারেশন: রানটাইম আর্গুমেন্ট সহ আপনি কীভাবে একটি প্রোটোটাইপ-স্কোপড @ বিয়ান তৈরি করবেন?


134

স্প্রিংয়ের জাভা কনফিগারেশন ব্যবহার করে, আমার কনস্ট্রাক্টর আর্গুমেন্টের সাথে একটি প্রোটোটাইপ-স্কোপড শিম অর্জন / ইনস্ট্যান্ট করা দরকার যা কেবল রানটাইম এ পাওয়া যায়। নিম্নলিখিত কোড উদাহরণ বিবেচনা করুন (সংক্ষিপ্তকরণের জন্য সরলীকৃত):

@Autowired
private ApplicationContext appCtx;

public void onRequest(Request request) {
    //request is already validated
    String name = request.getParameter("name");
    Thing thing = appCtx.getBean(Thing.class, name);

    //System.out.println(thing.getName()); //prints name
}

থিং ক্লাস যেখানে নীচে সংজ্ঞায়িত হয়েছে:

public class Thing {

    private final String name;

    @Autowired
    private SomeComponent someComponent;

    @Autowired
    private AnotherComponent anotherComponent;

    public Thing(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

নোটিশটি nameহ'ল final: এটি কেবলমাত্র একজন নির্মাণকারীর মাধ্যমে সরবরাহ করা যেতে পারে এবং এটি অপরিবর্তনীয়তার গ্যারান্টি দেয়। অন্যান্য নির্ভরতাগুলি Thingশ্রেণীর বাস্তবায়ন-নির্দিষ্ট নির্ভরতা , এবং অনুরোধ হ্যান্ডলার বাস্তবায়নের জন্য (দৃ tight়ভাবে একত্রে) পরিচিত হওয়া উচিত নয়।

এই কোডটি স্প্রিং এক্সএমএল কনফিগারেশনের সাথে পুরোপুরি ভালভাবে কাজ করে, উদাহরণস্বরূপ:

<bean id="thing", class="com.whatever.Thing" scope="prototype">
    <!-- other post-instantiation properties omitted -->
</bean>

আমি জাভা কনফিগারেশনের মাধ্যমে কীভাবে একই জিনিস অর্জন করব? নিম্নলিখিত স্প্রিং 3.x ব্যবহার করে কাজ করে না:

@Bean
@Scope("prototype")
public Thing thing(String name) {
    return new Thing(name);
}

এখন, আমি একটি কারখানা তৈরি করতে পারি , যেমন:

public interface ThingFactory {
    public Thing createThing(String name);
}

তবে এটি সার্ভিস লোকেটার এবং কারখানার নকশা প্যাটার্ন প্রতিস্থাপনের জন্য স্প্রিং ব্যবহারের পুরো পয়েন্টকে পরাস্ত করে , যা এই ব্যবহারের ক্ষেত্রে আদর্শ হবে।

যদি স্প্রিং জাভা কনফিগারেশন এটি করতে পারে তবে আমি এড়াতে সক্ষম হব:

  • একটি কারখানা ইন্টারফেস সংজ্ঞায়িত
  • একটি কারখানা বাস্তবায়ন সংজ্ঞায়িত
  • কারখানা বাস্তবায়নের জন্য লেখার পরীক্ষা

এতটা তুচ্ছ জিনিসের জন্য এটি একটি টন কাজ (তুলনামূলকভাবে কথা বলা) যা এক্সএমএল কনফিগারেশনের মাধ্যমে স্প্রিং ইতিমধ্যে সমর্থন করে।


15
দুর্দান্ত প্রশ্ন।
সোতিরিওস ডেলিমনলিস

যাইহোক, এমন কোনও কারণ আছে যা আপনি নিজে ক্লাসটি নিজেই ইনস্ট্যান্ট করতে পারবেন না এবং এটি স্প্রিং থেকে পান? এটি অন্যান্য মটরশুটি উপর নির্ভরতা আছে?
সোটিরিওস ডেলিমনোলিস

@ সোরিরিওসডেলিমনোলিস হ্যাঁ, Thingবাস্তবায়নটি আসলে আরও জটিল এবং অন্যান্য মটরশুটিগুলির উপর নির্ভরতা রয়েছে (আমি কেবল তাদের বংশবৃদ্ধির জন্য বাদ দিয়েছি)। যেমন, আমি অনুরোধ হ্যান্ডলার বাস্তবায়নটি তাদের সম্পর্কে জানতে চাই না, কারণ এটি হ্যান্ডলারকে API / মটরশুটিগুলির প্রয়োজন হয় না এমনভাবে দৃ couple়ভাবে জোড়া দেয়। আপনার (দুর্দান্ত) প্রশ্নটি প্রতিবিম্বিত করতে আমি প্রশ্নটি আপডেট করব।
লেস হ্যাজলউড

স্প্রিং কোনও কনস্ট্রাক্টরকে এটি অনুমতি দেয় কিনা তা আমি নিশ্চিত নই, তবে আমি জানি যে আপনি @Qualifierসেটারের সাথে একটি সেটারে পরামিতিগুলি রাখতে পারেন @Autowired
কোডচিম্প

2
বসন্ত 4 এ, @Beanকাজের সাথে আপনার উদাহরণ । @Beanপদ্ধতি উপযুক্ত আর্গুমেন্ট আপনি প্রেরণ সাথে ডাকা পরার getBean(..)
সোতিরিওস ডেলিমনোলিস

উত্তর:


94

একটি @Configurationক্লাসে, @Beanযেমন একটি পদ্ধতি

@Bean
@Scope("prototype")
public Thing thing(String name) {
    return new Thing(name);
}

শিম সংজ্ঞা নিবন্ধন করতে এবং শিম তৈরির জন্য কারখানা সরবরাহ করতে ব্যবহৃত হয় । যে শিমটি এটি সংজ্ঞায়িত করে কেবল তা যুক্তিগুলি ব্যবহারের মাধ্যমে অনুরোধের ভিত্তিতে সরাসরি বা স্ক্যানের মাধ্যমে নির্ধারিত হয় ApplicationContext

prototypeশিমের ক্ষেত্রে, প্রতিবার একটি নতুন অবজেক্ট তৈরি হয় এবং তাই সম্পর্কিত @Beanপদ্ধতিটিও কার্যকর করা হয়।

আপনি ApplicationContextএর BeanFactory#getBean(String name, Object... args)পদ্ধতি অনুসারে একটি শিম পুনরুদ্ধার করতে পারেন

সিম সংজ্ঞাতে নির্দিষ্ট ডিফল্ট আর্গুমেন্টগুলি (যদি থাকে) ওভাররাইড করে সুস্পষ্ট নির্মাতা আর্গুমেন্ট / ফ্যাক্টরি পদ্ধতি আর্গুমেন্ট নির্দিষ্ট করার অনুমতি দেয়।

পরামিতি:

args আর্গুমেন্ট প্রোটোটাইপ একটি স্ট্যাটিক কারখানা পদ্ধতি স্পষ্ট আর্গুমেন্ট ব্যবহার তৈরি করে ব্যবহার করতে। অন্য কোনও ক্ষেত্রে নন-নাল আরগস মানটি ব্যবহার করা অবৈধ।

অন্য কথায়, এই prototypeস্কোপযুক্ত শিমের জন্য, আপনি যুক্তিগুলি সরবরাহ করছেন যা সিম বর্গের @Beanনির্মাত্রে নয়, তবে পদ্ধতিটি অনুরোধে ব্যবহৃত হবে।

এটি স্প্রিং সংস্করণ 4+ এর জন্য অন্তত সত্য।


12
এই পদ্ধতির সাথে আমার সমস্যা হ'ল আপনি @Beanপদ্ধতিটিকে ম্যানুয়াল আহ্বানে সীমাবদ্ধ করতে পারবেন না । আপনি যদি কখনও @Autowire Thingএই @Beanপদ্ধতিটিকে প্যারামিটারটি ইনজেকশনে অক্ষম হওয়ার কারণে ডাইটিং বলে ডাকা হবে। আপনি যদি একই @Autowire List<Thing>। আমি এটি কিছুটা নাজুক পেয়েছি।
জান জাইকা

@ জাঞ্জাইকা, এই উত্তরগুলির মধ্যে বর্ণিত রূপটি বাদ দিয়ে আমি অন্য কোনও বিষয়কে স্বতঃশক্ত করার কোনও উপায় আছে (যা আপনি যদি বাদ দেন তবে মূলত একই রকম) are আরও সুনির্দিষ্টভাবে, যদি আমি আর্গুমেন্টগুলি সামনে জানি (সংকলন / কনফিগারেশনের সময়), এমন কোনও উপায় আছে যা আমি এই জাতীয় যুক্তিগুলি কিছু টীকাতে প্রকাশ করতে পারি যার @Autowireসাথে আমি যোগ্যতা অর্জন করতে পারি ?
এম প্রখোরভ

52

স্প্রিং> 4.0 এবং জাভা 8 এর সাহায্যে আপনি নিরাপদে আরও বেশি টাইপ করতে পারেন:

@Configuration    
public class ServiceConfig {

    @Bean
    public Function<String, Thing> thingFactory() {
        return name -> thing(name); // or this::thing
    } 

    @Bean
    @Scope(value = "prototype")
    public Thing thing(String name) {
       return new Thing(name);
    }

}

ব্যবহার:

@Autowired
private Function<String, Thing> thingFactory;

public void onRequest(Request request) {
    //request is already validated
    String name = request.getParameter("name");
    Thing thing = thingFactory.apply(name);

    // ...
}

সুতরাং এখন আপনি রানটাইমে আপনার সিম পেতে পারেন। এটি অবশ্যই একটি কারখানার নিদর্শন, তবে আপনি নির্দিষ্ট শ্রেণীর লেখার জন্য কিছুটা সময় সাশ্রয় করতে পারেন ThingFactory(তবে আপনাকে @FunctionalInterfaceদুটি প্যারামিটারের বেশি পাস করার জন্য কাস্টম লিখতে হবে )।


1
আমি এই পদ্ধতির খুব দরকারী এবং পরিষ্কার মনে। ধন্যবাদ!
অ্যালেক্স ওবজিলিয়ান

1
কি একটি ফ্যাব্রিক? আমি আপনার ব্যবহারটি বুঝতে পারি .. তবে পরিভাষাটি নয় .. এমন ভাববেন না যে আমি "ফ্যাব্রিক প্যাটার্ন" শুনেছি
অ্যান্থনি জে ক্লিঙ্ক

1
@ অ্যান্টনিজেইলিংক আমার ধারণা আমি খারাপের fabricপরিবর্তে সবেমাত্র ব্যবহার factoryকরেছি :)
রোমান গোলিশেভ

1
@ অভিজিৎসর ওহ, আমি দেখছি। কিন্তু আপনি একটি Providerবা একটি একটি পরামিতি পাস করতে পারবেন না ObjectFactory, বা আমি ভুল? এবং আমার উদাহরণে আপনি এটিতে স্ট্রিং প্যারামিটারটি (বা কোনও পরামিতি) পাস করতে পারেন
রোমান গোলিশেভ

2
আপনি এড়িয়ে যেতে পারেন আপনি চাই না (অথবা প্রয়োজন হবে না) ব্যবহারের স্প্রিং শিম জীবনচক্র পদ্ধতি (যা প্রোটোটাইপ মটরশুটি জন্য ভিন্ন ...) যদি @Beanএবং Scopeউপর টীকা Thing thingপদ্ধতি। তবুও এই পদ্ধতিটি নিজেকে আড়াল করার জন্য ব্যক্তিগত করা যেতে পারে এবং কেবলমাত্র কারখানাটি রেখে দেওয়া হয়।
m52509791

17

স্প্রিংস ৪.৩ থেকে, এটি করার নতুন উপায় রয়েছে, যা এই সমস্যার জন্য সেলাই করা হয়েছিল।

অবজেক্টপ্রোভাইডার - এটি আপনাকে কেবল আপনার " তর্কযুক্ত " প্রোটোটাইপ স্কোপড শিমের নির্ভরতা হিসাবে যুক্ত করতে এবং যুক্তিটি ব্যবহার করে এটি ইনস্ট্যান্ট করতে সক্ষম করে।

এটি কীভাবে ব্যবহার করবেন তার একটি সাধারণ উদাহরণ এখানে:

@Configuration
public class MyConf {
    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public MyPrototype createPrototype(String arg) {
        return new MyPrototype(arg);
    }
}

public class MyPrototype {
    private String arg;

    public MyPrototype(String arg) {
        this.arg = arg;
    }

    public void action() {
        System.out.println(arg);
    }
}


@Component
public class UsingMyPrototype {
    private ObjectProvider<MyPrototype> myPrototypeProvider;

    @Autowired
    public UsingMyPrototype(ObjectProvider<MyPrototype> myPrototypeProvider) {
        this.myPrototypeProvider = myPrototypeProvider;
    }

    public void usePrototype() {
        final MyPrototype myPrototype = myPrototypeProvider.getObject("hello");
        myPrototype.action();
    }
}

এটি অবশ্যই প্রোটোটাইপ কল করার সময় হ্যালো স্ট্রিং প্রিন্ট করবে।


15

মন্তব্য প্রতি আপডেট

প্রথমত, আমি নিশ্চিত নই যে আপনি বসন্ত 3.x এ ঠিকঠাক কাজ করে এমন কোনও কিছুর জন্য "এটি কাজ করে না" বলে কেন say আমি সন্দেহ করি আপনার কনফিগারেশনে কোথাও কিছু ভুল হতে হবে।

এইটা কাজ করে:

- কনফিগারেশন ফাইল:

@Configuration
public class ServiceConfig {
    // only here to demo execution order
    private int count = 1;

    @Bean
    @Scope(value = "prototype")
    public TransferService myFirstService(String param) {
       System.out.println("value of count:" + count++);
       return new TransferServiceImpl(aSingletonBean(), param);
    }

    @Bean
    public AccountRepository aSingletonBean() {
        System.out.println("value of count:" + count++);
        return new InMemoryAccountRepository();
    }
}

- কার্যকর করার জন্য টেস্ট ফাইল:

@Test
public void prototypeTest() {
    // create the spring container using the ServiceConfig @Configuration class
    ApplicationContext ctx = new AnnotationConfigApplicationContext(ServiceConfig.class);
    Object singleton = ctx.getBean("aSingletonBean");
    System.out.println(singleton.toString());
    singleton = ctx.getBean("aSingletonBean");
    System.out.println(singleton.toString());
    TransferService transferService = ctx.getBean("myFirstService", "simulated Dynamic Parameter One");
    System.out.println(transferService.toString());
    transferService = ctx.getBean("myFirstService", "simulated Dynamic Parameter Two");
    System.out.println(transferService.toString());
}

স্প্রিং 3.2.8 এবং জাভা 7 ব্যবহার করে এই আউটপুট দেয়:

value of count:1
com.spring3demo.account.repository.InMemoryAccountRepository@4da8692d
com.spring3demo.account.repository.InMemoryAccountRepository@4da8692d
value of count:2
Using name value of: simulated Dynamic Parameter One
com.spring3demo.account.service.TransferServiceImpl@634d6f2c
value of count:3
Using name value of: simulated Dynamic Parameter Two
com.spring3demo.account.service.TransferServiceImpl@70bde4a2

সুতরাং 'একক' বিন দু'বার অনুরোধ করা হয়েছে। তবে আমরা যেমনটি প্রত্যাশা করব, বসন্ত এটি একবারে তৈরি করে। দ্বিতীয়বার এটি দেখে যে এটিতে শিমটি রয়েছে এবং কেবল বিদ্যমান বস্তুটি ফিরিয়ে দেয়। কনস্ট্রাক্টর (@ বিয়ান পদ্ধতি) দ্বিতীয়বার অনুরোধ করা হয়নি। এর প্রসঙ্গে, যখন একই প্রসঙ্গের অবজেক্ট থেকে 'প্রোটোটাইপ' বিনকে দু'বার অনুরোধ করা হয় তখন আমরা দেখতে পাই যে আউটপুটে রেফারেন্স পরিবর্তন হয় এবং কনস্ট্রাক্টর (@ বিয়ান পদ্ধতি) দু'বার অনুরোধ করা হয়।

তাহলে প্রশ্নটি হল কীভাবে প্রোটোটাইপে একটি সিঙ্গলটন ইনজেক্ট করা যায়। উপরের কনফিগারেশন ক্লাসে দেখায় যে কীভাবে এটি করা যায়! আপনার এই জাতীয় সমস্ত রেফারেন্স কনস্ট্রাক্টরের কাছে পাস করা উচিত। এটি তৈরি শ্রেণিকে খাঁটি POJO হিসাবে পাশাপাশি সংযুক্ত রেফারেন্স অবজেক্টগুলিকে যেমন হওয়া উচিত তা পরিবর্তনযোগ্য করে তুলবে। সুতরাং স্থানান্তর পরিষেবাটি এর মতো দেখতে পারে:

public class TransferServiceImpl implements TransferService {

    private final String name;

    private final AccountRepository accountRepository;

    public TransferServiceImpl(AccountRepository accountRepository, String name) {
        this.name = name;
        // system out here is only because this is a dumb test usage
        System.out.println("Using name value of: " + this.name);

        this.accountRepository = accountRepository;
    }
    ....
}

আপনি ইউনিট টেস্টগুলি লিখলে আপনি সর্বদা @ খুশী হবেন আপনি সমস্ত @ অটোভায়ার্ড ছাড়াই ক্লাসগুলি তৈরি করেছেন। আপনার যদি অটোয়ার্ডেড উপাদানগুলির প্রয়োজন হয় তবে সেগুলি স্থানীয় জাভা কনফিগারেশন ফাইলগুলিতে রাখুন।

এটি বিন ফ্যাক্টরিতে নীচের পদ্ধতিটিকে কল করবে। আপনার সঠিক ব্যবহারের ক্ষেত্রে এটি কীভাবে তৈরি হয়েছে তা বিবরণে নোট করুন।

/**
 * Return an instance, which may be shared or independent, of the specified bean.
 * <p>Allows for specifying explicit constructor arguments / factory method arguments,
 * overriding the specified default arguments (if any) in the bean definition.
 * @param name the name of the bean to retrieve
 * @param args arguments to use if creating a prototype using explicit arguments to a
 * static factory method. It is invalid to use a non-null args value in any other case.
 * @return an instance of the bean
 * @throws NoSuchBeanDefinitionException if there is no such bean definition
 * @throws BeanDefinitionStoreException if arguments have been given but
 * the affected bean isn't a prototype
 * @throws BeansException if the bean could not be created
 * @since 2.5
 */
Object getBean(String name, Object... args) throws BeansException;

3
উত্তরের জন্য ধন্যবাদ! তবে আমি মনে করি আপনি প্রশ্নটি ভুল বুঝেছেন। প্রশ্নের সর্বাধিক গুরুত্বপূর্ণ অংশটি হ'ল প্রোটোটাইপ অর্জনের (ইনস্ট্যান্টিয়েটিং) করার সময় একটি রানটাইম মানটি কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে সরবরাহ করতে হবে।
লেস হ্যাজলউড

আমি আমার উত্তর আপডেট। আসলে মনে হয়েছিল রানটাইম মানটি হ্যান্ডলিংয়ের কাজটি সঠিকভাবে হয়েছিল তাই আমি সেই অংশটি ছাড়ি। এটি প্রোগ্রাম থেকে আপডেট এবং আউটপুট থেকে আপনি দেখতে পাচ্ছেন তবে এটি স্পষ্টভাবে সমর্থিত।
জোজি

0

আপনি কেবলমাত্র একটি অভ্যন্তর শ্রেণীর ব্যবহার করে অনুরূপ প্রভাব অর্জন করতে পারেন :

@Component
class ThingFactory {
    private final SomeBean someBean;

    ThingFactory(SomeBean someBean) {
        this.someBean = someBean;
    }

    Thing getInstance(String name) {
        return new Thing(name);
    }

    class Thing {
        private final String name;

        Thing(String name) {
            this.name = name;
        }

        void foo() {
            System.out.format("My name is %s and I can " +
                    "access bean from outer class %s", name, someBean);
        }
    }
}

0

আপনার মটরশুটি এক্সএমএল ফাইলটিতে স্ক্রিপ্ট = "প্রোটোটাইপ" বৈশিষ্ট্যটি ব্যবহার করুন


-1

কিছুটা ভিন্ন পদ্ধতির সাথে দেরীতে উত্তর। এটি সাম্প্রতিক এই প্রশ্নের একটি ফলোআপ যা এই প্রশ্নটি নিজেই বোঝায়।

হ্যাঁ, যেমনটি বলা হয়েছিল যে আপনি প্রোটোটাইপ শিমটি ঘোষণা করতে পারেন যা একটি @Configurationক্লাসে এমন একটি প্যারামিটার গ্রহণ করে যা প্রতিটি ইনজেকশনে একটি নতুন শিম তৈরি করতে দেয়।
এটি এই @Configuration শ্রেণিকে একটি কারখানায় পরিণত করবে এবং এই কারখানাকে খুব বেশি দায়িত্ব না দেওয়ার জন্য, এটিতে অন্য মটরশুটি অন্তর্ভুক্ত করা উচিত নয়।

@Configuration    
public class ServiceFactory {

    @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Thing thing(String name) {
       return new Thing(name);
   }

}

তবে আপনি যে কনফিগারেশন শিমটি তৈরি করতে পারেন সেগুলিও তৈরি করতে পারেন Thing:

@Autowired
private ServiceFactory serviceFactory;

public void onRequest(Request request) {
    //request is already validated
    String name = request.getParameter("name");
    Thing thing = serviceFactory.thing(name); // create a new bean at each invocation
    // ...    
}

এটি উভয় প্রকারের নিরাপদ এবং সংক্ষিপ্ত।


1
উত্তরের জন্য ধন্যবাদ, তবে এটি একটি স্প্রিং অ্যান্টি-প্যাটার্ন। কনফিগার বস্তুর অ্যাপ্লিকেশন কোডে 'ফাঁস' হওয়া উচিত নয় - তারা স্প্রিং কনস্ট্রাক্টসের সাথে আপনার অ্যাপ্লিকেশন অবজেক্ট গ্রাফ এবং ইন্টারফেসটি কনফিগার করতে উপস্থিত রয়েছে to এটি আপনার অ্যাপ্লিকেশন মটরশুটি (যেমন অন্য একটি কনফিগারেশন প্রক্রিয়া) এর এক্সএমএল ক্লাসগুলির অনুরূপ। এটি হ'ল, যদি স্প্রিংয়ের সাথে অন্য কনফিগারেশন প্রক্রিয়াটি আসে, আপনার অ্যাপ্লিকেশন কোডটি রিফ্যাক্ট করতে হবে - একটি স্পষ্ট সূচক যা উদ্বেগের বিচ্ছেদ লঙ্ঘন করে। আপনার কনফিগারেশনটি কারখানার / ফাংশন ইন্টারফেসের উদাহরণ তৈরি করা এবং কারখানায় ইনজেকশন করা ভাল - কনফিগার করার জন্য কোনও সংকোচিত সংযুক্তি নেই।
লেস হ্যাজলউড

1) আমি সম্পূর্ণরূপে একমত যে সাধারণ ক্ষেত্রে কনফিগারেশন অবজেক্টগুলিকে ক্ষেত্র হিসাবে ফাঁস করতে হবে না। তবে এই নির্দিষ্ট ক্ষেত্রে, একটি কনফিগারেশন অবজেক্ট ইনজেক্ট করা যা প্রোটোটাইপ শিম উত্পাদন করতে এক এবং কেবল একটি শিমের সংজ্ঞা দেয়, আইএইচএমও এটি পুরোপুরি অর্থপূর্ণ: এই কনফিগারেশন ক্লাসটি একটি কারখানায় পরিণত হয়। উদ্বেগের বিষয়টি পৃথক করে যদি এটি কেবল তৈরি করে? ...
ডেভিডএক্সএক্সএক্সএক্স

... 2) "এর অর্থ, যদি স্প্রিং অন্য কনফিগারেশন পদ্ধতির সাথে আসে,", এটি একটি ভুল যুক্তি কারণ আপনি যখন আপনার অ্যাপ্লিকেশনটিতে কোনও কাঠামো ব্যবহার করার সিদ্ধান্ত নেন, আপনি সেই সাথে আপনার অ্যাপ্লিকেশনটি জুটি করেন। সুতরাং যে কোনও ক্ষেত্রে, আপনাকে যে কোনও বসন্ত অ্যাপ্লিকেশনগুলিও রিফ্যাক্টর করতে হবে যা @Configurationযদি সেই প্রক্রিয়াটি পরিবর্তিত হয় তবে নির্ভর করে ।
ডেভিডএক্সএক্সএক্সএক্স

1
... 3) আপনি যে উত্তরটি গ্রহণ করেছেন সেগুলি ব্যবহারের প্রস্তাব দেয় BeanFactory#getBean()। তবে এটি মিলনের ক্ষেত্রে আরও খারাপ যেহেতু এটি এমন একটি কারখানা যা আবেদনের কোনও মটরশুটি পেতে / ইনস্ট্যান্ট করতে দেয় এবং কেবল বর্তমান শিমের প্রয়োজন হয় না needs এ জাতীয় ব্যবহারের ফলে আপনি খুব সহজেই আপনার শ্রেণীর দায়িত্ব মিশ্রিত করতে পারেন যেহেতু এটি নির্ভরযোগ্যতা যে এটি আনতে পারে তা সীমাহীন, যা সত্যিই পরামর্শ দেওয়া হয়নি তবে ব্যতিক্রমী ক্ষেত্রে।
ডেভিডএক্সএক্সএক্সএক্স

@ ডেভিডএক্সএক্সএক্স - জেডিকে 8 এবং স্প্রিং 4 এর ডি-ফ্যাক্টো হওয়ার আগে আমি বছর কয়েক আগে উত্তরটি গ্রহণ করেছিলাম। আধুনিক স্প্রিং ব্যবহারের জন্য উপরের রোমের উত্তর আরও সঠিক। আপনার বক্তব্যটির সাথে "কারণ আপনি যখন নিজের আবেদনের মধ্যে একটি কাঠামো ব্যবহার করার সিদ্ধান্ত নেবেন, তখন আপনি সেই সাথে আপনার অ্যাপ্লিকেশনটির জুটি তৈরি করুন" স্প্রিং টিমের প্রস্তাবনা এবং জাভা কনফিগারেশনের সেরা অনুশীলনের পক্ষে যথেষ্ট বিরোধী - জোশ লং বা জেরজেন হোলারকে জিজ্ঞাসা করুন আপনি যদি কোনও পান তবে তাদের সাথে ব্যক্তিগতভাবে কথা বলার সুযোগ (আমার কাছে রয়েছে এবং আমি আপনাকে আশ্বাস দিতে পারি যে তারা যখনই সম্ভব স্প্রিংয়ে আপনার অ্যাপ কোডটি জোড়া না দেওয়ার পরামর্শ দেয় )। চিয়ার্স।
লেস হ্যাজলউড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.