কীভাবে বসন্তে স্ব-ইনস্ট্যান্টেটেড অবজেক্টে নির্ভরতা ইনজেকশন করবেন?


128

ধরা যাক আমাদের একটি ক্লাস রয়েছে:

public class MyClass {
    @Autowired private AnotherBean anotherBean;
}

তারপরে আমরা এই শ্রেণীর একটি বস্তু তৈরি করেছি (বা অন্য কোনও কাঠামো এই শ্রেণীর উদাহরণ তৈরি করেছে)।

MyClass obj = new MyClass();

এখনও নির্ভরতা ইনজেকশন করা সম্ভব? কিছুটা এইরকম:

applicationContext.injectDependencies(obj);

(আমার মনে হয় গুগল গুইসের এরকম কিছু রয়েছে)

উত্তর:


194

আপনি autowireBean()পদ্ধতিটি ব্যবহার করে এটি করতে পারেন AutowireCapableBeanFactory। আপনি এটিকে একটি স্বেচ্ছাসেবী বস্তুটি পাস করেন এবং স্প্রিং এটিকে নিজের মতো তৈরির মতো আচরণ করবে এবং বিভিন্ন অটোয়ারিং বিট এবং টুকরা প্রয়োগ করবে।

এটিকে ধরে রাখতে AutowireCapableBeanFactory, কেবল এটির মালিক করুন:

private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}

ভাল উত্তর (+1)। এছাড়াও একটি দ্বিতীয় পদ্ধতি রয়েছে যেখানে আপনি কীভাবে স্বয়ংক্রিয়তাটি ঘটে তা প্রভাবিত করতে পারেন: স্ট্যাটিক.স্প্রিংসোর্স.আর
সান প্যাট্রিক ফ্লয়েড

তবে আমার যদি দুটি অবজেক্ট থাকে এবং প্রথমটি স্বতঃশক্তি হয়। কীভাবে অটোয়ার শিম কারখানা ক্ষেত্রে নির্ভরতা নিয়ে কাজ করে?
ভাদিম কিরিলচুক

3
এটি আসলে একটি খারাপ প্যাটার্ন। আপনি যদি সত্যিই এইভাবে মাইবিয়ান ব্যবহার করেন তবে কেন কেবলমাত্র আরেকটি বিয়ানের সাথে প্যারামিটার হিসাবে কনস্ট্রাক্টর নেই। এর মতো কিছু: codeপ্রাইভেট @ অ্যাটওয়ার্ডড আরেকটি বিয়ান শিম; পাবলিক অকার্যকর doStuff () {MyBean obj = new MyBean (বিন); } code। এই সব টীকা মানুষ সত্যিই বিভ্রান্ত পেতে এবং মাত্র মৌলিক প্যাটার্ন যে দিন 1. যেহেতু :( জাভা SDK এর ছিল ব্যবহার করবেন না মতো মনে করা হয়
ডেনিস

3
আমি সম্মত হই - বসন্ত পুরো ভাষার নতুন সংজ্ঞা দিয়েছে। এখন আমরা কংক্রিট শ্রেণি হিসাবে ইন্টারফেস, শ্রেণীর দৃষ্টান্ত হিসাবে পদ্ধতি এবং সমস্ত ধরণের জটিল এবং কোডটি ভারী করার পদ্ধতি যা আপনি নতুন এবং একটি শালীন নকশায় করতেন তা করার জন্য ব্যবহার করি।
রডনি পি। বারবাতি

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

17

আপনি নিজের কনফিগারযোগ্য টীকা সহ আপনার মাই ক্লাসটি চিহ্নিত করতে পারেন:

@Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}

তারপরে সৃষ্টির সময় এটি স্বয়ংক্রিয়ভাবে তার নির্ভরতাগুলি ইনজেক্ট করবে। <context:spring-configured/>আপনার অ্যাপ্লিকেশন প্রসঙ্গে xML থাকা উচিত ।


2
গ্যালজ 66666, আমি যা করতে চাই তার জন্য আপনার পদ্ধতিটি আরও পরিষ্কার দেখাচ্ছে। তবে আমি এটি কাজ করতে পারি না। আমার কোনও এক্সএমএল ফাইল নেই এবং সম্পূর্ণ জাভা কনফিগারেশন ব্যবহার করছি। এর সমতুল্য কি আছে <context:spring-configured/>?
মাস্টারস্টয়ে

