SPRING BOOT
Cách sử dụng Spring Scheduled trong Spring Boot Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java Hướng dẫn Upload file với Spring Boot trong Java Hướng dẫn download file với Spring Boot trong Java Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java Spring Boot là gì? Tại sao sử dụng Spring Boot trong Java Cài đặt Spring Boot trong Java, code một project Spring Boot cơ bản RESTful API là gì? Cách hoạt động của RESTful API trong Spring Boot RESTful API hoạt động qua giao thức HTTP như thế nào? CRUD đơn giản với RESTful API trong Spring Boot Java Các thuộc tính của Spring Boot trong Java Hướng dẫn sử dụng Thymeleaf và Spring Boot trong Java Hướng dẫn sử dụng FreeMarker với Spring Boot trong Java Hướng dẫn sử dụng JSP và Spring Boot trong Java Cách dùng Logging trong Spring Boot Kiến trúc 3layer trong Spring Boot là gì? Cách hoạt động thế nào? Hướng dẫn sử dụng Apache Tiles với Spring Boot trong Java Sử dụng nhiều ViewResolver trong Spring Boot Java Giới thiệu về Spring Boot Actuator trong ứng dụng Spring Boot Cách dùng Spring JDBC trong ứng dụng Spring Boot Java Spring Data JPA trong Spring Boot là gì? Spring Data JPA có gì hay? Tương tác giữa Spring Boot, JPA và cơ sở dữ liệu H2 Cách dùng Spring Email trong Spring Boot Sử dụng @bean trong ứng dụng Spring Boot Cách chuyển HTTP sang HTTPS trong Spring Boot Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền Cách triển khai Spring Boot trên Tomcat Server Sử dụng JUnit để tạo unit test trong Spring Boot Cách test RESTful API trong Spring Boot Tạo ứng dụng Chat với Spring Boot và Websocket Tạo trang web đa ngôn ngữ với Spring Boot trong Java Sử dụng Twitter Bootstrap trong Spring Boot Hướng dẫn sử dụng Interceptor trong Spring Boot Cách tạo Restful Client bằng RestTemplate trong Spring Boot Cách dùng Spring Boot và MongoDB trong Java Cách dùng Spring Boot và Mustache trong Java Cách dùng Groovy trong Spring Boot Java
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Sử dụng @bean trong ứng dụng Spring Boot

Trong Spring Boot, việc quản lý các đối tượng bean là rất quan trọng để đảm bảo tính linh hoạt và tái sử dụng code. Và để làm được điều đó, chúng ta cần hiểu rõ về @Bean và cách sử dụng nó trong Spring Boot.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Nếu bạn đang muốn tìm hiểu sâu hơn về @Bean và cách sử dụng nó trong Spring Boot, hãy cùng theo dõi bài viết này. Chúng tôi sẽ giải thích chi tiết về @Bean, các tính năng của nó và các trường hợp sử dụng trong Spring Boot.

1. Giới thiệu

bean jpg

Spring Ioc and Beans

Giới thiệu về Spring Boot và IoC Container

Các bạn có thể xem lại kiến thức về Spring Boot bài viết trước của chúng mình nhé!!

IoC Container là gì?

Bài viết này được đăng tại [free tuts .net]

Spring Boot được xây dựng trên nền tảng Spring Framework, một framework nổi tiếng và được sử dụng rộng rãi cho phát triển ứng dụng Java. Một trong những tính năng cốt lõi của Spring Framework là Inversion of Control (IoC) Container, là một container quản lý và cung cấp các đối tượng cho ứng dụng.

IoC Container là một mô hình thiết kế phần mềm, nơi điều khiển luồng của ứng dụng được chuyển sang một bên thứ ba (container), đảm bảo sự phân tách giữa các thành phần của ứng dụng và làm cho code dễ dàng bảo trì và kiểm thử hơn. Trong Spring Framework, IoC Container được cung cấp bởi một số module, trong đó có spring-context, đóng vai trò là trung tâm quản lý các đối tượng bean trong ứng dụng.

Với Spring Boot, IoC Container được tích hợp sẵn và có thể được sử dụng ngay mà không cần phải cấu hình nhiều. Chúng ta chỉ cần tạo các lớp bean (được đánh dấu bởi @Component, @Service, @Repository,...) và đăng ký chúng với container bằng cách sử dụng @Bean. Container sẽ tự động quản lý các dependency giữa các bean và cung cấp chúng cho ứng dụng.

