在 Spring Framework 中,@Bean 注解通常用于告诉 Spring 容器如何实例化和配置一个特定的 bean。
一、什么时候使用 @Bean
1.自定义实例化逻辑
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// 创建一个自定义的bean实例
MyBean bean = new MyBean();
// 添加自定义的实例化逻辑
//我们可以在这里对bean进行任何必要的初始化操作
return bean;
}
}
在这个例子中,AppConfig类被标记为@Configuration,表示它是一个配置类。myBean方法被标记为@Bean,表示它会在Spring容器中定义一个名为"myBean"的bean。在myBean方法中,可以创建MyBean对象并执行任何必要的自定义实例化逻辑。
2.引入第三方库或外部组件
/**
* MybatisPlus的分页插件
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
3.修改第三方库的配置
下面展示如何使用@Bean来修改,Druid连接池的默认配置
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidDataSourceConfig {
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
// 设置数据库连接相关属性
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("username");
dataSource.setPassword("password");
// 修改Druid连接池的配置
dataSource.setMaxActive(20); // 设置最大活跃连接数
dataSource.setInitialSize(5); // 设置初始连接数
dataSource.setMinIdle(5); // 设置最小空闲连接数
dataSource.setMaxWait(60000); // 设置获取连接的最大等待时间
// 设置其他属性...
return dataSource;
}
}
上面的例子,创建了一个DruidDataSourceConfig配置类,并声明了一个名为dataSource的@Bean方法,返回一个DruidDataSource实例。在方法中,我们设置了数据库连接的URL、用户名和密码。然后,通过调用dataSource.setMaxActive()、dataSource.setInitialSize()等方法,修改了Druid连接池的默认配置。
二、什么时候不使用 @Bean
1.组件扫描
对于标记有 @Component、@Service、@Repository 或 @Controller 等注解的类,Spring 会自动进行组件扫描并注册它们,并将其实例化为 bean,不需要额外使用 @Bean。
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
import org.springframework.stereotype.Service;
@Service
public class MyService {
public String doSomething() {
return "Something done";
}
}
2.通过构造函数注入依赖
如果 bean 的依赖通过构造函数注入,并且这些依赖已经在容器中有了相应的配置,则不需要显式地使用 @Bean。(主要记住上面组件扫描)
@Service
public class MyService {
private final Dependency dependency;
public MyService(Dependency dependency) {
this.dependency = dependency;
}
}