开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
目录
一、第三方bean管理
使用@bean配置第三方bean
@Configuration
public class SpringConfig {
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
}
使用独立的配置类管理第三方bean
public class JdbcConfig {
//@Bean修饰的方法,形参根据类型自动装配
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
}
将独立的配置类加入核心配置
方式一:导入式
public class JdbcConfig {
//@Bean修饰的方法,形参根据类型自动装配
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
//相关配置
return ds;
}
}
使用 @Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
@Configuration
//@Import:导入配置信息
@Import({JdbcConfig.class})
public class SpringConfig {
}
将独立的配置类加入核心配置
方式二:扫描式
@Configuration
public class JdbcConfig {
@Bean
public DataSource dataSource(BookDao bookDao){
DruidDataSource ds = new DruidDataSource();
//相关配置
return ds;
}
}
使用 @ComponentScan注解扫描配置类所在的包,加载对应的配置类信息
@Configuration
@ComponentScan("com.itheima.config","com.itheima.service","com.itheima.dao")
public class SpringConfig {
}
不推荐使用扫描式进行管理,隐藏性太强,不利于后期管理。
二、第三方bean依赖注入
简单类型依赖注入
public class JdbcConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("root")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(password);
return ds;
}
}
引用类型依赖注入
@Bean
public DataSource dataSource(BookService bookService){
System.out.println(bookService);
DruidDataSource ds = new DruidDataSource();
//属性设置
return ds;
}
引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象。
四、XML配置比对注解配置
| 功能 | XML配置 | 注解 |
| 定义bean | bean标签● id属性● class属性 | @Component● @Controller● @Service● @Repository**@ComponentScan** |
| 设置依赖注入 | setter注入(set方法)● 引用/简单构造器注入(构造方法)● 引用/简单自动装配 | @Autowired● @Qualifier@Value |
| 配置第三方bean | bean标签静态工厂、实例工厂、FactoryBean | @Bean |
| 作用范围 | ● scope属性 | @Scope |
| 生命周期 | 标准接口● init-method● destroy-method | @PostConstructor@PreDestroy |
红色标注部分经常写。
五、Spring整合Mybatis思路分析
MyBatis程序核心对象分析:
初始化SqlSessionFactory
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml.bak");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
获取连接,获取实现
// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果User
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
获取数据层接口
Account ac = accountDao.findById(2);
System.out.println(ac);
关闭连接
// 6. 释放资源
sqlSession.close();
整合MyBatis分析:
初始化属性数据
<configuration>
<properties resource="jdbc.properties"></properties>
初始化类型别名
<typeAliases>
<package name="com.itheima.domain"/>
</typeAliases>
初始化dataSource
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
初始化映射配置
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
</configuration>
六、Spring整合Mybatis
导入Spring整合Mybatis相关的坐标
<!--spring操作数据库有关的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!--mybatis与spring整合用的坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
SpringConfig配置类:
@Configuration
@ComponentScan("com.itheima")
//@PropertySource:加载类路径jdbc.properties文件
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}
整合MyBatis要有两个bean需要配置:
SqlSessionFactoryBean
MapperScannerConfigurer
整合MyBatis的MybatisConfig配置类:
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MybatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
整合图例:
七、Spring整合JUnit
导入spring整合junit用的坐标
<!--junit坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring整合junit用的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
AccountServiceTest测试类:
使用Spring整合Junit专用的类加载器
import com.itheima.config.SpringConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
//支持自动装配注入bean
@Autowired
private AccountService accountService;
@Test
public void testFindById(){
System.out.println(accountService.findById(1));
}
@Test
public void testFindAll(){
System.out.println(accountService.findAll());
}
}