目录
前言
前面定义
bean
的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar
包中,我们没有办法在类上面添加注解,这个时候该怎么办
?
遇到上述问题,我们就需要有一种更加灵活的方式来定义bean,
这种方式不能在原始代码上面书写注解,一样能定义bean,
这就用到了一个全新的注解
@Bean
。
环境准备
- 创建一个Maven项目
- pom.xml添加Spring的依赖
- 添加一个配置类SpringConfig
- 添加BookDao、BookDaoImpl类
注解开发管理第三方bean
步骤一:导入对用jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
步骤二:在配置类中添加一个方法
@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/db1");
ds.setUsername("root");
ds.setPassword("123465");
return ds;
}
}
注意:这个Mysql中的数据库是我们提前创建的,你们运行时也需要自己创建一个数据库以及对应的表
步骤三:在该方法上添加@Bean注解
@Bean注解的作用是将方法的返回值制作为Spring管理的一个bean对象
@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/db1");
ds.setUsername("root");
ds.setPassword("123465");
return ds;
}
}
注意
:
不能使用
DataSource ds = new DruidDataSource()
因为DataSource接口中没有对应的setter方法来设置属性
步骤四:从IOC容器中获取对象并打印
public class Test {
public static void main(String[] args) {
加载配置类初始化容器
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource);
}
}
引入外部配置类
如果把所有的第三方
bean
都配置到
Spring
的配置类
SpringConfig
中,虽然可以,但是不利于代码阅
读和分类管理,所有我们就想能不能按照类别将这些
bean
配置到不同的配置类中
?
对于数据源的
bean,
我们新建一个
JdbcConfig
配置类,并把数据源配置到该类下。
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/db1");
ds.setUsername("root");
ds.setPassword("123465");
return ds;
}
}
让这个配置类能够被Spring配置类加载到,并创建DataSource对象在IOC容器中,有两种方法
使用包扫描引入外部配置类
步骤
1:
在
Spring
的配置类上添加包扫描
@Configuration
@PropertySource("jdbc.properties")
@ComponentScan("com.itheima.config")
public class SpringConfig {
}
步骤
2:
在
JdbcConfig
上添加配置注解
把JdbcConfig
类放入到
com.itheima.config
包下,被
Spring
配置类扫描到即可
@Configuration
public class JdbcConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/db1");
ds.setUsername("root");
ds.setPassword("123465");
return ds;
}
}
步骤
3:
运行程序
注意:这种方法虽然可以使Spring配置类扫描到外部配置类,故第一种方法不推荐使用
使用@import引入实现外部配置类
这种方案可以不用加
@Configuration
注解,但是必须在
Spring
配置类上使用
@Import
注解手动引入
需要加载的配置类
步骤一:在Spring配置类中引入
@Configuration
//@ComponentScan("com.itheima.config")
@Import({JdbcConfig.class})
public class SpringConfig {
}
注意:
- 扫描注解可以移除
- @Import参数需要的是一个数组,可以引入多个配置类。
- @Import注解在配置类中只能写一次,下面的方式是不允许的
如:
@Configuration
//@ComponentScan("com.itheima.config")
@Import({JdbcConfig.class})
@Import({xxx.class})
public class SpringConfig {
}
小结
在配置类环境下,注解开发管理第三方bean实现。
- 导入对应的jar包
- 在配置类中添加一个方法
- 在方法上添加@Bean注解
- 从IOC容器中获取对象并打印
引入外部配置类
- 使用包扫描引入
- 使用@Import引入(推荐)