java - এইচপ - অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা



স্প্রিং @ Transactional বৈশিষ্ট্য একটি ব্যক্তিগত পদ্ধতিতে কাজ করে? (5)

উত্তর নেই। স্প্রিং রেফারেন্স দেখুন দয়া করে : অনুবাদক ব্যবহার করে :

@Transactional টীকাটি ইন্টারফেস সংজ্ঞা, ইন্টারফেসের একটি পদ্ধতি, একটি বর্গ সংজ্ঞা, বা একটি ক্লাসে একটি সর্বজনীন পদ্ধতির আগে স্থাপন করা যেতে পারে

https://src-bin.com

যদি আমার একটি @Transactional বিউনে একটি ব্যক্তিগত পদ্ধতিতে @ @Transactional এনটেশন থাকে, তাহলে এ্যানোটেশনটির কোন প্রভাব আছে?

@Transactional টীকা পাবলিক পদ্ধতিতে থাকলে, এটি কাজ করে এবং একটি লেনদেন খুলতে পারে।

public class Bean {
  public void doStuff() {
     doPrivateStuff();
  }
  @Transactional
  private void doPrivateStuff() {

  }
}

...

Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();

Answer #1

উত্তরটি আপনার প্রশ্ন নয় - ব্যক্তিগত পদ্ধতিগুলি টীকা দেওয়ার জন্য ব্যবহৃত হলে @Transactional কোন প্রভাব ফেলবে না। প্রক্সি জেনারেটর তাদের উপেক্ষা করবে।

এই স্প্রিং ম্যানুয়াল অধ্যায় 10.5.6 নথিভুক্ত করা হয় :

পদ্ধতি দৃশ্যমানতা এবং @Transactional

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


Answer #2

প্রশ্নটি ব্যক্তিগত বা জনসাধারণ নয়, প্রশ্ন হলঃ এটি কীভাবে প্রয়োগ করা হয় এবং আপনি কোন AOP বাস্তবায়ন ব্যবহার করেন!

আপনি যদি (ডিফল্ট) স্প্রিং প্রক্সি AOP ব্যবহার করেন, তবে স্প্রিং ( @Transational ) এর মতো সরবরাহ করা সমস্ত AOP কার্যকারিতা শুধুমাত্র প্রক্সির মাধ্যমে কল করলেই অ্যাকাউন্টে নেওয়া হবে। - সাধারণভাবে অন্য ক্ষেত্রে যদি উদ্ভিদযুক্ত পদ্ধতিটি অন্য শিম থেকে উদ্ভূত হয়।

এই দুটি প্রভাব আছে:

  • যেহেতু বেসরকারী পদ্ধতিগুলি অন্য শিম থেকে ব্যতিক্রম করা উচিত নয় (ব্যতিক্রমটি প্রতিফলন), তাদের @Transactional বিবেচনায় নেওয়া হয় না।
  • যদি পদ্ধতিটি জনসাধারণের হয় তবে এটি একই শিম থেকে উদ্ভূত হয় তবে এটি একাউন্টে নেওয়া হবে না (এই বিবৃতিটি কেবলমাত্র সঠিক হলে (ডিফল্ট) স্প্রিং প্রক্সি AOP ব্যবহার করা হয়)।

@ এস স্প্রিং রেফারেন্স: অধ্যায় 9.6 9.6 প্রক্সিং প্রক্রিয়া

আইএমএইচও আপনাকে স্পেস প্রক্সিগুলির পরিবর্তে দৃষ্টিভঙ্গি মোড ব্যবহার করতে হবে, যা সমস্যার সমাধান করবে। এবং AspectJ ট্রানজেকশনগত দিকগুলি ব্যক্তিগত পদ্ধতিগুলিতেও বোনা করা হয় (স্প্রিং 3.0 এর জন্য চেক করা হয়েছে)।


Answer #3

যদি আপনাকে কোনও লেনদেনের ভিতরে ব্যক্তিগত পদ্ধতি মোড়ানো দরকার এবং aspectj ব্যবহার করতে চান না তবে আপনি TransactionTemplate ব্যবহার করতে পারেন।

@Service
public class MyService {

    @Autowired
    private TransactionTemplate transactionTemplate;

    private void process(){
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                processInTransaction();
            }
        });

    }

    private void processInTransaction(){
        //...
    }

}

Answer #4

হ্যাঁ, ব্যক্তিগত পদ্ধতিতে @ ট্রান্সকেনজাল ব্যবহার করা সম্ভব, কিন্তু অন্যরা যেমন উল্লেখ করেছে এটি বক্সের বাইরে কাজ করবে না। আপনি AspectJ ব্যবহার করতে হবে। এটা কিভাবে কাজ করে তা বের করার জন্য আমাকে কিছু সময় লেগেছে। আমি আমার ফলাফল ভাগ হবে।

আমি লোড-টাইম বয়ন করার পরিবর্তে কম্পাইল-টাইম বয়ন ব্যবহার করতে পছন্দ করি কারণ আমি মনে করি এটি একটি সামগ্রিক উন্নত বিকল্প। এছাড়াও, আমি জাভা 8 ব্যবহার করছি তাই আপনাকে কিছু প্যারামিটার সামঞ্জস্য করতে হতে পারে।

প্রথম, aspectjrt জন্য নির্ভরতা যোগ করুন।

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.8</version>
</dependency>

তারপর আসেনজ প্লাগইনটি ম্যাগনে প্রকৃত বাইটকোড বয়ন করার জন্য যোগ করুন (এটি একটি সংক্ষিপ্ত উদাহরণ হতে পারে না)।

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.8</version>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

অবশেষে আপনার কনফিগারেশন ক্লাস এই যোগ করুন

@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)

এখন আপনি ব্যক্তিগত পদ্ধতিতে @ ট্রান্সঅ্যাকশনাল ব্যবহার করতে সক্ষম হবেন।

এই পদ্ধতিতে একটি সতর্কতা: যদি আপনি Eclipse এর মাধ্যমে অ্যাপ্লিকেশন চালান তবে অন্যথায় এটি কাজ নাও করতে পারে যদি আপনি AspectJ সম্পর্কে সচেতন হতে আপনার আইডিই কনফিগার করতে হবে। আপনি একটি সান্নিধ্য চেক হিসাবে তৈরি সরাসরি Maven বিরুদ্ধে পরীক্ষা নিশ্চিত করুন।





annotations