Spring 标准化注解 @Controller
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论