spring क्या आप एक अमूर्त वर्ग के अंदर ऑटोवेयर कर सकते हैं?




abstract-class autowired (4)

मेरे मामले में, एक स्प्रिंग 4 एप्लिकेशन के अंदर, मुझे एक क्लासिक एसेसरी फैक्ट्री पैटर्न का उपयोग करना था (जिसके लिए मैंने विचार लिया था - प्रत्येक उदाहरण बनाने के लिए http://java-design-patterns.com/patterns/abstract-factory/ )। और हर बार एक ऑपरेशन किया जाना था। इसलिए मेरा कोड इस तरह डिजाइन किया जाना था:

public abstract class EO {
    @Autowired
    protected SmsNotificationService smsNotificationService;
    @Autowired
    protected SendEmailService sendEmailService;
    ...
    protected abstract void executeOperation(GenericMessage gMessage);
}

public final class OperationsExecutor {
    public enum OperationsType {
        ENROLL, CAMPAIGN
    }

    private OperationsExecutor() {
    }

    public static Object delegateOperation(OperationsType type, Object obj) 
    {
        switch(type) {
            case ENROLL:
                if (obj == null) {
                    return new EnrollOperation();
                }
                return EnrollOperation.validateRequestParams(obj);
            case CAMPAIGN:
                if (obj == null) {
                    return new CampaignOperation();
                }
                return CampaignOperation.validateRequestParams(obj);
            default:
                throw new IllegalArgumentException("OperationsType not supported.");
        }
    }
}

@Configurable(dependencyCheck = true)
public class CampaignOperation extends EO {
    @Override
    public void executeOperation(GenericMessage genericMessage) {
        LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
    }
}

प्रारंभ में सार वर्ग में निर्भरता को इंजेक्ट करने के लिए मैंने @ स्टीरियो, @ सर्विस आदि जैसे सभी स्टीरियोटाइप एनोटेशन की कोशिश की, लेकिन स्प्रिंग संदर्भ फ़ाइल में पूरे पैकेज के लिए घटक थे, लेकिन किसी तरह कैंपेनऑपरेशन, सुपर एब्सट्रैक्ट क्लास ईओ जैसे उपवर्गों के उदाहरण बनाते हुए। वसंत के रूप में इसके गुणों के लिए अशक्त होने के कारण अपनी निर्भरता को पहचानने और इंजेक्ट करने में असमर्थ था। बहुत परीक्षण और त्रुटि के बाद मैंने इसका उपयोग किया **@Configurable(dependencyCheck = true)** एनोटेशन और अंत में स्प्रिंग निर्भरता को इंजेक्ट करने में सक्षम था और मैं सक्षम था। उपक्लास में गुणों का उपयोग करके उन्हें बहुत अधिक गुणों के साथ अव्यवस्थित किए बिना।

<context:annotation-config />
<context:component-scan base-package="com.xyz" />

मैंने समाधान खोजने के लिए इन अन्य संदर्भों की भी कोशिश की:

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
  6. स्प्रिंग ढांचे के साथ अमूर्त कारखाने का उपयोग करना
  7. स्प्रिंग ऑटोवेयरिंग सार वर्गों के लिए काम नहीं कर रहा है
  8. अमूर्त सुपर क्लास में वसंत निर्भरता इंजेक्ट करें
  9. वसंत और सार वर्ग - अमूर्त वर्गों में गुण इंजेक्शन
    1. स्प्रिंग ऑटोवेयर निर्भरता एक सार वर्ग में परिभाषित की गई है

कृपया **@Configurable(dependencyCheck = true)** का उपयोग करने का प्रयास करें और इस पोस्ट को अपडेट करें, यदि आप किसी भी समस्या का सामना करते हैं तो मैं आपकी मदद करने की कोशिश कर सकता हूं।

स्प्रिंग मेरी वस्तु को विफल करने में विफल है? क्या किसी अमूर्त वर्ग के भीतर किसी वस्तु को स्वाहा करना संभव है। मान लें कि सभी स्कीमों को एप्लिकेशन-संदर्भ.एक्सएमएल में आपूर्ति की जाती है

प्रश्न: आधार और फैली हुई कक्षाओं (यदि कोई हो) @ सेवा @ कॉमपोनेंट पर क्या टिप्पणी होनी चाहिए?

उदाहरण

abstract class SuperMan {

    @Autowire
    private DatabaseService databaseService;

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

व्यापक वर्ग

public class SuperGirl extends SuperMan {

    @Override
    public void Fly() {
        //busy code
    }

    public doSomethingSuperGirlDoes() {

        //busy code

        doSuperPowerAction(thing)

    }

आवेदन-context.xml

<context:component-scan base-package="com.baseLocation" />
<context:annotation-config/>

मेरे पास उस तरह का स्प्रिंग सेटअप काम कर रहा है

एक ऑटो क्लास के साथ एक अमूर्त वर्ग

public abstract class AbstractJobRoute extends RouteBuilder {

    @Autowired
    private GlobalSettingsService settingsService;

और कई बच्चों को @Component टिप्पणी के साथ परिभाषित किया @Component


क्या होगा अगर आपको SuperGirl में किसी भी डेटाबेस ऑपरेशन की आवश्यकता है, तो आप इसे फिर से SuperGirl में इंजेक्ट करेंगे।

मुझे लगता है कि मुख्य विचार विभिन्न वर्गों में एक ही वस्तु संदर्भ का उपयोग कर रहा है। तो इस बारे में क्या:

//There is no annotation about Spring in the abstract part.
abstract class SuperMan {


    private final DatabaseService databaseService;

    public SuperMan(DatabaseService databaseService) {
     this.databaseService = databaseService;
    }

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}
@Component
public class SuperGirl extends SuperMan {

private final DatabaseService databaseService;

@Autowired
public SuperGirl (DatabaseService databaseService) {
     super(databaseService);
     this.databaseService = databaseService;
    }

@Override
public void Fly() {
    //busy code
}

public doSomethingSuperGirlDoes() {

    //busy code

    doSuperPowerAction(thing)

}

मेरी राय में, एक बार इंजेक्शन हर जगह चलाने :)


आम तौर पर, स्प्रिंग को ऑटोवेअरिंग करना चाहिए, जब तक कि आपका अमूर्त वर्ग घटक स्कैन के लिए प्रदान किए गए बेस-पैकेज में है।

इसे देखें और this आगे के संदर्भ के लिए।

@Service और @Component दोनों स्टीरियोटाइप हैं जो स्प्रिंग कंटेनर के अंदर एनोटेट प्रकार की फलियां बनाते हैं। वसंत डॉक्स राज्य के रूप में,

यह एनोटेशन @Component के एक विशेषज्ञता के रूप में कार्य करता है, कार्यान्वयन कक्षाओं के लिए क्लासपैथ स्कैनिंग के माध्यम से ऑटोडेट की अनुमति देता है।







autowired