0Pricing
Java Academy · บทเรียน

การเชื่อมโยง Bean: @Component, @Service, @Repository

ใช้คำอธิบายประเภท stereotype กำหนด bean ด้วย @Bean และทำความเข้าใจการสแกนคอมโพเนนต์

การเชื่อมโยง Bean: @Component, @Service, @Repository เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คำอธิบายประกอบบ่งประเภท

Spring มีคำอธิบายประกอบบ่งประเภทที่ใช้ระบุคลาสให้เป็นบีนที่ Spring จัดการ และสื่อถึงบทบาทของคลาสนั้น ได้แก่ @Component (ทั่วไป), @Service (ตรรกะทางธุรกิจ), @Repository (การเข้าถึงข้อมูล) และ @Controller/@RestController (ชั้นเว็บ)

@Component: บีนทั่วไป

คลาสใดก็ตามที่มีคำอธิบายประกอบ @Component จะถูกตรวจพบระหว่างการสแกนคอมโพเนนต์และลงทะเบียนเป็นบีนของ Spring โดยอัตโนมัติ คำอธิบายประกอบนี้เป็นพื้นฐานของคำอธิบายประกอบบ่งประเภทอื่นทั้งหมด

@Component
public class EmailFormatter {
    public String format(String to, String subject) {
        return "To: " + to + "\nSubject: " + subject;
    }
}

@Service: ชั้นตรรกะทางธุรกิจ

@Service เป็นรูปแบบเฉพาะของ @Component ที่สื่อในเชิงความหมายว่าคลาสนั้นเป็นคลาสบริการ Spring ปฏิบัติต่อทั้งสองแบบเหมือนกัน แต่ @Service สื่อเจตนาได้ชัดเจนกว่าและอาจถูกใช้โดยตัวให้คำแนะนำของ AOP

@Service
public class OrderService {
    private final OrderRepository repo;
    public OrderService(OrderRepository repo) { this.repo = repo; }
    public Order placeOrder(Cart cart) { /* business logic */ return repo.save(new Order(cart)); }
}

@Repository: ชั้นการเข้าถึงข้อมูล

@Repository ใช้ระบุคลาส DAO Spring จะเพิ่มการแปลงข้อยกเว้นด้านการคงอยู่โดยอัตโนมัติ โดยห่อ SQLException และข้อยกเว้นเฉพาะของผู้จำหน่ายไว้ในลำดับชั้น DataAccessException ของ Spring

@Repository
public class JdbcUserRepository {
    private final JdbcTemplate jdbc;
    public JdbcUserRepository(JdbcTemplate jdbc) { this.jdbc = jdbc; }
    public User findById(long id) {
        return jdbc.queryForObject("SELECT * FROM users WHERE id=?",
            new BeanPropertyRowMapper<>(User.class), id);
    }
}

@Bean ในคลาส @Configuration

ใช้ @Bean กับเมธอดภายในคลาส @Configuration เพื่อลงทะเบียนบีนด้วยตนเอง ซึ่งมีประโยชน์สำหรับคลาสจากบุคคลที่สามที่คุณไม่สามารถใส่คำอธิบายประกอบได้

@Configuration
public class AppConfig {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper().registerModule(new JavaTimeModule());
    }
    @Bean
    public RestTemplate restTemplate() { return new RestTemplate(); }
}

การสแกนคอมโพเนนต์

@SpringBootApplication จะเริ่มการสแกนคอมโพเนนต์จากแพ็กเกจของแอปพลิเคชันลงไปยังแพ็กเกจย่อย คลาสในแพ็กเกจย่อยจะถูกค้นพบโดยอัตโนมัติ ใช้ @ComponentScan(basePackages=...) เพื่อปรับแต่งการสแกน

// Explicit scan (rarely needed in Spring Boot):
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.example.shared"})
public class MyApp { ... }

การตั้งชื่อบีน