Giới thiệu về @Bean

Khát quát:

@Bean là một annotation trong Spring Framework được sử dụng để đánh dấu một phương thức trả về một đối tượng nào đó là một bean, nghĩa là đối tượng được quản lý bởi IoC Container và được sử dụng trong ứng dụng.

Khi một phương thức được đánh dấu bởi @Bean, IoC Container sẽ gọi phương thức đó và sử dụng giá trị trả về của nó để đăng ký một bean trong container. Chúng ta có thể định nghĩa các dependency của bean bằng cách sử dụng các tham số trong phương thức @Bean, hoặc sử dụng @Autowired để inject các dependency vào bean.

Tính năng:

Tính năng quan trọng của @Bean là cung cấp một cách để tạo ra các đối tượng bean trong Spring Boot. Nó cho phép chúng ta đăng ký các đối tượng không được quản lý bởi Spring Framework (ví dụ như các đối tượng của bên thứ ba) và giúp chúng ta quản lý các dependency của các bean.

Ứng dụng:

Có nhiều ứng dụng của @Bean trong Spring Boot, chẳng hạn như:

  • Đăng ký các đối tượng bên thứ ba: Chúng ta có thể sử dụng @Bean để đăng ký các đối tượng không được quản lý bởi Spring Framework, chẳng hạn như các đối tượng của bên thứ ba hoặc các đối tượng được tạo ra bởi các thư viện khác.
  • Tạo các bean phức tạp: Nếu các đối tượng của chúng ta có các dependency phức tạp hoặc phải được tạo ra một cách động, chúng ta có thể sử dụng @Bean để tạo ra các đối tượng này. Điều này giúp chúng ta tách các phần khác nhau của ứng dụng của chúng ta và quản lý các dependency một cách hiệu quả.
  • Quản lý các dependency: Chúng ta có thể sử dụng các tham số của phương thức @Bean để inject các dependency vào bean. Điều này giúp chúng ta quản lý các dependency của các bean và giải quyết các vấn đề về phụ thuộc.
  • Tùy chỉnh cấu hình ứng dụng: Chúng ta có thể sử dụng @Bean để cấu hình các thành phần của ứng dụng của chúng ta, chẳng hạn như giao diện người dùng, trình quản lý cơ sở dữ liệu, hoặc các phần khác của ứng dụng.
  • Sử dụng các bean trong ứng dụng: Chúng ta có thể inject các bean vào các bean khác hoặc sử dụng chúng trong mã của chúng ta bằng cách sử dụng @Autowired.

2. Sử dụng @Bean trong Spring Boot

Cách đánh dấu một phương thức là một Spring Bean bằng @Bean

Bạn có thể đánh dấu một phương thức là một Spring Bean bằng cách sử dụng annotation @Bean.

Các bước để đánh dấu một phương thức là một Spring Bean như sau:

Bước 1: Tạo một class với phương thức muốn đăng ký làm Spring Bean.

Bước 2: Đánh dấu phương thức đó bằng annotation @Bean.

Ví dụ, nếu bạn có một phương thức tạo ra một đối tượng MyService, bạn có thể đăng ký nó làm Spring Bean bằng cách thêm annotation @Bean trước phương thức đó như sau:

@Configuration
public class MyConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

Trong đó, annotation @Configuration được sử dụng để đánh dấu lớp MyConfiguration là một cấu hình Spring. Phương thức myService() được đánh dấu là một Spring Bean bằng annotation @Bean. Khi ứng dụng của bạn chạy, Spring Boot sẽ tự động quét các cấu hình Spring để tìm các phương thức được đánh dấu là Spring Bean và đăng ký chúng để sử dụng.

Cách sử dụng @Bean để cấu hình các Bean và inject dependencies

Để dễ hiểu hơn thì mình sẽ hướng dẫn sử dụng @Bean để cấu hình các Bean và inject dependency tiếp tục ở ví dụ trên:

@Bean cũng có thể được sử dụng để inject các dependency vào các class khác, ví dụ:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyController myController(MyService myService) {
        return new MyController(myService);
    }
}

Ở đây, MyController được cấu hình bằng cách inject MyService vào nó thông qua constructor. Spring container sẽ tự động tìm và inject MyService vào MyController khi nó được khởi tạo.

Tóm lại, @Bean là một cách tiện lợi để cấu hình các bean và inject dependencies trong Spring Boot. Nó cho phép bạn tạo ra các đối tượng được quản lý bởi Spring container và sử dụng chúng trong ứng dụng của bạn.

