การเชื่อมโยง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดค่าอัตโนมัติและตัวเริ่มต้น Spring Boot
- คุณสมบัติแอปพลิเคชันและโปรไฟล์
- การเชื่อมโยง Bean: @Component, @Service, @Repository
- การฉีดผ่านคอนสตรักเตอร์และดีเพนเดนซีแบบวนรอบ