0.图文解析
1.@Configuration
使用方法:直接放在Spring核心配置类的上边
//标志该类是Spring的核心配置类
@Configuration
public class SpringConfiguration {
}
2.@ComponentScan
使用方法:直接放到需要扫描的类的上边,扫描该类的组件(注解)
//标志该类是Spring的核心配置类
@Configuration
//组件扫描,相当于xml中的<context:component-scan base-package="com.jd"></context:component-scan>
@ComponentScan("com.jd")
public class SpringConfiguration {
}
3.@Bean
使用方法:放在方法的上边
解析:Spring会将当前方法的返回值存储到Spring容器中,相当于xml中的bean标签创建类对象
//标志该类是Spring的核心配置类
@Configuration
//组件扫描
@ComponentScan("com.jd")//相当于xml中的<context:component-scan base-package="com.jd"></context:component-scan>
public class SpringConfiguration {
@Bean("dataSource")//Spring会将当前方法的返回值存储到Spring容器中
public DataSource getDataSource() throws Exception{
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
return dataSource;
}
}
4.@PropertySource
创建数据源的配置参数与Spring核心配置文件相耦合,需要解耦,即将数据源的配置参数抽离到数据源配置文件中。
- 创建数据源配置文件jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
2.在Spring核心配置类中导入jdbc.properties
//标志该类是Spring的核心配置类
@Configuration
//组件扫描
@ComponentScan("com.jd")//相当于xml中的<context:component-scan base-package="com.jd"></context:component-scan>
@PropertySource("jdbc.properties")//导入外部properties文件,相当于xml中的<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
public class SpringConfiguration {
@Bean("dataSource")//Spring会将当前方法的返回值存储到Spring容器中
public DataSource getDataSource() throws Exception{
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
return dataSource;
}
}
- 替换配置
假如像xml中分离jdbc.properties文件那样,利用$ 进行分离,有如下代码
//标志该类是Spring的核心配置类
@Configuration
//组件扫描
@ComponentScan("com.jd")//相当于xml中的<context:component-scan base-package="com.jd"></context:component-scan>
@PropertySource("jdbc.properties")//导入外部properties文件,相当于xml中的<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
public class SpringConfiguration {
@Bean("dataSource")//Spring会将当前方法的返回值存储到Spring容器中
public DataSource getDataSource() throws Exception{
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接参数
dataSource.setDriverClass("${jdbc.driverClassName}");
dataSource.setJdbcUrl("${jdbc.url}");
dataSource.setUser("${jdbc.username}");
dataSource.setPassword("${jdbc.password}");
return dataSource;
}
}
但是此时,因为是在java文件中,即使导入了jdbc.properties文件,但是$ 符号也不能匹配到properties文件中key。即在java文件中,$失效
解决方法:可以利用原始注解中的@Value,有如下代码
//标志该类是Spring的核心配置类
@Configuration
//组件扫描
@ComponentScan("com.jd")//相当于xml中的<context:component-scan base-package="com.jd"></context:component-scan>
//导入外部properties文件,相当于xml中的<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
@PropertySource("jdbc.properties")
public class SpringConfiguration {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.jdbc.url}")
private String url;
@Value("${jdbc.userName}")
private String userName;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource")//Spring会将当前方法的返回值存储到Spring容器中
public DataSource getDataSource() throws Exception{
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接参数
dataSource.setDriverClass(driverClassName);
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
return dataSource;
}
}
图文解析
5.Import
1.现在在核心配置类SpringConfiguration中耦合了原本属于数据源配置的代码,需要消除耦合,分离配置文件,需要创建DataSourceConfiguration(即数据源配置文件)
2.将于数据源相关的配置转移到DataSourceConfiguration中,得到如下类
//导入外部properties文件,相当于xml中的<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
@PropertySource("jdbc.properties")
public class DataSourceConfiguration {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.jdbc.url}")
private String url;
@Value("${jdbc.userName}")
private String userName;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource")//Spring会将当前方法的返回值存储到Spring容器中
public DataSource getDataSource() throws Exception{
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置连接参数
dataSource.setDriverClass(driverClassName);
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
return dataSource;
}
}
图文解析
3.利用@Import在SpringConfiguration中导入DataSourceConfiguration
@Import(DataSourceConfiguration.class)
public class SpringConfiguration {
}
补充:如果要导入多个配置类(假设它们的类名为a,b,c,d,共四个配置类),要如下格式
@Import({a.class,b.class,c.class,d.class})//导入多个配置类
6.核心配置文件类对象的获取
public class UserController {
public static void main(String[] args) {
//ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = (UserService) app.getBean("userService");
userService.save();
}
}
图文解析