3. Các trường hợp sử dụng @Bean trong Spring Boot

Sử dụng @Bean để cấu hình các DAO, Service, Controller, Connection, EntityManager, SessionFactory, DataSource, v.v.

Trong ứng dụng Spring Boot, bạn có thể sử dụng @Bean để cấu hình các DAO, Service, Controller, Connection, EntityManager, SessionFactory, DataSource và nhiều hơn nữa.

Cấu hình DAO và Service: Bạn có thể sử dụng @Bean để cấu hình các DAO và Service bằng cách định nghĩa các phương thức trả về đối tượng DAO và Service tương ứng.

Ví dụ:

@Configuration
public class AppConfig {
    
    @Bean
    public EmployeeDao employeeDao() {
        return new EmployeeDaoImpl();
    }

    @Bean
    public EmployeeService employeeService() {
        return new EmployeeServiceImpl(employeeDao());
    }
}

Giải thích: Ở đây, bạn đã định nghĩa phương thức employeeDao() trả về một đối tượng EmployeeDao được triển khai bởi EmployeeDaoImpl. Sau đó, phương thức employeeService() trả về một đối tượng EmployeeService được triển khai bởi EmployeeServiceImpl, trong đó sử dụng employeeDao() để inject vào.

Cấu hình Controller: Bạn có thể sử dụng @Bean để cấu hình một đối tượng Controller bằng cách định nghĩa một phương thức trả về đối tượng Controller tương ứng.

Ví dụ:

@Configuration
public class AppConfig {
    
    @Bean
    public EmployeeController employeeController() {
        return new EmployeeController(employeeService());
    }
}

Giải thích: Ở đây, bạn đã định nghĩa phương thức employeeController() trả về một đối tượng EmployeeController, trong đó sử dụng employeeService() để inject vào.

Cấu hình Connection, EntityManager, SessionFactory và DataSource: Bạn có thể sử dụng @Bean để cấu hình các đối tượng Connection, EntityManager, SessionFactory và DataSource bằng cách sử dụng các thư viện hỗ trợ của Spring Boot, chẳng hạn như HikariCP hoặc Tomcat JDBC Connection Pool.

Ví dụ:

@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("com.example.myapp");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }
}

Giải thích: Ở đây, phương thức dataSource() trả về một đối tượng DataSource được cấu hình bằng HikariCP, với thông tin kết nối đến cơ sở dữ liệu MySQL được định nghĩa bên trong. Phương thức entityManagerFactory() trả về một đối tượng LocalContainerEntityManagerFactoryBean được cấu hình để sử dụng dataSource() và scan package com.example.myapp để tìm các entity trong ứng dụng. Cuối cùng, phương thức transactionManager() trả về một đối tượng JpaTransactionManager được cấu hình để sử dụng entityManagerFactory().

Sử dụng @Bean để cấu hình các tham số, tài nguyên và các dependencies khác

Ngoài việc sử dụng @Bean để cấu hình các DAO, Service, Controller, Connection, EntityManager, SessionFactory, DataSource, bạn cũng có thể sử dụng nó để cấu hình các tham số, tài nguyên và các dependencies khác trong ứng dụng Spring Boot.

Sau đây là một số ví dụ cơ bản:

Cấu hình các tham số:

Bạn có thể sử dụng @Value để inject giá trị của một tham số từ file cấu hình application.properties hoặc application.yml vào trong một Bean, ví dụ như sau:

@Configuration
public class AppConfig {

    @Value("${myapp.name}")
    private String appName;

    @Value("${myapp.version}")
    private String appVersion;

    @Bean
    public MyBean myBean() {
        MyBean myBean = new MyBean();
        myBean.setAppName(appName);
        myBean.setAppVersion(appVersion);
        return myBean;
    }
}

Giải thích: Ở đây, các giá trị của myapp.namemyapp.version được định nghĩa trong file application.properties hoặc application.yml và được inject vào trong Bean MyBean thông qua phương thức myBean().

Cấu hình các tài nguyên:

Bạn có thể sử dụng các phương thức của class ResourceLoader để load các tài nguyên như file, URL, classpath, và sử dụng các tài nguyên này trong ứng dụng Spring Boot. Ví dụ:

@Configuration
public class AppConfig {

    @Autowired
    private ResourceLoader resourceLoader;