ตามค่าเริ่มต้น ชื่อบีนคือชื่อคลาสที่เปลี่ยนอักษรตัวแรกเป็นตัวพิมพ์เล็ก (OrderService → orderService) หากต้องการระบุชื่อแบบกำหนดเอง ให้ใช้ @Service("orders") หรือ @Bean("myMapper")

@Service("orderSvc")
public class OrderService { ... }
// Inject by name:
@Autowired @Qualifier("orderSvc")
private OrderService svc;

ขอบเขตของบีน

ขอบเขตเริ่มต้นคือ singleton (มีหนึ่งอินสแตนซ์ต่อบริบท Spring) ขอบเขตอื่น ได้แก่ prototype (สร้างอินสแตนซ์ใหม่ทุกครั้งที่ฉีด), request และ session (ใช้ได้เฉพาะเว็บ)

@Service
@Scope("prototype")
public class ReportBuilder {
    private List<String> lines = new ArrayList<>();
    public void addLine(String line) { lines.add(line); }
}

@Primary และ @Qualifier สำหรับแยกความกำกวม

เมื่อมีบีนหลายตัวที่ใช้อินเทอร์เฟซเดียวกัน ให้ใช้ @Primary เพื่อระบุค่าเริ่มต้น หรือใช้ @Qualifier("name") ที่จุดฉีดเพื่อเลือกบีนที่ต้องการโดยเฉพาะ

@Service @Primary
public class CacheUserService implements UserService { ... }
@Service
public class DbUserService implements UserService { ... }
// Inject specific one:
@Autowired @Qualifier("dbUserService")
private UserService userService;

การเริ่มต้นแบบเลื่อนเวลา

ตามค่าเริ่มต้น บีนแบบ singleton จะถูกสร้างขึ้นเมื่อเริ่มต้นระบบ ให้ใส่คำอธิบายประกอบ @Lazy เพื่อเลื่อนการสร้างจนกว่าจะมีการใช้งานครั้งแรก ซึ่งเหมาะสำหรับบีนที่ใช้ทรัพยากรมากและไม่ค่อยได้ใช้งาน

@Service @Lazy
public class HeavyReportService {
    public HeavyReportService() { System.out.println("Created on first use"); }
}

@PostConstruct และ @PreDestroy

เรียกใช้ตรรกะการเริ่มต้นหลังการฉีดการพึ่งพาด้วย @PostConstruct และทำความสะอาดทรัพยากรก่อนทำลายบีนด้วย @PreDestroy

@Service
public class CacheService {
    @PostConstruct
    public void init() { System.out.println("Cache warming up..."); }
    @PreDestroy
    public void cleanup() { System.out.println("Cache cleared."); }
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

@Repository เพิ่มพฤติกรรมใดจากที่ @Component มีอยู่

ทบทวน

ใช้ @Service สำหรับตรรกะทางธุรกิจ ใช้ @Repository สำหรับ DAO ใช้ @Component สำหรับยูทิลิตี และใช้ @Bean สำหรับชนิดข้อมูลจากบุคคลที่สาม ใช้ @Primary/@Qualifier เพื่อแก้ความกำกวมเมื่อมีบีนหลายตัว ใช้ @PostConstruct/@PreDestroy สำหรับจุดเชื่อมต่อในวงจรชีวิต

คำถามที่พบบ่อย

บทเรียน “การเชื่อมโยง Bean: @Component, @Service, @Repository” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเชื่อมโยง Bean: @Component, @Service, @Repository” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมโยง Bean: @Component, @Service, @Repository”

ใช้คำอธิบายประเภท stereotype กำหนด bean ด้วย @Bean และทำความเข้าใจการสแกนคอมโพเนนต์ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การเชื่อมโยง Bean: @Component, @Service, @Repository” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดค่าอัตโนมัติและตัวเริ่มต้น Spring Boot
  2. คุณสมบัติแอปพลิเคชันและโปรไฟล์
  3. การเชื่อมโยง Bean: @Component, @Service, @Repository
  4. การฉีดผ่านคอนสตรักเตอร์และดีเพนเดนซีแบบวนรอบ
← กลับไปที่ Java Academy