1
এটি পরিষ্কার সমাধান, তবে আরও কিছু প্রচেষ্টা দরকার: আপনার উপরের আইমুহিন দেখায় লোড-টাইম বয়নটি ব্যবহার করা উচিত বা প্রকল্পে AspectJ সংকলক যুক্ত করা উচিত। নাম হিসাবে লোড-টাইম রান-টাইমে অতিরিক্ত ব্যয় ঘটায়।
jsosnowski

4

ঠিক একই প্রয়োজনটি পেয়েছে এবং আমার ক্ষেত্রে এটি ইতিমধ্যে নন স্প্রিং ম্যানেজেবল জাভা শ্রেণীর ভিতরে যুক্তি ছিল যার অ্যাক্সেস ছিল ApplicationContext। স্ক্যাফম্যান দ্বারা অনুপ্রাণিত। এর দ্বারা সমাধান:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);

3

@ গ্লাজ 666666 উত্তরে উল্লিখিত @Configurableপদ্ধতি অনুসারে আমি আমার সমাধানটি ভাগ করতে চেয়েছিলাম কারণ এটিbriefly

  • উত্তর @skaffman দ্বারা প্রায় 10 বছর বয়সী, এবং যে ভাল যথেষ্ট নয় মানে এই নয় বা কাজ করে না
  • @ গ্লাজ 666666 এর উত্তর সংক্ষিপ্ত এবং সত্যই আমাকে আমার সমস্যা সমাধানে সহায়তা করে নি তবে, আমাকে সঠিক দিকে নির্দেশ করেছেন

আমার সেটআপ

  1. স্প্রিং বুট 2.0.3 সহ Spring Neo4j & Aop starts(যা যাইহোক অপ্রাসঙ্গিক)
  2. পদ্ধতির (ব্যবহার করে ) Spring Bootপ্রস্তুত হয়ে গেলে একটি শিম ইনস্ট্যান্ট করুন@ConfigurableApplicationRunner
  3. গ্রেডল এবং এক্সলিপস

ধাপ

এটি কাজ করার জন্য আমাকে নীচের পদক্ষেপগুলি অনুসরণ করতে হবে

  1. @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)আপনার উপরে স্থাপন করা হবে Beanযে নিজে instantiated হবে। আমার ক্ষেত্রে এটি Beanহ'ল ম্যানুয়ালি তাত্ক্ষণিকভাবে @Autowiredসেবার পরিষেবা রয়েছে, উপরের টীকাগুলির প্রপস।
  2. স্প্রিং বুটের মূলটি XXXApplicaiton.java(বা যে ফাইলটি টিকা দেওয়া হয় @SpringBootApplication) @EnableSpringConfiguredএবং এর সাথে এনটেট করুন@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. আপনার বিল্ড ফাইলের মধ্যে নির্ভরতা যুক্ত করুন (যেমন আপনি বিল্ড.gradle বা pom.xML আপনি কোনটি ব্যবহার করেন তার উপর নির্ভর করে) compile('org.springframework.boot:spring-boot-starter-aop')এবংcompile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. আপনার নতুন + আপ Beanযা যে @Configurableকোনও জায়গাতেই টিকা দেওয়া আছে এবং এর নির্ভরতাগুলি স্বতঃশক্ত হওয়া উচিত।

* উপরে # 3 পয়েন্ট সম্পর্কিত, আমি সচেতন যে org.springframework.boot:spring-boot-starter-aopট্রানজিটিভভাবে টান দেয় spring-aop(যেমনটি এখানে মেভেনসেন্ট্রাল দেখানো হয়েছে ) তবে, আমার ক্ষেত্রে গ্রহগ্রন্থটি@EnableSpringConfigured টীকাগুলি সমাধান করতে ব্যর্থ হয়েছে , কেন আমি স্পষ্টতই স্ট্রটারের সাথে যুক্ত হয়ে spring-aopনির্ভরতা যুক্ত করেছি । আপনার যদি একই সমস্যাটির মুখোমুখি হওয়া উচিত, কেবল নির্ভরতা ঘোষণা করুন বা সন্ধানের অ্যাডভেঞ্চারে যেতে পারেন

  • সংস্করণ বিরোধ আছে কি?
  • কেন org.springframework.context.annotation.aspect.*পাওয়া যায় না
  • আপনার আইডিই সঠিকভাবে সেটআপ করা হয়?
  • ইত্যাদি ইত্যাদি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.