文章目录
前言
上次我们聊了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用于注入配置值