熟悉并使用Spring框架 - 注解篇

文章目录

前言

上次我们聊了Spring的XML配置,今天来看看注解配置。说实话,注解配置真的比XML方便太多了,代码更简洁,维护也更容易。现在大部分项目都在用注解,所以这个必须得掌握。

什么是Spring注解配置

简单来说,就是用注解来告诉Spring哪些类是Bean,如何进行依赖注入。不用写那么多XML了,直接在Java代码上加注解就行。

开启注解支持

首先需要告诉Spring使用注解。如果你还在用XML文件,加上这一行:

xml 复制代码
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.coldscholor"/>

当然,更简单的方式是用Java配置类:

java 复制代码
@Configuration
@ComponentScan("com.coldscholor")
public class AppConfig {
    
}

常用的Bean定义注解

@Component

这是最基本的Bean定义注解:

java 复制代码
@Component
public class UserService {
    public void sayHello() {
        System.out.println("Hello from UserService");
    }
}

除了@Component,还有几个更具体的:

java 复制代码
@Service  // 业务层
public class OrderService {
    public void processOrder() {
        System.out.println("处理订单");
    }
}

@Repository  // 数据访问层
public class UserDao {
    public void saveUser() {
        System.out.println("保存用户");
    }
}

@Controller  // 控制层
public class UserController {
    public void handleRequest() {
        System.out.println("处理请求");
    }
}

其实功能上都一样,只是这三个注解用于分层架构更规范。

Bean的命名

默认情况下,Bean的名字就是类名首字母小写:

java 复制代码
@Component  // Bean名称为 userService
public class UserService {
}

@Component("myUserService")  // 自定义Bean名称
public class UserService {
}

依赖注入注解

@Autowired

可以用在字段上:

java 复制代码
@Service
public class OrderService {
    @Autowired
    private UserService userService;
    
    public void createOrder() {
        userService.sayHello();
    }
}

也可以用在构造器上:

java 复制代码
@Service
public class OrderService {
    private UserService userService;
    
    @Autowired
    public OrderService(UserService userService) {
        this.userService = userService;
    }
}

还可以用在setter方法上:

java 复制代码
@Service
public class OrderService {
    private UserService userService;
    
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

@Resource

java 复制代码
@Service
public class OrderService {
    @Resource(name = "userService")
    private UserService userService;
}

@Qualifier

当有多个同类型的Bean时:

java 复制代码
@Service("emailService")
public class EmailNotificationService implements NotificationService {
    // 邮件通知实现
}

@Service("smsService") 
public class SmsNotificationService implements NotificationService {
    // 短信通知实现
}

@Controller
public class NotificationController {
    @Autowired
    @Qualifier("emailService")
    private NotificationService notificationService;
}

Bean的作用域

用@Scope注解来指定:

java 复制代码
@Component
@Scope("singleton")  // 单例,这是默认的
public class SingletonBean {
}

@Component
@Scope("prototype")  // 原型,每次获取都创建新的
public class PrototypeBean {
}

配置类的使用

@Configuration

java 复制代码
@Configuration
public class DatabaseConfig {
    
    @Bean
    public DataSource dataSource() {
        // 创建数据源
        return new HikariDataSource();
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

@Value

java 复制代码
@Component
public class DatabaseService {
    @Value("${database.url}")
    private String databaseUrl;
    
    @Value("${database.timeout:30}")  
    private int timeout;
}

需要配合properties文件使用:

java 复制代码
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
}

application.properties文件:

properties 复制代码
database.url=jdbc:mysql://localhost:3306/test
database.timeout=60

完整示例

java 复制代码
// 1. 配置类
@Configuration
@ComponentScan("com.coldscholor")
@PropertySource("classpath:application.properties")
public class AppConfig {
}

// 2. Service层
@Service
public class UserService {
    @Value("${app.name}")
    private String appName;
    
    public void welcome(String name) {
        System.out.println("欢迎 " + name + " 使用 " + appName);
    }
}

// 3. Controller层
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    
    public void handleUser(String userName) {
        userService.welcome(userName);
    }
}

// 4. 启动类
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        
        UserController controller = context.getBean(UserController.class);
        controller.handleUser("张三");
        
        ((AnnotationConfigApplicationContext) context).close();
    }
}

application.properties:

properties 复制代码
app.name=我的Spring应用

小结

注解配置是现在Spring开发的主流方式,相比XML配置更加简洁直观。优点在于代码更简洁,配置和使用Bean简单,它的核心就是几个注解:

  • @Component及其子注解用于定义Bean
  • @Autowired用于依赖注入
  • @Configuration用于配置类
  • @Value用于注入配置值
相关推荐
我星期八休息20 分钟前
C++智能指针全面解析:原理、使用场景与最佳实践
java·大数据·开发语言·jvm·c++·人工智能·python
摇滚侠20 分钟前
Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
java·spring boot·笔记
大猫会长24 分钟前
docker安装php+apache
java·开发语言
野生技术架构师27 分钟前
JAVA 架构师面试题含答案:JVM+spring+ 分布式 + 并发编程
java·jvm·spring
瑞士卷@39 分钟前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis
梵得儿SHI1 小时前
Java 反射机制深度剖析:性能与安全性的那些坑
java·开发语言·安全·反射·动态代理·性能·反射机制
虫小宝1 小时前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php0071 小时前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper
唐僧洗头爱飘柔95271 小时前
【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置
spring·spring cloud·架构·gateway·请求转发·服务降级·服务雪崩
4Forsee1 小时前
【Android】浅析 Android 的 IPC 跨进程通信机制
android·java