目录
1. Bean的生命周期与作用域管理
Spring的强大之处在于其对对象(Bean)生命周期的精细管理能力,使得资源使用更为高效。
单例作用域Bean的生命周期
在Spring中,默认的作用域是单例(singleton)。以下代码展示了如何通过注解定义一个单例作用域的Bean,并通过生命周期注解标记初始化和销毁时执行的方法。
@Repository
@Scope("singleton") // 明确标识作用域为单例
public class BookRepository {
public BookRepository() {
System.out.println("创建BookRepository实例");
}
@PostConstruct
public void init() {
// 初始化方法,数据库连接等操作可以在此执行
System.out.println("BookRepository 初始化");
}
@PreDestroy
public void cleanup() {
// 清理方法,断开数据库连接等清理操作在此执行
System.out.println("BookRepository 清理");
}
}
2. 外部属性配置
Spring允许从外部属性文件动态加载配置,简化了代码与配置的分离,增加了应用的灵活性。
加载外部配置文件
Spring可以通过@PropertySource
注解指定配置文件的位置,然后通过@Value
注解将配置文件的值注入到Bean的属性中。
@Configuration
@PropertySource("classpath:config.properties") // 指定外部配置文件
public class AppConfig {
@Value("${app.name}") // 从配置文件读取app.name属性值
private String appName;
@Bean
public AppInfo appInfo() {
AppInfo appInfo = new AppInfo();
appInfo.setName(appName);
return appInfo;
}
}
3. 依赖注入(DI)
依赖注入是Spring框架的核心功能,它降低了组件间的耦合度。
构造器注入
通过构造器注入,Spring在创建Bean时自动注入必要的依赖。
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // 通过构造器注入UserRepository
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void addUser(User user) {
userRepository.save(user);
}
}
4. 注解驱动的开发
注解简化了配置,提高了开发效率和代码的可读性。
组件扫描
Spring通过@ComponentScan
注解自动寻找和注册Bean,避免了手动配置。
@Configuration
@ComponentScan(basePackages = "com.example.app") // 自动扫描com.example.app包下的@Component注解类
public class SpringConfig {
}
5. 整合第三方库
Spring的开放性允许它轻松整合第三方库,如数据库连接池、消息队列等。
配置数据源
以下示例展示了如何配置一个连接池数据源:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/springdb");
ds.setUsername("root");
ds.setPassword("password");
return ds;
}
}
6. 与MyBatis的整合
Spring与MyBatis的整合为数据访问层提供了强大的支持。
配置SqlSessionFactory
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}