非自定义Bean不能像自定义Bean一样使用 @Component 进行管理,非自定义Bean要通过工厂的方式进行实例化,使用 @Bean 标注方法即可,@Bean 的属性为 beanName ,如不指定为当前工厂方法名称
PS:工厂方法所在类必须要被 Spring 管理
// 将方法返回值 Bean 实例以 @Bean 注解指定的名称存储到 Spring 容器中
@Bean("dataSource")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
// 设置4个基本参数
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
如果 @Bean 工厂方法需要参数的话,则有如下几种注入方式:
- 使用 @Autowired 根据类型自动进行Bean的匹配,@Autowired 可以省略
- 使用 @Qualifier 根据名称进行Bean的匹配;
- 使用 @Value 根据名称进行普通数据类型匹配。
@Bean
@Autowired // 根据类型匹配参数
public Object objectDemo01(UserDao userDao) {
System. out .println(userDao);
return new Object();
}
@Bean
public Object objectDemo02(@Qualifier("userDao") UserDao userDao,
@Value("${jdbc. username}") String userName) {
System. out .println(userDao);
System. out .println(userName);
return new Object();
}