    @Bean
    public MyResource myResource() throws IOException {
        Resource resource = resourceLoader.getResource("classpath:myresource.txt");
        InputStream inputStream = resource.getInputStream();
        String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
        MyResource myResource = new MyResource();
        myResource.setContent(content);
        return myResource;
    }
}

Ở đây, phương thức myResource() sử dụng ResourceLoader để load tài nguyên myresource.txt trong classpath và đọc nội dung của tài nguyên này để set vào trong đối tượng MyResource.

Cấu hình các dependencies khác:

Bạn có thể sử dụng @Autowired để inject các dependencies khác vào trong một Bean. Ví dụ:

@Configuration
public class AppConfig {

    @Autowired
    private MyOtherBean myOtherBean;

    @Bean
    public MyBean myBean() {
        MyBean myBean = new MyBean();
        myBean.setOtherBean(myOtherBean);
        return myBean;
    }
}

Ở đây, phương thức myBean() inject đối tượng MyOtherBean vào trong đối tượng MyBean thông qua thuộc tính myOtherBean được inject bằng @Autowired.

Tóm lại, sử dụng @Bean để cấu hình các tham số, tài nguyên và các dependencies khác trong ứng dụng Spring Boot rất linh hoạt và tiện lợi. Bạn chỉ cần định nghĩa các Bean và inject chúng vào trong các đối tượng khác để có thể sử dụng các tính năng và chức năng của chúng trong ứng dụng của mình.

Lưu ý: Nếu bạn sử dụng quá nhiều @Bean có thể làm cho file cấu hình của bạn trở nên phức tạp và khó quản lý. Vì vậy, hãy sử dụng @Bean một cách hợp lý và tối ưu để giữ cho ứng dụng của bạn dễ bảo trì và phát triển.

4. Các câu hỏi thường gặp

Làm thế nào để inject một Bean vào một Bean khác trong ứng dụng Spring Boot?

Để inject một Bean vào một Bean khác trong ứng dụng Spring Boot, bạn có thể sử dụng annotation @Autowired hoặc đặt một tham chiếu đến Bean đó vào constructor, setter hoặc trực tiếp vào thuộc tính của Bean.

Làm thế nào để cấu hình một Bean với tham số trong ứng dụng Spring Boot?

Để cấu hình một Bean với tham số trong ứng dụng Spring Boot, bạn có thể sử dụng annotation @Value để inject giá trị của một tham số từ file cấu hình application.properties hoặc application.yml vào trong một Bean.

Làm thế nào để cấu hình một Bean với các tài nguyên khác, ví dụ như file hoặc URL, trong ứng dụng Spring Boot?

Để cấu hình một Bean với các tài nguyên khác, bạn có thể sử dụng các phương thức của class ResourceLoader để load các tài nguyên như file, URL, classpath, và sử dụng các tài nguyên này trong ứng dụng Spring Boot.

Nếu tôi có nhiều Bean cùng loại, làm thế nào để tôi chọn Bean cần sử dụng?

Bạn có thể sử dụng annotation @Qualifier để chọn Bean cần sử dụng bằng cách đặt tên định danh cho các Bean. Sau đó, bạn có thể sử dụng @Qualifier để chọn Bean với tên định danh tương ứng.

5. Kết bài viết

Như vậy, qua bài viết này, chúng ta đã có cái nhìn tổng quan về cách sử dụng annotation @Bean trong ứng dụng Spring Boot. Cùng với các ví dụ và hướng dẫn chi tiết, chúng ta có thể dễ dàng cấu hình các đối tượng, tài nguyên và dependencies trong ứng dụng của mình. Hy vọng bài viết sẽ giúp ích cho các bạn đang làm việc với Spring Boot.

Cùng chuyên mục:

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn Upload file với Spring Boot trong Java

Hướng dẫn Upload file với Spring Boot trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Cách sử dụng Spring  Scheduled trong Spring Boot

Cách sử dụng Spring Scheduled trong Spring Boot

Cách dùng Groovy trong Spring Boot Java

Cách dùng Groovy trong Spring Boot Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo ứng dụng Chat với Spring Boot và Websocket

Tạo ứng dụng Chat với Spring Boot và Websocket

Sử dụng JUnit để tạo unit test trong Spring Boot

Sử dụng JUnit để tạo unit test trong Spring Boot

Cách triển khai Spring Boot trên Tomcat Server

Cách triển khai Spring Boot trên Tomcat Server

Cách test RESTful API trong Spring Boot

Cách test RESTful API trong Spring Boot

Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền

Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Top