Spring 标准化注解 @Controller

发布于 2024-12-17 23:31:47 字数 4601 浏览 5 评论 0

Spring 提供了几个标准化的注解来标注由 Spring 管理的 Bean:

  • @Service :用于标注业务层(服务层,具体业务逻辑)组件
  • @Controller :用于标注控制层(表示层,如何展示数据)组件
  • @Repository :用于标注数据访问(持久性层,实际获取/保存数据)组件
  • @Component :泛指组件,当组件不好归类时使用

上面四个注解都可以指定其逻辑组件的名称( value ),否则使用 Spring Bean 默认命令约定( java.beans.Introspector.decapitalize ):

  • 本质上,就是接受简单的类名并将其初始字符转换为小写
  • 在特殊情况下,当有多个字符并且第一个和第二个字符都是大写时,保留原始大小写

而标注配置类,则使用 @Bean@Configuration 注解。

示例

下面我们以 JOOQ 基础使用 一文件中的项目为例,将其改为 Spring 项目。

提取数据连接池配置:

package net.wuxianjie.demo.spring;

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DbConfig {

  @Bean
  public PoolProperties poolProperties() {

    return new PoolProperties() {{
      setUrl("jdbc:mysql://localhost:3306/test");
      setDriverClassName("com.mysql.cj.jdbc.Driver");
      setUsername("root");
      setPassword("root123");
      setMinIdle(5); // 始终保持连接的最小连接数,默认 10
      setInitialSize(5); // 池启动时创建的初始连接数,默认 10
      setMaxIdle(10); // 始终应保持在池中的最大连接数,默认 100
      setTestOnBorrow(true); // 指示是否在从池借用对象之前对其进行验证,默认 false
      setMaxActive(20); // 可以同时从该池分配的最大活动连接数,默认 100
    }};
  }

  @Bean
  public Connection getConnection() throws SQLException {

    DataSource dataSource = new DataSource();
    dataSource.setPoolProperties(poolProperties());
    return dataSource.getConnection();
  }

  @Bean
  public DSLContext dslContext () throws SQLException {

    return DSL.using(getConnection(), SQLDialect.MYSQL);
  }
}

持久化层:

package net.wuxianjie.demo.spring;

import static net.wuxianjie.demo.db.generated.Tables.USER_COIN;

import net.wuxianjie.demo.db.generated.tables.records.UserCoinRecord;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {

  @Autowired
  private DSLContext dslContext;

  public UserCoinRecord selectUserCoinByName(String userName) {

    Record record = dslContext.select()
      .from(USER_COIN)
      .where(USER_COIN.USER_NAME.eq(userName))
      .fetchOne();

    if (record != null)
      return record.into(UserCoinRecord.class);

    return null;
  }
}

业务逻辑层:

package net.wuxianjie.demo.spring;

import net.wuxianjie.demo.db.generated.tables.records.UserCoinRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

  @Autowired
  private UserRepository userRepository;

  public int getUserCoin(String nameUser) {

    UserCoinRecord userCoinRecord = userRepository.selectUserCoinByName(nameUser);

    if (userCoinRecord == null)
      return -1;

    return userCoinRecord.getCoin();
  }
}

数据展示层:

package net.wuxianjie.demo.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller("uc")
public class UserController {

  @Autowired
  private UserService userService;

  public void showUserInfo(String userName) {

    int userCoin = userService.getUserCoin(userName);

    String message;
    if (userCoin < 0)
      message = "不存在" + userName;
    else if (userCoin == 0)
      message = userName + "没有钱";
    else
      message = userName + "拥有虚拟币:" + userCoin;

    System.out.println(message);
  }
}

初始化 Spring IoC 容器,并调用控制层:

package net.wuxianjie.demo.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpring {

  public static void main(String[] args) throws Exception {

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    applicationContext.scan("net.wuxianjie.demo.spring");
    applicationContext.refresh();

    UserController userController = applicationContext.getBean("uc", UserController.class);
    userController.showUserInfo("张三");
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

挽清梦

暂无简介

文章
评论
598 人气
更多

推荐作者

alipaysp_qCPZes5aGh

文章 0 评论 0

BeginEnd

文章 0 评论 0

温柔一刀

文章 0 评论 0

qq_eW9dqv

文章 0 评论 0

cz003

文章 0 评论 0

mb_y5iXe1gw

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文